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

第一、理论准备

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

猜你喜欢

转载自blog.csdn.net/qq_36327687/article/details/84943046