數據挖掘——文本挖掘-關鍵字提取
阿新 • • 發佈:2018-09-22
得到 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( r‘path‘): 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(r‘path‘,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個關鍵字數據框
數據挖掘——文本挖掘-關鍵字提取