❶ NLP之gensim庫python實現文本相似度/匹配/查重
給定一個或多個搜索詞,如「高血壓 患者」,從已有的若干篇文本中找出最相關的(n篇)文本。
文本檢索(text retrieve)的常用策略是:用一個ranking function根據搜索詞對所有文本進行排序,選取前n個,就像網路搜索一樣。
結巴分詞後的停用詞性 [標點符號、連詞、助詞、副詞、介詞、時語素、『的』緩祥、數詞、方位詞、代詞胡哪寬]
對一篇文章分詞、去停用詞
對目錄下的所有文本進行預處理褲亮,構建字典
❷ python有沒有什麼包能判斷文本相似度
有,gensim包。
主要分成三步:
第一步,計算所有評論的tf-idf 值。
第二步,使用所有評論的tf-idf 值算出商品描述的tf-idf 值。
第三步,計算每一個評論和商品描述之間的tf-idf 餘弦相似度。
可以 在這里找到具體用法:
http://blog.csdn.net/chencheng126/article/details/50070021
❸ 詞義相似度計算
語義計算索引作業一 詞義相似度計算
實現2種詞彙相關度計算方法,基於詞典與基於語運游差料各一種
基於Mturk-771進行實驗和分析(開放式) : http://www2.mta.ac.il/~gideon/mturk771.html
這里我們使用WordNet詞典,使用的工具是nltk,利用裡面自帶的相似度方法來計算詞義相似度。Nltk是比較知名的Python自然語言處理包,從裡面可以導入wordnet詞典和一些語料,來幫助我們進行詞義等的分析。其中有六種相似度計算的演算法:
brown_ic = wordnet_ic.ic('ic-brown.dat')
path_similarity(c1,c2) # 詞在詞典層次結構中的最短路徑
wup_similarity(c1,c2) # Wu-Palmer 提出的最短路徑
lch_similarity(c1,c2) # Leacock Chodorow 最短路徑加上類別信息
res_similarity(c1,c2, brown_ic) # -log P(LCS(c1,c2)) 公共包容節點在層次結構中位置越低,相似性越大
jcn_similarity(c1,c2, brown_ic) # 1/2 * log P(LCS(c1,c2)) - (logP(c1) + logP(c2))
lin_similarity(c1,c2, semcor_ic) # 2 * log P(LCS(c1,c2)) / (logP(c1) + logP(c2))
特殊處理:
1、 其中lin_similarity、wup_similarity和path_similarity結果范圍在[0,1]之間,而由我們的數據可知,數據結果應該在[0,5]之間,因此這里我們把結果×5進行處理。
2、 一個詞會有多種詞義,判斷兩個詞需要讓兩個詞之間的各個詞義進行比較。如何判斷兩個詞之間的相似度呢?我同時使用了最大值和平均值,發現平均值得到的結果會非常小,猜想兩個詞之間可能有較多的詞義無關,影響了結果,因此最後選擇用最大值。
3、 lch_similarity得到的值都不大,因此最後進行了歸一化處理×5
4、 res_similarity(c1,c2, brown_ic) jcn_similarity(c1,c2, brown_ic)得到的結果存在le+300,而第二大的數分別為12.26837533572617和19.273454235478546,因此取13和20代替原來的最大le+300。
剩餘分數則是歸一化後再×5
五分分值:
因為預訓練詞向量都比較大,這里就使用了gensim中的word2vec模型進行自行訓練,訓練語料為text8,大概有100M左右。
最後得到的結果如下圖:score為真實評分分布,w2v為word2vec實際評分分布。
結果分析使用了均方誤差
由圖可以看出,word2vec方法和 res演算法結果較好,觀察預測結果分布,可以看出這兩種方法和真實結磨消果分布比較相似。
在觀察時,我們也發現,path等方法相似度偏向與1(或者是5)左右,原因是我們這里取的是最大值,對於account,explanation這兩個單詞,因為它們旁皮有相同的詞義,這里就認為相似度最大。但實際在現實生活中,考慮兩個詞詞義是否相似,除卻詞義的重合程度外,可能還要考慮兩個詞是否是常用詞義相似等等。比如兩個詞常用含義相似和兩個詞罕見含義相似,雖然都是某種詞義相似,但顯然前者更能體現詞的相似度。
因此可能取平均和取最大都不能很好的描述兩個詞之間的相似度。而語料的方法則可以得到詞的常用和罕見意義這一信息。這里用word2vec訓練語料有限,可能結果也不是非常准確,相信如果網上很多預訓練的詞向量可能會有更好的結果。
❹ python 列表相似度怎麼計算
找它們的共同元素?
❺ python中是否有用於計算兩個字元串相似度的函數
linux環境下,沒有首先安裝python_Levenshtein,用法如下:
重點介紹幾個該包中的幾個計算字串相似度的幾個函數實現。
1. Levenshtein.hamming(str1, str2)
計算漢明距離。要求str1和str2必須長度一致。是描述兩個等長字串之間對應位置上不同字元的個數。如
2. Levenshtein.distance(str1, str2)
計算編輯距離(也成Levenshtein距離)。是描述由一個字串轉化成另一個字串最少的操作次數,在其中的操作包括插入、刪除、替換。如
演算法實現 參考動態規劃整理:http://www.cnblogs.com/kaituorensheng/archive/2013/05/15/3080990.html。
3. Levenshtein.ratio(str1, str2)
計算萊文斯坦比。計算公式 r = (sum - ldist) / sum, 其中sum是指str1 和 str2 字串的長度總和,ldist是類編輯距離
注意:這里的類編輯距離不是2中所說的編輯距離,2中三種操作中每個操作+1,而在此處,刪除、插入依然+1,但是替換+2
這樣設計的目的:ratio('a', 'c'),sum=2,按2中計算為(2-1)/2 = 0.5,』a','c'沒有重合,顯然不合算,但是替換操作+2,就可以解決這個問題。
4. Levenshtein.jaro(s1, s2)
計算jaro距離,
其中的m為s1, s2的匹配長度,當某位置的認為匹配 當該位置字元相同,或者在不超過
t是調換次數的一半
5. Levenshtein.jaro_winkler(s1, s2)
計算Jaro–Winkler距離
❻ python中怎麼實現相似度的計算,比如:中國石油銷售有限公司--中國石油金屬有限公司,計算他們的相似度
#/usr/bin/envpython3
s1='中國石油銷售有限公司'.strip()
s2='中國石油金屬有限公司'.strip()
similar=sum([i==jfori,jinzip(s1,s2)])/len(s1)
print('相似度{:.2f}%'.format(similar*100))
[willie@bogon pys]$ python3 similar.py
相似度80.00%
❼ 怎樣用python或者是java計算文本相似度
第一步:把每個網頁文本分詞,成為詞包(bag of words)。
第三步:統計網頁(文檔)總數M。
第三步:統計第一個網頁詞數N,計算第一個網頁第一個詞在該網頁中出現的次數n,再找出該詞在所有文檔中出現的次數m。則該詞的tf-idf 為:n/N * 1/(m/M) (還有其它的歸一化公式,這里是最基本最直觀的公式)
第四步:重復第三步,計算出一個網頁所有詞的tf-idf 值。
第五步:重復第四步,計算出所有網頁每個詞的tf-idf 值。
3、處理用戶查詢
第一步:對用戶查詢進行分詞。
第二步:根據網頁庫(文檔)的數據,計算用戶查詢中每個詞的tf-idf 值。
4、相似度的計算
使用餘弦相似度來計算用戶查詢和每個網頁之間的夾角。夾角越小,越相似。
❽ 使用word2vec計算詞向量之間的相似度
string為你需要鍵亮乎獲取向量的詞,
double[] array = vec.getWordVector(string);
array是這個詞的向量。
首先在創建vec的時候要保證.minWordFrequency(1),否則有些詞你是得不到向量的,這個方法鍵液是設置詞的最小使用頻稿悉率。
❾ 圖像相似度計算【python】
其中,G和S為兩張圖片的圖像顏色分布直方圖,N為顏色空間樣點數。這里使用分塊的方法計算相橘含似度,用以提高各部分的特徵,防止圖片顏色相似導致計算的相似度高。
—————————————————————————————————————————————圓氏笑————————————————————
—————————————————————————————————————————————————————————————————
————————————————————————————————————核喚—————————————————————————————
轉自另一位大佬,忘記地址了
❿ 如何用Python玩轉TF-IDF之尋找相似文章並生成摘要
應用1:關鍵詞自動生成
核心思想是對於某個文檔中的某個詞,計算其在這個文檔中的標准化TF值,然後計算這個詞在整個語料庫中的標准化IDF值。在這里,標准化是說對原始的計算公式進行了一些變換以取得更好的衡量效果,並避免某些極端情況的出現。這個詞的TF-IDF值便等於TF*IDF。對於這個文檔中的所有詞計算它們的TF-IDF值,並按照由高到低的順序進行排序,由此我們便可以提取我們想要的數量的關鍵詞。
TF-IDF的優點是快捷迅速,結果相對來說比較符合實際情況。缺點是當一篇文檔中的兩個詞的IDF值相同的時候,出現次數少的那個詞有可能更為重要。再者,TF-IDF演算法無法體現我詞的位置信息,出現位置靠前的詞與出現位置靠後的詞,都被視為重要性相同,這是不正確的。存在的解決辦法是對文章的第一段和每段的第一句話給予比較大的權重。
應用2:計算文本相似度
明白了對於每個詞,如何計算它的TF-IDF值。那麼計算文本相似度也輕而易舉。我們已經計算了文章中每個詞的TF-IDF值,那麼我們便可以將文章表徵為詞的TF-IDF數值向量。要計算兩個文本的相似度,只需要計算餘弦即可,餘弦值越大,兩個文本便越相似。
應用3:自動摘要
2007年,美國學者的論文<A Survey on Automatic Text Summarization>總結了目前的自動摘要演算法,其中很重要的一種就是詞頻統計。這種方法最早出自1958年IBM公司一位科學家的論文<The Automatic Creation of Literature Abstracts>。這位科學家認為,文章的信息都包含在句子中,有的句子包含的信息多,有的句子包含的信息少。自動摘要就是找出那些包含信息最多的句子。那麼句子的信息量怎麼衡量呢?論文中採用了關鍵詞來衡量。如果包含的關鍵詞越多,就說明這個句子越重要,這位科學家提出用Cluster的來表示關鍵詞的聚集。所謂簇,就是包含多個關鍵詞的句子片段。
以第一個圖為例,其中的cluster一共有7個詞,其中4個是關鍵詞。因此它的重要性分值就等於(4*4)/7=2.3。然後,找出包含cluster重要性分值最高的句子(比如5句),把它們合在一起,就構成了這篇文章的自動摘要。具體實現可以參見<Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites>(O'Reilly, 2011)一書的第8章,Python代碼見github。這種演算法後來被簡化,不再區分cluster,只考慮句子包含的關鍵詞。偽代碼如下。
Summarizer(originalText,maxSummarySize):
//計算文本的詞頻,生成一個列表,比如[(10,'the'),(3,'language'),(8,'code')...]
wordFrequences=getWordCounts(originalText)
//過濾掉停用詞,列表變成[(3,'language'),(8,'code')...]
contentWordFrequences=filtStopWords(wordFrequences)
//按照詞頻的大小進行排序,形成的列表為['code','language'...]
contentWordsSortbyFreq=sortByFreqThenDropFreq(contentWordFrequences)
//將文章分成句子
sentences=getSentences(originalText)
//選擇關鍵詞首先出現的句子
setSummarySentences={}
:
firstMatchingSentence=search(sentences,word)
setSummarySentences.add(firstMatchingSentence)
ifsetSummarySentences.size()=maxSummarySize:
break
//將選中的句子按照出現順序,組成摘要
summary=""
foreachsentenceinsentences:
:
summary=summary+""+sentence
returnsummary
類似的演算法已經被寫成了工具,比如基於Java的Classifier4J庫的SimpleSummariser模塊、基於C語言的OTS庫、以及基於classifier4J的C#實現和python實現。