Python TF-IDFアルゴリズムテキストキーワード抽出
3597 ワード
TF(Term Frequency)の頻度は、文章の中で最も多くの単語が現れるが、文章の中で多くの単語がキーワードであるとは限らない.例えば、よく見られる文章自体にあまり意味のない停止語である.だから、一つの語が一般語かどうかを測定するために重要性調整係数が必要です.この重みはIDF(Inverse Document Frequency)逆ドキュメント頻度であり、その大きさは1つの語の一般的な程度に反比例する.ワード周波数(TF)と逆ドキュメント周波数(IDF)を得た後、2つの値を乗算すると、1つの語のTF-IDF値が得られ、ある語が文章に対する重要性が高いほど、そのTF-IDF値が大きくなるので、一番前のいくつかの語が文章のキーワードです.
TF-IDFアルゴリズムの利点は簡単で迅速で、結果は比較的に実際の状況に合っているが、単純に「語周波数」で一つの語の重要性を測定するのは、全面的ではなく、時には重要な語が現れる可能性のある回数は多くない.また、このアルゴリズムは語の位置情報を体現することができず、出現位置が前の語と出現位置が後の語は、同じように重要と見なされている.不合理です.
TF-IDFアルゴリズムステップ:
(1)頻度の計算:
語数=ある語が文章に現れる回数
文章に長短の区別があることを考慮し,異なる文章間の比較を考慮して語周波数を標準化する
語数=ある語が文章に現れる回数/文章の総語数
頻度=ある語が文章に現れる回数/その文に現れる回数が最も多い語が現れる回数
(2)逆文書の計算頻度
言語の使用環境をシミュレートするためにコーパス(corpus)が必要です.
逆文書頻度=log(コーパスの文書総数/(その語を含む文書数+1))
(3)TF-IFの計算
TF-IF=ワード周波数(TF)*逆文書周波数(IDF)
詳細コードは次のとおりです.
TF-IDFアルゴリズムの利点は簡単で迅速で、結果は比較的に実際の状況に合っているが、単純に「語周波数」で一つの語の重要性を測定するのは、全面的ではなく、時には重要な語が現れる可能性のある回数は多くない.また、このアルゴリズムは語の位置情報を体現することができず、出現位置が前の語と出現位置が後の語は、同じように重要と見なされている.不合理です.
TF-IDFアルゴリズムステップ:
(1)頻度の計算:
語数=ある語が文章に現れる回数
文章に長短の区別があることを考慮し,異なる文章間の比較を考慮して語周波数を標準化する
語数=ある語が文章に現れる回数/文章の総語数
頻度=ある語が文章に現れる回数/その文に現れる回数が最も多い語が現れる回数
(2)逆文書の計算頻度
言語の使用環境をシミュレートするためにコーパス(corpus)が必要です.
逆文書頻度=log(コーパスの文書総数/(その語を含む文書数+1))
(3)TF-IFの計算
TF-IF=ワード周波数(TF)*逆文書周波数(IDF)
詳細コードは次のとおりです.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
'''
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
#
def count_word(content):
word_dic ={}
words_list = content.split("/")
del_word = ["\r
","/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+"//"+file)
filesArray.append(each_file)
return filesArray
# 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(" !")
#
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
")
print("well done!")
def main():
#
folder_path = r" "
files_array = funfolder(folder_path)
#
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 "
buildfolder(new_folder)
# tf-idf, txt
i=0
for file in files_dic:
tf_idf = count_tfidf(file,files_dic,files_array)
files_path = files_array[i].split("//")
#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()