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)