杰卡德相似系數(shù)
兩個集合A和B的交集元素在A和B的并集中所占的比例
J(A,B) = |A^B| / |A V B|
杰卡德相似系數(shù)是衡量2個集合相似度的一種指標(biāo)
使用詞頻-逆文檔頻率(TF-IDF)實現(xiàn)關(guān)鍵詞提取
詞頻-逆文檔頻率(Term Frequency - Inverse Document Frequency,TF-IDF)是一種用于資訊檢索和文本挖掘的常用加權(quán)技術(shù)乍炉。
TF-IDF 算法的主要思想:如果某個詞或短語在一篇文章中出現(xiàn)的頻率TF高峦筒,并且在其他文章中很少出現(xiàn),則認(rèn)為此詞或短語具有很好的類別區(qū)分能力,適合用于分類没卸。
TF-IDF = TF * IDF
1.TF 的計算公式
TF(Term Frequency ) 表示詞條 t 在文檔 D 中出現(xiàn)的頻率戳晌。TF的計算公式見式
TF = count(t) / D
式中,count(t)表示詞條t出現(xiàn)的次數(shù)笔横,D表示文檔D中所有詞條的個數(shù)竞滓。
2. IDF 的計算公式
IDF( Inverse Document Frequency)表示詞條t在整個語料庫中的區(qū)分能力
IDF = lg( N / 1(t,D) )
式中,N為所有文檔的總數(shù)吹缔, I(t, D) 表示文檔 D 是否包含詞條t, 若包含則為1虽界,不包含則為0。
但此處有一個問題:如果詞條t在所有文檔中都沒有出現(xiàn)涛菠,則式中的分母為0莉御,此時就需要對IDF做平滑處理。改善后的IDF計算公式見式俗冻。
IDF = lg( N / 1 + 1(t,D) )
3. TF-IDF = TF * IDF
最終詞條t 在文檔中的TF-IDF 值為:
TF-IDF = TF * IDF
從TF-IDF = TF * IDF值的計算過程中看出:一個詞條在文檔中出現(xiàn)的頻率越高礁叔,且新鮮度越低(即普遍度低),則其對應(yīng)的TF-IDF 值越高迄薄。
4. 舉例
比如琅关,現(xiàn)在有一個語料庫,包含了100篇(N)論文,其中涉及包含推薦系統(tǒng)t的有20篇涣易,在第一篇論文D中總共有200個技術(shù)詞匯画机,其中推薦系統(tǒng)出現(xiàn)了15次,則詞條推薦詞條在第一篇論文D中的TF-IDF值為:
TF-IDF 推薦系統(tǒng) = (15/200) * lg (100 / 20+ 1) = 0.05
詞頻-逆文檔頻率(Term Frequency - Inverse Document Frequency新症,TF-IDF)是一種用于資訊檢索和文本挖掘的常用加權(quán)技術(shù)步氏。
TF-IDF是一種統(tǒng)計方法,用于評估一個字詞對于一個文件集或一個語料庫中的一份文件的重要程度徒爹。字詞的重要性隨著他在文件中出現(xiàn)的次數(shù)成正比增加荚醒,但同時會隨著他在語料庫中出現(xiàn)頻率成反比下降。
TF-IDF = TF * IDF
TF-IDF算法示例
0. 引入依賴
import numpy as np
import pandas as pd
1. 定義數(shù)據(jù)和預(yù)處理
docA = "The cat sat on my bed"
docB = "The dog sat on my knees"
# 磁帶
bowA = docA.split(" ")
bowB = docB.split(" ")
bowA
# 構(gòu)建詞庫
wordSet = set(bowA).union(set(bowB))
wordSet
{'The', 'bed', 'cat', 'dog', 'knees', 'my', 'on', 'sat'}
2. 進(jìn)行詞數(shù)統(tǒng)計
# 用統(tǒng)計字典來保存詞出現(xiàn)的次數(shù)
wordDictA = dict.fromkeys( wordSet, 0 )
wordDictB = dict.fromkeys( wordSet, 0 )
# 遍歷文檔隆嗅,統(tǒng)計詞數(shù)
for word in bowA:
wordDictA[word] += 1
for word in bowB:
wordDictB[word] += 1
pd.DataFrame([wordDictA, wordDictB])
wordDictA
{'knees': 0,
'cat': 1,
'The': 1,
'dog': 0,
'sat': 1,
'on': 1,
'bed': 1,
'my': 1}
3. 計算詞頻TF
def computeTF( wordDict, bow ):
# 用一個字典對象記錄tf界阁,把所有的詞對應(yīng)在bow文檔里的tf都算出來
tfDict = {}
nbowCount = len(bow)
for word, count in wordDict.items():
tfDict[word] = count / nbowCount
return tfDict
tfA = computeTF( wordDictA, bowA )
tfB = computeTF( wordDictB, bowB )
tfA
{'cat': 0.16666666666666666,
'on': 0.16666666666666666,
'sat': 0.16666666666666666,
'knees': 0.0,
'bed': 0.16666666666666666,
'The': 0.16666666666666666,
'my': 0.16666666666666666,
'dog': 0.0}
4. 計算逆文檔頻率idf
def computeIDF( wordDictList ):
#wordDictList:[{'knees': 0, 'cat': 1, 'The': 1, 'dog': 0, 'sat': 1, 'on': 1, 'bed': 1, 'my': 1}, {'knees': 1, 'cat': 0, 'The': 1, 'dog': 1, 'sat': 1, 'on': 1, 'bed': 0, 'my': 1}]
# 用一個字典對象保存idf結(jié)果,每個詞作為key胖喳,初始值為0
idfDict = dict.fromkeys(wordDictList[0], 0)
#idfDict:{'knees': 0, 'cat': 0, 'The': 0, 'dog': 0, 'sat': 0, 'on': 0, 'bed': 0, 'my': 0}
N = len(wordDictList)
import math
for wordDict in wordDictList:
# 遍歷字典中的每個詞匯泡躯,統(tǒng)計Ni
for word, count in wordDict.items():
if count > 0:
# 先把Ni增加1,存入到idfDict
idfDict[word] += 1
# 已經(jīng)得到所有詞匯i對應(yīng)的Ni丽焊,現(xiàn)在根據(jù)公式把它替換成為idf值
for word, ni in idfDict.items():
idfDict[word] = math.log10( (N+1)/(ni+1) )
return idfDict
idfs = computeIDF( [wordDictA, wordDictB] )
idfs
{'cat': 0.17609125905568124,
'on': 0.0,
'sat': 0.0,
'knees': 0.17609125905568124,
'bed': 0.17609125905568124,
'The': 0.0,
'my': 0.0,
'dog': 0.17609125905568124}
5. 計算TF-IDF
def computeTFIDF( tf, idfs ):
tfidf = {}
for word, tfval in tf.items():
tfidf[word] = tfval * idfs[word]
return tfidf
tfidfA = computeTFIDF( tfA, idfs )
tfidfB = computeTFIDF( tfB, idfs )
pd.DataFrame( [tfidfA, tfidfB] )