第一、理论准备
1交叉计数函数
pivot_table(value,index,columns,aggfunc,fill_value)
# 参数说明
values:数据透视表中的值
index:数据透视表中的行(索引)
columns;数据透视表中的列
aggfunc:统计函数
fill_value:NA值的统一替换。
# 返回只说明:
数据透视表的结果
2 IDF 公式的实现程序:
IDF=log(文档总数/(包含该词的文档数)+1)
代码实现:
def hanlder(x):
return(numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
IDF=TF.apply(hanlder)
# 词频 TF
# 逆文档频率 IDF 是一个词的权重,它的大小与一个词的常见程度成反比
IDF=log(文档总数/(包含该词的文档数)+1)
# TF-IDF 权衡某个分词是否是关键词的指标,该值越大,是关键词的可能性也就越大。
TF-IDF=TF*IDF
第二、案例代码实践
# 搭建语料库
import os
import os.path
import codecs
filepaths = [];
filecontents = [];
for root, dirs, files in os.walk(
"D:\\database\\python\\2.7\\mini\\Sample"
):
for name in files:
filepath = os.path.join(root,name);
filepaths.append(filepath);
f = codecs.open(filepath,'r','utf-8');
filecontent = f.read()
f.close()
filecontents.append(filecontent)
import pandas;
corpos = pandas.DataFrame({
'filepath':filepaths,
'filecontent':filecontents
});
#词频分词
import re
# 匹配中文的分词
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
import jieba
segments = []
filepaths = []
for root, 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({
'segment':segments,
'filepath':filepaths});
# 移除停用词
stopwords= pandas.read_csv(
'D:\\database\\python\\2.7\\StopwordsCN.txt',
encoding='utf-8',
index_col=False,
quoting=3,
sep="\t")
segmentDF=segmentDF[
~segmentDF.segment.isin(stopwords.stopword)]
# 词频统计
import numpy;
segstat = segmentDF.groupby(
by=["segment","filepath"])["segment"].agg({
"计数":numpy.size
}).reset_index().sort_values(
'计数',
ascending=False)
#删除小部分数据
segstat=segstat[segstat.计数>1]
# 进行文本向量统计
TF=segstat.pivot_table(
values='计数',
index='filepath',
columns='segment',
fill_value=0
)
TF.index
TF.columns
def hanlder(x):
return(numpy.log2(len(corpos)/(numpy.sum(x>0)+1)))
IDF=TF.apply(hanlder)
TF_IDF=pandas.DataFrame(TF*IDF)
tag1s=[]
tag2s=[]
tag3s=[]
tag4s=[]
tag5s=[]
for filepath in TF_IDF.index:
tags=TF_IDF.loc[filepath].sort_values(
ascending=False
)[:5].index
tag1s.append(tags[0])
tag2s.append(tags[1])
tag3s.append(tags[2])
tag4s.append(tags[3])
tag5s.append(tags[4])
tagDF = pandas.DataFrame({
'filepath':corpos.filepath,
'filecontent':corpos.filecontent,
#### 注意这块必须锁定是corops里边的数据
###否则,因为调取长度导致错误
'tag1':tag1s,
'tag2':tag2s,
'tag3':tag3s,
'tag4':tag4s,
'tag5':tag5s
});