寫在開始之前:語義即聯絡。
以下部分來自於我在公司內部的分享。
在學術上,大致有以下三個概念和文字相似度相關:
當我們在討論兩個短文本是不是相似(或者是不是表達同乙個意思),需要做兩件事:
說它簡單,因為它是一種簡單的詞袋模型;
說它重要,因為它很容易和倒排索引結合,正所謂 「天下武功,無堅不摧,唯快不破!」,我會在另一篇部落格中專門介紹tfidf和倒排。
每條短文本都表示成維度為詞典大小(v)的向量,對應位置元素的值為當前詞的tfidf值
使用tfidf做表徵,使用cos(余弦)計算。
tfidf最大的問題是沒有考慮詞語之間的語義(即詞語之間的相互聯絡,或者詞語之間的相似性),其本質是因為這種vsm模型假設句子所在的空間的基是正交(orthogonal)的:
其中v為詞典大小,從而:
softcosine的思想是:找到乙個非正交的基。
首先,我們需要明確三個概念以及它們之間的關係:
下面兩個圖很重要!
解釋:給定向量,還需要給定一組基,向量才有座標。向量a還是向量a,但是相對於不同的「基」,向量a的座標是不同的,分別是(1,2)和(0.9,0.7)。
解釋:這裡和上圖不同,我們只是拿到了座標,理所當然,給定不同的基,就可以得到不同的向量,可以看出,a,b在不同的(1,2)和(2,1)兩個座標,在不同的基下面,對應不同的向量。
?算了…我要舉例子了:
這個例子當中,有兩句話:
a : a player will play a game they like to play
b : they play the game they like
得到字典:
我們用vsm(空間向量模型)把句子a和句子b表示為:
現在還不要把a,b看成兩個向量,先把腦袋中預設的正交基忘掉,a,b現在還只是座標而已。我們現在有座標了,那麼選擇不同的基,就可以讓這兩個座標展現出不同的角度(即不同的遠近關係)。
softcosine的大致思路如下:
那麼,選擇什麼樣的基是好的呢?答案:最好是兩個基向量的余弦距離能夠度量對應的兩個詞語之間的相似性。
這裡,要多說一句【隔了一天, 突然不想寫了…?】,那就再多說一句。
我們的目標是把原來的基向量(e1,e2,… … ,ev)變換為(e1*,e2*,… … ,ev*)。注意,ev和ev*的維度是相同的,都是v。
假設w1的特徵用 f1 (維度為df) 表示,w2的特徵用 f2 維度為df)表示,我們希望這個非正交基能滿足下面的公式:
cos(e1*,e2*) = s12 = similarity(f1,f2)
在實際工作中,特徵f 就是選擇的word2vec, glove, fasttext 等等詞向量。
其實本來是想記錄一下生成方式的sif 和 usif 推導過程,沒想到說了很久的舊東西。
先看看乙個灰度svd分解之後,把最大奇異值對應的奇異向量抹掉之後,的變換,左邊是原圖,右邊是抹掉最大奇異值對應的奇異向量之後,重新合成的結果:
就這樣吧~,有空再寫…
短文本相似度計算
短文本的相似度計算方法可以分為兩大類 基於深度學習的方法和基於非深度學習的方法。科研方面基本都是從深度學習方面入手,但個人覺得想把單語言的短文本相似度計算給做出花來比較難,相對而言基於深度學習的跨語言相似度計算稍微好點。工程方面多半不用深度學習的方法,主要是獲取帶標記的語比較難的 除非公司花錢找人標...
Python短文本相似度比較
對python內建庫difflib和fuzzywuzzy進行比較 difflib 基於ratcliff obershelp演算法 格式塔模式匹配 fuzzywuzzy 基於萊文斯坦距離 需要安裝python levenshtein pip install python levenshtein pip...
word2vec相似度計算 短文相似度匹配
一開始這樣的乙個思路,很清晰明了,而且網上相應的資料也很多,然後就開搞吧。1 把所有短文本去掉標點符號,用jieba分詞分好詞,去除停用詞,得到分好的文字 2 按一定規則抽取特徵詞彙,作為後期向量的每一維 3 用sklearn庫中的原生方法countvectorizer tfidfvectorize...