第一步:把每個網頁文本分詞,成為詞包(bag of words)。
第三步:統計網頁(文檔)總數M。
第三步:統計第一個網頁詞數N,計算第一個網頁第一個詞在該網頁中出現的次數n,再找出該詞在所有文檔中出現的次數m。則該詞的tf-idf 為:n/N * 1/(m/M) (還有其它的歸一化公式,這里是最基本最直觀的公式)
第四步:重復第三步,計算出一個網頁所有詞的tf-idf 值。
第五步:重復第四步,計算出所有網頁每個詞的tf-idf 值。
3、處理用戶查詢
第一步:對用戶查詢進行分詞。
第二步:根據網頁庫(文檔)的數據,計算用戶查詢中每個詞的tf-idf 值。
4、相似度的計算
使用餘弦相似度來計算用戶查詢和每個網頁之間的夾角。夾角越小,越相似。
『貳』 20-餘弦相似度及其R實現
餘弦相似度 (Cosine Similarity) 通過計算兩個向量的夾角餘弦值來評估他們的相似度。將向量根據坐標值,繪制到向量空間中,求得他們的夾角,並得出夾角對應的餘弦值,此餘弦值就可以用來表徵這兩個向量的相似性。夾角越小,餘弦值越接近於1,它們的方向越吻合,則越相似。
以二維空間為例,上圖的a和b是兩個向量,我們要計算它們的夾角θ。餘弦定理告訴我們,可以用下面的公式求得:
在文本處理中,要使用餘弦相似度演算法,首先得將文本向量化,將詞用「詞向量」的方式表示可謂是將 Deep Learning 演算法引入 NLP 領域的一個核心技術。自然語言處理轉化為機器學習問題的第一步都是通過一種方法將這些文本數學化。其思路如下:
舉例:
句子A:這只皮靴號碼大了。那隻號碼合適。
句子B:這只皮靴號碼不小,那隻更合適。
1、中文分詞:
使用結巴分詞對上面兩個句子分詞後,分別得到兩個詞集:
2、列出所有詞,將listA和listB放在一個set中,構成詞包:
3、使用詞集分別對listA和listB計算詞頻。
4、對listA和listB進行oneHot編碼後得到的結果如下:
listAcode = [1, 2, 1, 2, 1, 1, 1, 1, 0, 0]
listBcode = [1, 2, 1, 1, 0, 0, 1, 1, 1, 1]
5、得出兩個句子的詞頻向量之後,就變成了計算兩個向量之間夾角的餘弦值,值越大相似度越高。
6、兩個向量的餘弦值為0.805823,接近1,說明兩句話相似度很高。
兩個句子的相似度計算步驟如下:
1.通過中文分詞,把完整的句子分成獨立的詞集合;
2.求出兩個詞集合的並集(詞包);
3.計算各自詞集的詞頻並將詞頻向量化;
4.代入餘弦公式就可以求出文本相似度。
注意,詞包確定之後,詞的順序是不能再修改的,不然會影響到向量的變化。
以上是對兩個句子做相似度計算,如果是對兩篇文章做相似度計算,步驟如下:
1.找出各自文章的關鍵詞並合成一個詞集合;
2.求出兩個詞集合的並集(詞包);
3.計算各自詞集的詞頻並將詞頻向量化;
4.代入餘弦公式就可以求出文本相似度。
句子的相似度計算只是文章相似度計算的一個子部分。文章的關鍵詞提取可以通過其他的演算法來實現。
詞頻TF(Term Frequency),是一個詞語在文章或句子中出現的次數。要在一篇很長的文章中尋找關鍵字(詞),就一般的理解,一個詞對文章越關鍵在文章中出現的次數就越多,於是我們就採用「詞頻」進行統計。
但是這也不是絕對的,比如「地」,「的」,「啊」等詞,它們出現的次數對一篇文章的中心思想是沒有幫助的,只是中文語法結構的一部分而已。這類詞也被稱為「停用詞」,所以,在計算一篇文章的詞頻時,停用詞是應該過濾掉的。
僅僅過濾掉停用詞就能解決問題嗎?也不一定。比如分析政府工作報告,「中國」這個詞語必定在每篇文章中都出現很多次,但是對於每份報告的主幹思想有幫助嗎?對比「反腐敗」、「人工智慧」、「大數據」、「物聯網」等詞語,「中國」這個詞語在文章中應該是次要的。
TF演算法的優點是簡單快速,結果比較符合實際情況。缺點是單純以「詞頻」做衡量標准,不夠全面,詞性和詞的出現位置等因素沒有考慮到,而且有時重要的詞可能出現的次數並不多。這種演算法無法體現詞的位置信息,位置靠前的詞與位置靠後的詞,都被視為重要性相同,這是不科學的。
聯繫到層次分析法的思想,可以賦予每個詞特定的權重,給那類最常見的詞賦予較小的權重,相應的較少見的詞賦予較大的權重,這個權重叫做「逆文檔頻率」(Inverse Doucument Frequency,縮寫為IDF),它的大小與一個詞的常見程度成反比。而TF-IDF值就是將詞頻TF和逆文檔頻率IDF相乘,值越大,說明該詞對文章的重要性越高。這就是TF-IDF演算法。
『叄』 餘弦相似度怎麼用java程序寫
ArrayList a = new ArrayList(); // 創建動態數組,記錄不同的單詞
ArrayList aNum = new ArrayList(); // 創建動態數組,統計不同的單詞各自出現的次數
ArrayList b = new ArrayList();
ArrayList bNum = new ArrayList();
for (int i = 0; i < s1.length; i++) // 將s1復制到動態數組a, 且詞頻統計數組初始化
{
a.add(s1[i]);
aNum.add(i, 1);
}
『肆』 Spark筆記(1) :餘弦相似度計算
spark
在推薦系統中,基於物品的協同過濾演算法是業界應用最多的演算法,它的思想是給用戶推薦那些和他們喜歡的物品相似的物品,主要分為兩個步驟:一,計算物品之間的相似度;二,根據物品相似度和用戶的歷史行為給用戶生成推薦列表。
其中物品的相似度的計算,可以通過餘弦相似度計算。餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫"餘弦相似性"。
計算公式如下:
以文本相似度為例,用上述理論計算文本的相似性。
怎樣計算上面兩句話的相似程度?
基本思路是:如果這兩句話的用詞越相似,它們的內容就應該越相似。因此,可以從詞頻入手,計算它們的相似程度。
第一步,分詞
第二步,列出所有的詞
第三步,計算詞頻
第四步,寫出詞頻向量
問題就變成了如何計算這兩個向量的相似程度。可以想像成空間中的兩條線段,都是從原點出發,指向不同的方向。兩條線段之間形成一個夾角,如果夾角為0度,意味著方向相同、線段重合,這是表示兩個向量代表的文本完全相等;如果夾角為180度,意味著方向正好相反。因此,我們可以通過夾角的大小,來判斷向量的相似程度。夾角越小,就代表越相似。
使用上面的公式計算可得:
計算結果中夾角的餘弦值為0.81非常接近於1,所以,上面的句子A和句子B是基本相似的。
spark例子:
運行結果: