TF-IDF算法是一種用於信息檢索與數據挖掘的常用加權技術。TF的意思是詞頻(Term - frequency),IDF的意思是逆向文件頻率(inverse Document frequency).
TF-IDF是傳統的統計算法,用於評估一個詞在一個文檔集中對於某一個文檔的重要程度。它與這個詞在當前文檔中的詞頻成正比,與文檔集中的其他詞頻成反比。
首先說一下TF(詞頻)的計算方法,TF指的是當前文檔的詞頻,
,在這個公式中,分子表示的是改詞在某一文檔中出現的次數,分母表示在該文檔中所有關鍵詞出現的次數之和。
然后來說下IDF(逆向詞頻)的計算方法,IDF指的是某個詞匯普遍性的度量。
,這個公式中,log內的部分,分子表示的是文檔集中文檔的個數,分母表示的是包含當前關鍵詞的文檔的個數,對於這個分數取對數,得到的就是,當前詞匯的IDF的值。
下面,我來介紹下通過python對TF-IDF算法的設計及實現:
對象1:文章集(屬性:文章對象的集合,包含關鍵字的文章數)
對象1: 文章(屬性:關鍵詞對象的集合;關鍵詞出現的總次數;關鍵詞對應對象的字典)
對象2:文章-關鍵詞(屬性:關鍵詞名稱;關鍵詞在當前文章中出現的次數;TF_IDF)
實現流程:
1、創建文章對象,初始關鍵字的Map集
2、遍歷關鍵字,每遍歷一個關鍵字,
2.1 關鍵詞出現的總次數加一
2.2 判斷文章關鍵字中是夠存在當前關鍵字,如果存在,找出他,加一,如果不存在,創建一個文章關鍵字對象,塞到文章的關鍵字的集中去;
2.3 若果這個關鍵字是第一次出現,則記錄關鍵字出現的文章數(如果關鍵字在關鍵字-文章數 字典中存在,則文章數+1,否則將其加入到關鍵字-文章數字典中,並賦初始值1)
2.4 遍歷完成,文章的關於關鍵詞的Map集裝載完成,然后將當前的文章add到文章集的對象中去
3 遍歷文章集,計算出關鍵字對應的TF-IDF,並輸出
實現代碼:(實現代碼以讀取一個文件模擬多個文檔)
# TF_IDF.py
# -*- coding: utf-8 -*-
import jieba
import math
class DocumentSet():
documentList = []
key_Count = {} #關鍵詞對應的文章數
class Document():
docKeySumCount=0 #文章中所有關鍵詞總次數
docKeySet={} #關鍵詞對象列表
def __init__(self,docid):
self.docid = docid
class DocKey():
docKeyCount = 1 #當前關鍵詞在當前文章中出現的次數
TF_IDF = 0 #當前關鍵詞的TF-IDF值
def __init__(self,word):
self.word = word
f = open("C:/Users/zw/Desktop/key-words.txt", 'r')
line='start'
docList = DocumentSet()
while line:
line = f.readline()
datafile = line.split('\t')
if(datafile.__len__()>=2):
doc = Document(datafile[0])
wordList = list(jieba.cut(datafile[1]))
for i in wordList:
doc.docKeySumCount = doc.docKeySumCount + 1
if i not in doc.docKeySet.keys():
doc.docKeySet[i] = DocKey(i)
else:
doc.docKeySet[i].docKeyCount = doc.docKeySet[i].docKeyCount+1
#記錄包含關鍵詞的文章數
if doc.docKeySet[i].docKeyCount <= 1:
if i not in docList.key_Count.keys():
docList.key_Count[i]=1
else:
docList.key_Count[i]=docList.key_Count[i]+1
docList.documentList.append(doc)
f.close()
for d in docList.documentList:
for k in d.docKeySet.keys():
d.docKeySet[k].TF_IDF = d.docKeySet[k].docKeyCount/d.docKeySumCount + math.log(docList.documentList.__len__()/docList.key_Count[k])
print ('文章id :%s 關鍵字【%s】的TF-IDF值為:%s',d.docid ,k, d.docKeySet[k].TF_IDF)
