您的位置:首页 > 编程语言 > Python开发

2、 python文本关键词提取实现(案例)

2018-12-11 10:00 716 查看

第一、理论准备

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

 

第二、案例代码实践

[code]
# 搭建语料库

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
});

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: