知识图谱学习笔记-非结构化数据处理
非結(jié)構(gòu)話數(shù)據(jù)到知識(shí)圖譜
非結(jié)構(gòu)數(shù)據(jù)-> 信息抽取(命名實(shí)體識(shí)別、關(guān)系抽取)-> 圖譜構(gòu)建(實(shí)體消歧、鏈接預(yù)測)-> 圖分析算法
一、文本分析關(guān)鍵技術(shù)
- 拼寫糾錯(cuò)
- 分詞
- 詞干提取
- 詞的過濾?
- 文本的表示
- 文本相似度
- 詞向量
- 句子向量
- 實(shí)體命名識(shí)別
二、拼寫糾錯(cuò)
?input -> correction
? 天起 -> 天氣
? theris -> theirs
? 機(jī)器學(xué)系 -> 機(jī)器學(xué)習(xí)
?
找出編輯距離最小的
input? ? ? ? ? ? ? ? ? candidates? ? ? ? ? ? ? ? ? edit distance
therr? ? ? ? ? ? ? ? ? ? ?there? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ? ? ? ? ? ? ? ? ? ? ? ? thesis? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?3
? ? ? ? ? ? ? ? ? ? ? ? ? ? theirs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?the? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?2
? ? ? ? ? ? ? ? ? ? ? ? ? ? their? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
計(jì)算編輯距離:
Given str s, str t => editDist(s,t)
算法原理:
"""代碼實(shí)現(xiàn)"""def edit_dist(str1,str2):m,n = len(str1),len(str2)dp = [[0 for x in range(n+1)] for x in range(m+1)]for i in range(m+1):for j in range(n+1):if i == 0: dp[i][j] = jelif j == 0:dp[i][j] = ielif str1[i-1] == str2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = 1 + min(dp[i][j-1], dp[i-1,j-1], dp[i-1][j])return dp[m][n]根據(jù)之前的想法可以抽樣為流程:用戶輸入-> 找出詞典庫中編輯距離最小的Top K -> 排序
缺點(diǎn):跟每一個(gè)單詞都要計(jì)算編輯距離-時(shí)間復(fù)雜度太高
改進(jìn)后方案:
用戶輸入->? 生成編輯距離1,2的所有可能的字符串-> 通過詞典過濾 ->? 排序
生成的字符串遠(yuǎn)小于詞典庫
P(c)和P(s/c)可以基于統(tǒng)計(jì)方法計(jì)算出歷史出現(xiàn)的概率值
三、分詞
在很多語言中,分詞是最為重要的第一步,如漢語,一般用jieba分詞工具
怎么寫一個(gè)分詞工具?
簡單兩步驟:語句-> 候選分割(詞典DP)-> 選擇最好的(語言模型)
缺點(diǎn):時(shí)間效率低、誤差傳遞
改進(jìn):分割 + 語言模型? ->Joint optimization
"""jieba分詞"""import jiebaseg_list = jieba.cut("小王專注于人工智能",cut_all=False)print(" ".join(seg_list))"""增加詞典""" jieba.add_word("小王專注")四、詞的過濾
通常先把停用詞、出現(xiàn)頻率很低的詞匯過濾掉
好處:提高準(zhǔn)確率、減少時(shí)間成本
停用詞(stop words)
英文中 比如 "the" "an" "their" 都可以作為停用詞來處理。但是也需要考慮應(yīng)用場景
出現(xiàn)頻率特別低的詞匯對(duì)分析作用不大,所以一般也會(huì)去掉。把停用詞、出現(xiàn)頻率低的過濾掉。
五、Stemming (單詞轉(zhuǎn)換)
意思相似,合并為同一單詞
? ? ? ?went,go,going??
? ? ? ?fly,flies
? ? ? ?fast,faster,fastest
stemming 算法合并
from nltk.stem.porter import PorterStemmerstemmer = PorterStemmer()test_strs = ['caresses','dies','flies','mules','denied', 'died','agreed','owned','humbled','sized','meeting','stating']singles = [stemmer.stem(word) for word in test_strs]print(' '.join(singles))?六、文本表示
單詞的表示:最常用的表示方式:詞袋模型(Bag-of-words Model)
假設(shè)一個(gè)詞典有7個(gè)單詞:[我們,去,爬山,今天,你們,昨天,運(yùn)動(dòng)]
每個(gè)單詞的表示:特點(diǎn)- 維度等同于詞典的大小,Sparse Vector(只有一個(gè)1,其它全是0)
我們:[1,0,0,0,0,0,0]
爬山:[0,0,1,0,0,0,0]
運(yùn)動(dòng):[0,0,0,0,0,0,1]
昨天:[0,0,0,0,0,1,0]
? ? ? ? ? ? ? ? 詞袋模型(詞典維度)
句子的表示方式:
corpus = [
'He is going from Beijing to Shanghai.',
'He denied my request, but he actually lied.',
'Mike lost the phone, and phone was in the car.',
]
[[0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 0 1 0 1 0]
[1 0 0 1 0 1 0 0 2 0 0 1 0 0 1 0 1 0 0 0 0]
[0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 2 0 0 2 0 1]]
tf-idf 表達(dá)方式
tf-idf(w) = tf(d,w) * idf(w)
"""文本轉(zhuǎn)化向量"""corpus = ['He is going from Beijing to Shanghai.','He denied my request, but he actually lied.','Mike lost the phone, and phone was in the car.',]# 方法1: 只考慮詞頻 from sklearn.feature_extraction.text import CountVectorizervectorizer = CountVectorizer()X = vectorizer.fit_transform(corpus)print(X) print(x.toArray())# 方法2: 既考慮詞頻,也考慮詞的重要性(tf-idf)from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer()X = vectorizer.fit_transform(corpus)print(X.toArray())計(jì)算句子相關(guān)性? 方法:d = (s1*s2)/|s1|*|s2|(余弦相似度)
我們:[0.1,0.2,0.4,0.2]
爬山:[0.2,0.3,0.7,0.1]
運(yùn)動(dòng):[0.2,0.3,0.6,0.2]
昨天:[0.5,0.9,0.1,0.3]
? ? ? ? ? ? 分布式表示(優(yōu)點(diǎn):1、維度小? 2、每個(gè)位置都是具有一定意義的浮點(diǎn)非0的數(shù))
dist(我們,爬山) = sqrt(0.12)
dist(爬山,運(yùn)動(dòng)) = sqrt(0.02)
因此,爬山和運(yùn)動(dòng)的相似度高于我們和爬山
分布式表示依賴深度學(xué)習(xí)模型(word2vec模型 i,e.SkipGram)
句子向量:我們| 昨天|爬山 = () 方法:1、每個(gè)維度平均? 2、時(shí)序(LSTM,RNN)
?
?
?
總結(jié)
以上是生活随笔為你收集整理的知识图谱学习笔记-非结构化数据处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 知识图谱学习笔记-风控算法介绍
- 下一篇: 知识图谱学习笔记-命名实体识别