1. 程式人生 > >2、 python文字關鍵詞提取實現(案例)

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