Lesson 11 关键词提取实现
TF-IDF原理
决定当两个分词的词频一样,哪个更适合做关键词
在词频的基础上,对每个词分配一个权重,较少见的词分配较大的权重
词频(Term Frequency) 指的是某一个给定的词在该文档中出现的次数
逆文档频率(Inverse Document Frequency)IDF就是每个词的权重,它的大小与一个词的常见程度成反比
TF-IDF(Term Frequency-Inverse Document Frequency)权衡某个分词是否是关键词的指标,该值越大,是关键词的可能性就越大
TF计算公式
TF = 该词在文档中出现的次数
IDF计算公式
IDF = log(文档总数/(包含该词的文档数 +1))
文档向量化
假设有m篇文档d1, d2, d3, ... dm对它们进行分词,得到n个分词w1, w2, w3...wn,那么f(i,j)代表第i篇文章中,分词j出现的次数,可以用矩阵表示。
那么第i篇文章,可以使用第i行数据进行表示。
TF-IDF实现
Step 1: 按照中文分词和文件的关系创建DataFrame
import re
#匹配中文的分词
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
import jieba
segments = []
filePaths = []
for index, row in corpos.iterrows():
filePath = row['filePath']
fileContent = row['fileContent']
segs = jieba.cut(fileContent)
for seg in segs:
#只有中文分词才会添加到该文件分词列表中
if zhPattern.search(seg):
segments.append(seg)
filePaths.append(filePath)
segmentDF = pandas.DataFrame({
'filePath':filePaths,
'segment':segments
})
Step 2: 移除停用词(该步骤和之前的语料库准备步骤一致)
stopwords = pandas.read_csv(
"StopwordsCN.txt",
encoding='utf8',
index_col=False,
quoting=3,
sep="\t"
)
segmentDF = segmentDF[
~segmentDF.segment.isin(
stopwords.stopword
)
]
Step 3: 按文章进行词频统计, sample中用的order()函数已经过期,需替换成sort_values()
segStat = segmentDF.groupby(
by=["filePath", "segment"]
)["segment"].agg({
"计数":numpy.size
}).reset_index().sort_values(
"计数",
ascending=False
);
Step 4: 把小部分的数据删除掉
segStat = segStat[segStat.计数>1]
Step 5: 进行文本向量计算
#将DataFrame转成pivot table,进行文件与分词的交叉分析
TF = segStat.pivot_table(
index='filePath',
columns='segment',
values='计数',
fill_value=0
)
#套用公式,计算IDF值
def hanlder(x):
return (numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
IDF = TF.apply(hanlder)
#将TF*IDF得到TF_IDF值
TF_IDF = pandas.DataFrame(TF*IDF)
tag1s = []
tag2s = []
tag3s = []
tag4s = []
tag5s = []
#计算Top 5 分词,此处可以和前一课进行比较:tags = jieba.analyse.extract_tags(content, topK=5)
for filePath in TF_IDF.index:
tagis = TF_IDF.loc[filePath].sort_values(
ascending=False
)[:5].index
tag1s.append(tagis[0])
tag2s.append(tagis[1])
tag3s.append(tagis[2])
tag4s.append(tagis[3])
tag5s.append(tagis[4])
tagDF = pandas.DataFrame({
'filePath':corpos.filePath,
'fileContent':corpos.fileContent,
'tag1':tag1s,
'tag2':tag2s,
'tag3':tag3s,
'tag4':tag4s,
'tag5':tag5s
})