NLP的核心是瞭解文本的語義
one-hot (以下幾種方式都屬於one-hot的範疇)
通過構建詞典的順序,找出對應單詞的位置,
詞典:中文有20萬-30萬個常用詞, rnn和lstm中,也有使用字符集的,常用字符大概5000個
例子:
詞典(只有7個單詞,即7個維度):[今天, 天氣, 不錯, 挺,風和日麗,的, 明天]
每個單詞的表示:
今天:[1, 0, 0, 0, 0, 0, 0]
不錯:[0, 0, 1, 0, 0, 0, 0]
的: [0, 0, 0, 0, 0, 1, 0]
句子的表示:兩種方式:
1、boolean, 不管出現多少次,在相應位置都爲1
2、count, 記錄單詞出現的頻率
而一句話:今天 的 天氣 不錯 挺 風和日麗 的。用ont-hot表示的話就是:
1、boolean [1, 1, 1, 1, 1, 1, 0] 2、count [1, 1, 1, 1, 1, 2, 0]
文本相似度:
優缺點:多數使用count方法,但是count方法中,無關的詞出現的頻次會比較多,比如的,他,他們等。而比較重點的詞可能爲動詞。 也就是說出現次數少的,並不代表它的貢獻值就越小。
1、歐式距離: d = |s1 - s2| d:距離 s1 s2 句子
通過boolean法或者count法獲得句子向量後(s1和 s2的長度爲詞典的長度)
例:
s1 = [x1, x2, x3] s2 = [y1, y2, y3]
d = |s1 - s2| = √(x1-y1)^2 + (x2-y2)^2 + (x3-y3)^2......
缺點:只有向量大小,沒有方向。 值越小,相似度越大
2、餘弦相似度: 即考慮向量的方向,又考慮向量的大小, 值越大,相似度越大,
方向和大小折中的一種方法, 值越大,相似度越大,
d = (s1 · s2) / ( |s1| * |s2|) # (s1 · s2) 內積,考慮方向 ( |s1| * |s2|) 考慮向量大小
例:
s1 = [x1, x2, x3] s2 = [y1, y2, y3]
d = x1y1 + x2yx + x3y3 / (√x1^2 + x2^2 + x3^2 * √y1^2 + y2^2 + y3^2)
問題: 並不是出現的越多,就越重要; 並不是出現的越少,就越不重要
於是就引出來-- tf-idf
TF-IDF 逆文本序
公式: tf-idf(w) = tf(d, w) * idf(w)
tf(d, w) : 文檔d中w的詞頻
idf(w) : log(N / N(w)) 考慮單詞的重要性 N:語料庫中文檔的總數, N(w) : 詞語w出現在多少個文檔中
1、構建詞典, 即所有文檔中的分詞後的總量total_words
2、通過 計算每篇文章的向量: 向量總長度爲total_words, 每個位置的向量是tf-idf值, 即當前文章中該詞出現的頻率 * log(總文檔數/ 有多少篇文章出現過該詞語) 如:[1*log(100/5),1*log(100/3),2*log(100/50),1*log(100/100), 0, .....]
ont-hot的缺點:
1、one-hot 無法確定兩個單詞的語義相似度
2、ont-hot的稀疏性 由於中文詞典過於龐大,可能有10^5 至10^6個,而一個文本只有寡寡幾個單詞的時候,矩陣就會變得非常的稀疏
如何評價兩個單詞之間的語義相似性?
1、歐式距離 都一致, 爲根號2
2、餘弦相似度, 都一直, 爲0
怎麼解決?
請見下篇文章,詞向量~