文本挖掘有時又被稱為文本資料挖掘,一般是指在文本處理過程中發現并提取其中的高品質資訊。高品質的資訊通常通過分類和預測來産生,如模式識别。文本資料是非結構化的資料,常用的文本挖掘分析技術有文本結構分析、文本摘要、文本分類、文本聚類、文本關聯分析、分布分析和趨勢預測。
文本挖掘方法有 :資訊檢索(IR)、自然語言處理(NLP)、文本資訊提取(IE)、文本摘要、無監督學習方法(文本)、監督學習方法(文本)、
文本挖掘的機率方法、文本流和社交媒體挖掘、觀點挖掘與情感分析、生物醫學文本挖掘等。
文本分析是指對文本的表示及其特征項的選取,它是文本挖掘、資訊檢索的基本問題,用于把從文本中抽取出的特征詞進行量化來表示文本資訊。
本章針對中文文本《紅樓夢》建立LDA主題模型,步驟如下。
(1)資料準備。
(2)進行分詞,統計詞頻,建立LDA主題模型并對結果進行分析
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy as sp
from matplotlib.font_manager import FontProperties
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer
%matplotlib inline
%config InlinebBackend.figure_format="retina"
fonts=FontProperties(fname="C:/Windows/Fonts/SIMYOU.TTF/",size=15)#打開控制台檢視字型找到自帶的字型
相對于英文來說,中文文本挖掘面臨的首要問題是分詞,因為中文詞與詞之間沒有向英文一樣的空格,是以計算機不能像識别英文單詞那樣識别單個詞語。
在python中可以使用jieba庫來進行中文分詞。
該庫支援3種分詞模式:
(1)精準模式,試圖将句子最精确地切開,适合多種文本分析方法
(2)全模式,把句子中所有可能成為詞語的詞都掃描出來,速度非常快但是不能解決詞語的歧義問題;
(3)搜尋引擎模式,在精準模式的基礎上,對長詞再次切分,提高召回率,适合用于搜尋引擎分詞。
stopword=pd.read_csv("紅樓夢停用詞.txt",header=None,names=["Stopwords"])
# print(stopword)
#讀取紅樓夢資料集
Red_df=pd.read_excel("紅樓夢資料集.xlsx")
Red_df.head(5)

在使用jieba分詞時,其中一個重要的資料集就是自定義詞典,詞典會影響到分詞的效果,尤其是針對特有的人名、地名等。下面首先分析在沒有外部字典時針對
第三章名稱的分詞結果。
import jieba
list(jieba.cut(Red_df.ChapName[2],cut_all=True))#cut_all=True時為全分詞模式
list(jieba.cut(Red_df.ChapName[2]))#不指定時預設為精準分詞
#添加自定義詞典
jieba.load_userdict("紅樓夢詞典.txt")
list(jieba.cut(Red_df.ChapName[2],cut_all=True))
list(jieba.cut(Red_df.ChapName[2]))
可以看到4種模式下相同的句子得到了不一樣的結果,而外部字典對分詞結果影響較大,很多時候合适的外部詞典能夠達到更好的分詞效果。以下是針對整本書進
行分詞
row,col=Red_df.shape
Red_df["cutword"]="cutword"#預定義清單
for ii in np.arange(row):
#分詞
cutwords=list(jieba.cut(Red_df.Artical[ii],cut_all=True))
#去除長度為1的詞
cutwords=pd.Series(cutwords)[pd.Series(cutwords).apply(len)>1]
#去停用詞
cutword=cutwords[~cutwords.isin(stopword)]
Red_df.cutword[ii]=cutwords.values
#檢視全文的部分分詞結果
Red_df.cutword[1:5]
上面的程式使用for循環來完成對120章節的分詞,使用的是全分詞模式(cut_all=True),使用apply(len)>1方法隻保留詞長度大于1的詞語,并使用
cutwords[~cutwords.isin(stopword)]操作去除了停用詞
在機器學習和自然語言處理等領域,主題模型(Topic Model)是用來在一系列文檔中發現抽象主題的一種模型。如果一篇文章有一個中心思想,那麼一些特定的
詞語會更頻繁地出現。比如,一篇文章是關于狗的内容,那麼“狗”“骨頭”等詞出現的頻率就會高些。主題模型自動分析每個文檔,統計文檔内的詞語,根據
統計的資訊來斷定目前文檔含有哪些主題,以及每個主題所占的比例。
對《紅樓夢》120章文本進行LDA主題模型分析,然後對主題模型結果進行可視化,以加深對模型結果的了解。使用gensim庫中的LDA主題模型類LdaModel對資料
進行模組化。
import gensim
from gensim.corpora import Dictionary
from gensim.models.ldamodel import LdaModel
#将分好的詞和它對應的ID規範化封裝
dictionary=Dictionary(Red_df.cutword)
#将單詞集合轉化為(word_id,word_frequency)二進制組成式的清單
corpus=[dictionary.doc2bow(word) for word in Red_df.cutword]
#LDA主題模型
lda=LdaModel(corpus=corpus,id2word=dictionary,num_topics=4,random_state=12)
#輸出其中的幾個主題
lda.print_topics(2)
代碼解釋
針對分詞後的資料集先使用Dictionary進行處理,将單詞集合轉化為(word_id,word_frequency)二進制組形式的清單作為分詞後的語料庫;再使用LdaModel
建立LDA主題模型,并使用參數num_topics=4指定主題個數,得到模型lda;最後輸出其中兩個進行檢視
接下來使用pyLDAvis庫對LDA主題模型進行可視化。
import pyLDAvis
import pyLDAvis.gensim
red_vis_data=pyLDAvis.gensim.prepare(lda,corpus,dictionary)
pyLDAvis.display(red_vis_data)