天天看點

機器學習實戰-文本模型

文本挖掘有時又被稱為文本資料挖掘,一般是指在文本處理過程中發現并提取其中的高品質資訊。高品質的資訊通常通過分類和預測來産生,如模式識别。文本資料是非結構化的資料,常用的文本挖掘分析技術有文本結構分析、文本摘要、文本分類、文本聚類、文本關聯分析、分布分析和趨勢預測。

文本挖掘方法有 :資訊檢索(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)

           

繼續閱讀