TF-IDF算法——原理及實現


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)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM