基于Python的词频-逆文档频率关键词提取算例

1.TF-IDF简介

在文本分析中,往往可以使用关键词来表征文本的主题,因此关键词提取技术对于文本分析是一项非常重要的工作。

关键词提取技术主要有TF-IDF算法、TextRank算法、基于LDA主题模型的关键词提取算法等。

本文给出了TF-IDF算法的具体实现过程。

TF-IDF是Term Frequency-Inverse Document Frequency的缩写,即词频-逆文档频率,用来刻画一个词语在某篇文档中重要程度,也就是说是否可以用该词语来代表某篇文档的主要内容。

TF表示词频。给定几个关键词,在某篇文档中出现的次数最高者,则说明该文档与出现次数最高的词语关系最密切。用词语出现的次数除以文档的总词汇数,就是TF,当然此处在统计文档总词汇时,把类似于“了”、“的”、“地”、“即”等词语排除在外不予考虑。引入词频后,则某个词的词频越高,该文档与其关系也就越大。

TF的计算公式如下:

 

IDF表示逆文档频率。如果一个词语在某篇文档中出现的TF高,但是在语料库的其它文档中出现的次数少,则说明该词语对于文档分类具有重要作用,因此引入IDF来刻画此项数据,其值越大,说明该词语对于语料库来说具有越好的区分能力。如果某个词语在每篇文档里都出现,且出现的次数很接近,则该词语用来区分文档时效果就不好。例如:语料库有n篇关于天气描述的文档,其中只有1篇文档里面多次出现“晴天”,则说明“晴天”一次能够较好区分文档的类别。

IDF的计算公式如下:

 

TF-IDF就是TF和IDF的乘积,值越大说明某个词语用类识别文档的区分度就越大。

2.TF-IDFPython代码

#计算TF-IDF
#给定一个关键词文本文件,
#给定N篇待分类的文档。
#本段代码把N个文件合并为一个文件,每一行代表一个待分类的本文文件。
import numpy as np
import jieba.analyse

'''该函数获取文本文件filename里的总行数'''
'''filename文件里的每一行代表一篇待识别的文档'''
def GetRecordNums( filename ):
    with open( filename, mode = 'r') as fp:
        num = sum( 1 for line in fp )
        return num

'''该函数获取关键词文件filename里的关键词'''
def GetKeyWord( filename ):
    i = 0;
    conts = list()
    with open( filename, mode = 'r' ) as fp:
        for line in fp:
            conts.append( line.rstrip() )
            i = i + 1
        return conts

'''获取待识别的文本文件text.txt里的总行数'''
RecordNum = GetRecordNums( 'text.txt' )

'''获取关键词文件textKeyword里的关键词'''
keyWord  = GetKeyWord( 'textKeyword.txt' )
keyWordNum = len( keyWord )

print( 'RecordNum: ', RecordNum )
print( 'keyWordNum: ', keyWordNum )
print( 'keyWord: ', keyWord )

'''统计每行记录中每一个keyword的数量'''
keyWordInf = np.zeros( [ RecordNum, keyWordNum ] )
with open('text.txt', mode = 'r') as fd:
    i = 0
    for line in fd:
        for j in range( keyWordNum ):
            keyWordInf[i,j] = line.count( keyWord[j] )
        i = i + 1

keyWordInf = keyWordInf
keyWordInf = ( keyWordInf + np.abs(keyWordInf) ) / 2

'''统计每个待分类文件里面词汇的总数, 此处使用了jieba提取关键词方法'''
totalWordsInRecord = np.zeros( RecordNum )
with open('text.txt', mode = 'r') as fd:
    i = 0
    for line in fd:
        keywords = jieba.analyse.extract_tags( line, topK=200 )
        totalWordsInRecord[i] = len(keywords )
        i = i + 1

'''计算TF:Term Frequency '''
TF = np.zeros( [RecordNum, keyWordNum] )
for i in range( RecordNum ):
    TF[i, :] = keyWordInf[i, :] / totalWordsInRecord[i]
print( 'TF:\n', TF )

ExistKeyWord = keyWordInf.copy()
ExistKeyWord[ ExistKeyWord > 0 ] = 1

'''统计每个keyword在多少篇文献中出现'''
RecordNumWithKeyWord = np.zeros( keyWordNum )
for j in range( keyWordNum ):
    RecordNumWithKeyWord[j] = np.sum( ExistKeyWord[:, j] )

'''计算IDF:Inverse Document Frequency '''
IDF = np.zeros( keyWordNum )
for j in range( keyWordNum ):
    IDF[j] = np.log( RecordNum / (RecordNumWithKeyWord[j] + 1) )
print( 'IDF:\n', IDF )

'''计算:TF-IDF'''
TF_IDF = np.zeros( [RecordNum, keyWordNum] )
for i in range( RecordNum ):
    TF_IDF[i, :] = np.multiply( TF[i, :], IDF[:] ) * 100
print( 'TF_IDF:\n', TF_IDF )

作者:YangYF

你可能感兴趣的:(智能钻完井,Python在石油工程中应用,油田大数据)