python TF-IDF算法實(shí)現(xiàn)文本關(guān)鍵詞提取
TF(Term Frequency)詞頻,在文章中出現(xiàn)次數(shù)最多的詞,然而文章中出現(xiàn)次數(shù)較多的詞并不一定就是關(guān)鍵詞,比如常見的對(duì)文章本身并沒有多大意義的停用詞。所以我們需要一個(gè)重要性調(diào)整系數(shù)來(lái)衡量一個(gè)詞是不是常見詞。該權(quán)重為IDF(Inverse Document Frequency)逆文檔頻率,它的大小與一個(gè)詞的常見程度成反比。在我們得到詞頻(TF)和逆文檔頻率(IDF)以后,將兩個(gè)值相乘,即可得到一個(gè)詞的TF-IDF值,某個(gè)詞對(duì)文章的重要性越高,其TF-IDF值就越大,所以排在最前面的幾個(gè)詞就是文章的關(guān)鍵詞。
TF-IDF算法的優(yōu)點(diǎn)是簡(jiǎn)單快速,結(jié)果比較符合實(shí)際情況,但是單純以“詞頻”衡量一個(gè)詞的重要性,不夠全面,有時(shí)候重要的詞可能出現(xiàn)的次數(shù)并不多,而且這種算法無(wú)法體現(xiàn)詞的位置信息,出現(xiàn)位置靠前的詞和出現(xiàn)位置靠后的詞,都被視為同樣重要,是不合理的。
TF-IDF算法步驟:
(1)、計(jì)算詞頻:
詞頻 = 某個(gè)詞在文章中出現(xiàn)的次數(shù)
考慮到文章有長(zhǎng)短之分,考慮到不同文章之間的比較,將詞頻進(jìn)行標(biāo)準(zhǔn)化
詞頻 = 某個(gè)詞在文章中出現(xiàn)的次數(shù)/文章的總詞數(shù)
詞頻 = 某個(gè)詞在文章中出現(xiàn)的次數(shù)/該文出現(xiàn)次數(shù)最多的詞出現(xiàn)的次數(shù)
(2)、計(jì)算逆文檔頻率
需要一個(gè)語(yǔ)料庫(kù)(corpus)來(lái)模擬語(yǔ)言的使用環(huán)境。
逆文檔頻率 = log(語(yǔ)料庫(kù)的文檔總數(shù)/(包含該詞的文檔數(shù) + 1))
(3)、計(jì)算TF-IDF
TF-IDF = 詞頻(TF)* 逆文檔頻率(IDF)
詳細(xì)代碼如下:
#!/usr/bin/env python
#-*- coding:utf-8 -*-
'''
計(jì)算文檔的TF-IDF
'''
import codecs
import os
import math
import shutil
#讀取文本文件
def readtxt(path):
with codecs.open(path,"r",encoding="utf-8") as f:
content = f.read().strip()
return content
#統(tǒng)計(jì)詞頻
def count_word(content):
word_dic ={}
words_list = content.split("/")
del_word = ["\r\n","/s"," ","/n"]
for word in words_list:
if word not in del_word:
if word in word_dic:
word_dic[word] = word_dic[word]+1
else:
word_dic[word] = 1
return word_dic
#遍歷文件夾
def funfolder(path):
filesArray = []
for root,dirs,files in os.walk(path):
for file in files:
each_file = str(root+"http://"+file)
filesArray.append(each_file)
return filesArray
#計(jì)算TF-IDF
def count_tfidf(word_dic,words_dic,files_Array):
word_idf={}
word_tfidf = {}
num_files = len(files_Array)
for word in word_dic:
for words in words_dic:
if word in words:
if word in word_idf:
word_idf[word] = word_idf[word] + 1
else:
word_idf[word] = 1
for key,value in word_dic.items():
if key !=" ":
word_tfidf[key] = value * math.log(num_files/(word_idf[key]+1))
#降序排序
values_list = sorted(word_tfidf.items(),key = lambda item:item[1],reverse=True)
return values_list
#新建文件夾
def buildfolder(path):
if os.path.exists(path):
shutil.rmtree(path)
os.makedirs(path)
print("成功創(chuàng)建文件夾!")
#寫入文件
def out_file(path,content_list):
with codecs.open(path,"a",encoding="utf-8") as f:
for content in content_list:
f.write(str(content[0]) + ":" + str(content[1])+"\r\n")
print("well done!")
def main():
#遍歷文件夾
folder_path = r"分詞結(jié)果"
files_array = funfolder(folder_path)
#生成語(yǔ)料庫(kù)
files_dic = []
for file_path in files_array:
file = readtxt(file_path)
word_dic = count_word(file)
files_dic.append(word_dic)
#新建文件夾
new_folder = r"tfidf計(jì)算結(jié)果"
buildfolder(new_folder)
#計(jì)算tf-idf,并將結(jié)果存入txt
i=0
for file in files_dic:
tf_idf = count_tfidf(file,files_dic,files_array)
files_path = files_array[i].split("http://")
#print(files_path)
outfile_name = files_path[1]
#print(outfile_name)
out_path = r"%s//%s_tfidf.txt"%(new_folder,outfile_name)
out_file(out_path,tf_idf)
i=i+1
if __name__ == '__main__':
main()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python自動(dòng)化辦公之創(chuàng)建PPT文件
python-pptx模塊是Python中用于PPT操作的模塊。本文將利用這一模塊實(shí)現(xiàn)創(chuàng)建PPT文件。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05
Python中初始化一個(gè)二維數(shù)組及注意事項(xiàng)說明
這篇文章主要介紹了Python中初始化一個(gè)二維數(shù)組及注意事項(xiàng)說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
16行Python代碼實(shí)現(xiàn)微信聊天機(jī)器人并自動(dòng)智能回復(fù)功能
聊天機(jī)器人自動(dòng)智能回復(fù)給我們的生活帶來(lái)了極大的便利,尤其在業(yè)務(wù)比較繁忙的時(shí)候,智能機(jī)器人給我們帶來(lái)極大的方便,今天小編教大家一招通過16行代碼實(shí)現(xiàn)微信聊天智能機(jī)器人,感興趣的朋友一起看看吧2022-01-01
Python文件夾與文件的操作實(shí)現(xiàn)代碼
最近在寫的程序頻繁地與文件操作打交道,這塊比較弱,還好在百度上找到一篇不錯(cuò)的文章,這是原文傳送門,我對(duì)原文稍做了些改動(dòng)2014-07-07
Python json轉(zhuǎn)字典字符方法實(shí)例解析
這篇文章主要介紹了Python json轉(zhuǎn)字典字符代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Python 時(shí)間戳之獲取整點(diǎn)凌晨時(shí)間戳的操作方法
這篇文章主要介紹了Python 時(shí)間戳之獲取整點(diǎn)凌晨時(shí)間戳的操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-01-01
Python的化簡(jiǎn)函數(shù)reduce()詳解
這篇文章主要介紹了Python的化簡(jiǎn)函數(shù)reduce()詳解,reduce()函數(shù)即為化簡(jiǎn)函數(shù),它的執(zhí)行過程為:每一次迭代,都將上一次的迭代結(jié)果與下一個(gè)元素一同傳入二元func函數(shù)中去執(zhí)行,需要的朋友可以參考下2023-12-12

