TF-IDF的算法原理以及Python實現(xiàn)過程
算法原理
TF-IDF(Term Frequency-Inverse Document Frequency)是詞頻-逆文檔頻率,主要實現(xiàn)在一個文章集中找到每篇文章的關鍵字(也就是文章中哪些詞匯是最重要的)。
主要從兩個方面考慮,一篇文章中各個詞語的出現(xiàn)頻率。另一個是該詞語在幾篇文章中出現(xiàn)。
1、TF(Term Frequency) 詞頻
首先,解釋第一個方面,一篇文章中各個詞語出現(xiàn)的頻率。
從直觀上來說,如果一篇文章中某些詞語出現(xiàn)頻率很高(除了“的、是、你”等助詞等),那么從這一角度來說,可以認為該詞是這篇文章的關鍵詞。
使用數(shù)學公式表達就是

在某篇文章中該詞出現(xiàn)較多,則TF值較大。該詞在文章中出現(xiàn)較少,則TF值較小。注意要停用一些“的”、“是”、“你”、“我”…助詞、人稱代詞等等。
2、IDF(Inverse Document Frequency)逆文件頻率
然后,解釋第二個方面,該詞在哪幾篇文章中出現(xiàn)過。在一個文章集中,我們的目標是找到每篇文章的特有的關鍵詞,可以反映出該文章獨有特點,即找到差異化且可有代表性的詞。那么這個詞通常情況下,并不會在其余文章中經(jīng)常出現(xiàn),否則對區(qū)分文章關鍵信息的作用就會較小。因此,我們這一方面就是找到本篇文章中的詞語,很少出現(xiàn)在其余文章中。
使用數(shù)學公式表達就是

采用逆文檔頻率,該詞在文檔中沒有怎么出現(xiàn),則IDF值會較大。如果該詞在其余文檔出現(xiàn)較多,則IDF值會較小。

最后相乘就會得到,一篇文章中每個詞的TF-IDF的值,值越大,則可認為重要程度越高,可作為文章的關鍵詞。
Python實現(xiàn)
在這里主要使用jieba來實現(xiàn)中文分詞,Counter來進行計數(shù)統(tǒng)計
# -*- coding: utf-8 -*-
import math
import jieba
from collections import Counter
from collections import defaultdict
def TFIDF(dataset):
# 統(tǒng)計每個文章中每個詞語的tf
j = 0
doc_len = len(dataset)
cntr = [0] * doc_len # Counter每個文章
total = [0] * doc_len # 獲取每個文章中各自的詞語總數(shù)
word_tf = [0] * doc_len # 獲取每個文章中每個詞語的tf
for sent in dataset:
iters = jieba.cut(sent)
cntr[j] = Counter(iters)
total[j] = sum(cntr[j].values())
word_tf[j] = defaultdict(int)
for i in cntr[j].keys():
word_tf[j][i] = cntr[j][i] / total[j]
j += 1
# 構建詞匯表和總詞頻
word_cnt = defaultdict(int)
for word_list in word_tf:
for word in word_list:
word_cnt[word] += 1
# 統(tǒng)計詞匯在文檔中的頻率
doc_tf = defaultdict(int)
for word in word_cnt:
for article in dataset:
if word in article:
doc_tf[word] += 1
# 構建詞匯的idf
word_idf = {}
for word in doc_tf:
word_idf[word] = math.log(doc_len / (doc_tf[word] + 1))
# 構建每篇文章中詞的tf-idf
t = 0
word_tf_idf = [0] * doc_len
for article in word_tf:
word_tf_idf[t] = defaultdict(int)
for word in article:
word_tf_idf[t][word] = article[word] * word_idf[word]
t += 1
# 對每篇文章每個詞的tf-idf進行由大到小排序
t = 0
for i in word_tf_idf:
for j in i:
word_tf[t] = dict(sorted(word_tf[t].items(), key=lambda x:x[1], reverse=True))
word_tf_idf[t] = dict(sorted(word_tf_idf[t].items(), key=lambda x:x[1], reverse=True))
t += 1
return word_tf_idf, word_tf
if __name__ == '__main__':
dataset = ["中國的北京是中國的首都","那里有一句話叫做“北京歡迎您”,北京啊北京",
"北京歡迎您!相信夢想,夢,相信有夢就會有奇跡"]
word_tf_idf,word_tf = TFIDF(dataset)
print("=============tf-idf=============")
for i in word_tf_idf:
print(i)
print("=============tf=============")
for i in word_tf:
print(i)
注:代碼主要目的是實現(xiàn)TF-IDF,對標點符號等沒有進行停用處理。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python3實現(xiàn)的簡單工資管理系統(tǒng)示例
這篇文章主要介紹了Python3實現(xiàn)的簡單工資管理系統(tǒng),涉及Python文件讀寫、數(shù)據(jù)遍歷、判斷等相關操作技巧,需要的朋友可以參考下2019-03-03
Python?生成多行重復數(shù)據(jù)的方法實現(xiàn)
本文主要介紹了Python?生成多行重復數(shù)據(jù)的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
用Python調(diào)用win命令行提高工作效率的實例
今天小編就為大家分享一篇用Python調(diào)用win命令行提高工作效率的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

