1. 程式人生 > >數據挖掘——文本挖掘-關鍵字提取

數據挖掘——文本挖掘-關鍵字提取

得到 port erro 可能性 路徑 rac 權重 trac style

基於jieba包的自動提取

  關鍵方法:jieba.analyse.extract_tags(content,topK=n)

  具體思路:通過jieba包自帶的extract_tags方法,在遍歷讀取文件內容時,獲得每篇文檔前n個關鍵字

 使用的包: 

import os
import codecs
import pandas as pd
import jieba
import jieba.analyse

 過程:

‘‘‘定義變量
文件路徑/文件內容/關鍵字(5個)‘‘‘
filepaths = []
contents =[]
tag1 = []
tag2 = []
tag3 = []
tag4 
= [] tag5 = [] #遍歷文件,同時得到關鍵字 for root, dirs, files in os.walk( rpath): for name in files: filepath = root + \\ +name #根目錄加文件名構成文件路徑 f = codecs.open(filepath,r,utf-8) #根據文件路徑以只讀的形式打開文件 content = f.read().strip() #將文件內容傳入content變量 f.close() #關閉文件
tags = jieba.analyse.extract_tags(content,topK=5) #根據文件內容獲取前5個關鍵字(出現次數最多) filepaths.append(filepath) #得到文件路徑的集合 contents.append(content) #得到文件內容的集合 tag1.append(tags[0]) tag2.append(tags[1]) tag3.append(tags[2]) tag4.append(tags[3]) tag5.append(tags[
4]) tagDF = pd.DataFrame({ 文件路徑:filepaths, 文件內容:contents, 關鍵詞1:tag1, 關鍵詞2:tag2, 關鍵詞3:tag3, 關鍵詞4:tag4, 關鍵詞5:tag5})

  最終得到包含文件路徑,文件內容,和每篇5個關鍵字的數據框

基於TF-IDF算法的手動提取

  關鍵:基於TF-IDF原理,引入分詞權重的概念

  詞頻(TF)
  逆文檔頻率(IDF):詞的權重,即詞的重要程度
  TF-IDF:權衡某個分詞是否關鍵詞的指標,值越大,是關鍵字的可能性就越大

  TF-IDF的計算公式:
  TF=該詞在文檔中出現的次數
  IDF=log[文檔總數/(包含該詞的文檔數+1)]
  TF-IDF = TF*IDF

  Tips:只提取中文關鍵字,用正則表達式判斷分詞是否為中文

  具體實現:

  #創建語料庫,導入停用詞

  #獲得分詞結果

import re
zh = re.compile(u[\u4e00-\u9fa5]+)    
import jieba
segments = []
filepath = []
#導入停用詞    
stopwords = pd.read_csv(rpath,encoding=utf-8,index_col=False)

for index, row in corpos.iterrows(): 
    filePath = row[filePath]  
    fileContent = row[fileContent] 
    segs = jieba.cut(fileContent)  
    for seg in segs:
        if zh.search(seg):  #只匹配中文分詞
             if (seg not in stopwords.stopword.values) and (len(seg.strip())>1): #取非停用詞和長度>1的詞
                 segments.append(seg)
                 filepath.append(filePath)

segmeng_DF = pd.DataFrame({
        segment: segments,
        filePath: filepath})

  #詞頻統計

import numpy as np
segcount = segmeng_DF.groupby(by=[filePath,segment
                    ])[segment].agg({詞頻:np.size}
                    ).reset_index().sort_values(by=[詞頻],ascending=False) 
segcount = segcount[segcount.詞頻 > 1] #只取詞頻大於1的分詞

  #詞頻向量化運算  

TF =segcount.pivot_table(index=filePath,
                         columns=segment,
                         values=詞頻,
                         fill_value=0)
TF.columns #列名是各篇文章的分詞集合

  #根據公式分別得到IDF和TF-IDF的值

def hanlder(x):
    return (np.log2(len(corpos) / (np.sum(x>0)+1)))

IDF = TF.apply(hanlder)  #結果是各分詞的權重

TF_IDF = pd.DataFrame(TF*IDF)

TF_IDF.columns #列名是各篇文章的分詞集合
TF_IDF.index #索引是文件路徑

  #獲取關鍵字

tag1 = []
tag2 = []
tag3 = []
tag4 = []
tag5 = []

for filePath in TF_IDF.index:
    tagis = TF_IDF.loc[filePath].sort_values(ascending=False)[:5].index
    tag1.append(tagis[0]) 
    tag2.append(tagis[1])
    tag3.append(tagis[2])
    tag4.append(tagis[3])
    tag5.append(tagis[4])

  #最後得到包含文件路徑,文件內容,和每篇5個關鍵字數據框

  

數據挖掘——文本挖掘-關鍵字提取