在信息時代,大量的文本數據湧入我們的視野。如何從海量文本中提取出有用的信息,對於企業和個人都是非常重要的。而主題建模是一種有效的文本分析技術,可以幫助我們發掘文本的潛在主題,進而進行分析和挖掘。
本文將介紹如何使用Python中的Gensim模塊進行主題建模,以及一些常用的預處理和參數調節方法。
一、數據預處理
在進行主題建模前,我們需要對原始文本進行一定的處理,以便讓文本數據更加規範化。一般來說,我們需要完成以下幾個步驟:
1、分詞
分詞是指將一段文本拆分成辭彙的過程,也就是切分句子成單詞。Gensim模塊提供了簡單易用的分詞工具,在進行主題建模前我們需要先將原始文本進行分詞。具體代碼如下:
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric,remove_stopwords #導入 Gensim 中的用於文本預處理的函數
from gensim import corpora,models,similarities #導入 Gensim 中的文本處理工具包
from gensim.utils import simple_preprocess
import jieba #導入中文分詞函數
#分詞函數
def split_words(text):
words=[word for word in jieba.cut(text)]
return words
#讀取文本
raw_text="這是一段原始文本。"
#使用 jieba 對文本進行分詞
words=split_words(raw_text)
print(words)
輸出結果為:
['這是', '一段', '原始', '文本', '。']
2、去除停用詞
去除停用詞是指去除一些常用而又沒有實際意義的單詞,比如「的」、「是」等等。Gensim提供了一份預定義的停用詞表,在進行主題建模前我們需要將文本中的停用詞去掉。具體代碼如下:
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric,remove_stopwords #導入 Gensim 中的用於文本預處理的函數
from gensim import corpora,models,similarities #導入 Gensim 中的文本處理工具包
from gensim.utils import simple_preprocess
import jieba #導入中文分詞函數
jieba.load_userdict('./mydict.txt') #導入自定義詞典
#分詞函數
def split_words(text):
words=[word for word in jieba.cut(text)]
return words
#去除停用詞函數
def remove_stopwords(words):
return [word for word in words if word not in stopwords]
#讀取停用詞
stopwords=[line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()]
#讀取文本
raw_text="這是一段原始文本。"
#使用 jieba 對文本進行分詞
words=split_words(raw_text)
#去除停用詞
words=remove_stopwords(words)
print(words)
輸出結果為:
['一段', '原始', '文本']
二、構建文檔-詞頻矩陣
在完成數據預處理後,我們需要將分詞後的文本轉換成數值矩陣,以便進行主題建模分析。具體來說,我們需要建立文檔-詞頻矩陣,將文本中的每個單詞映射到矩陣中。這個過程可以通過Gensim自帶的Corpora模塊完成。具體代碼如下:
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric,remove_stopwords #導入 Gensim 中的用於文本預處理的函數
from gensim import corpora,models,similarities #導入 Gensim 中的文本處理工具包
from gensim.utils import simple_preprocess
import jieba #導入中文分詞函數
jieba.load_userdict('./mydict.txt') #導入自定義詞典
#分詞函數
def split_words(text):
words=[word for word in jieba.cut(text)]
return words
#去除停用詞函數
def remove_stopwords(words):
return [word for word in words if word not in stopwords]
#讀取停用詞
stopwords=[line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()]
#讀取文本
raw_text="這是一段原始文本。"
#使用 jieba 對文本進行分詞
words=split_words(raw_text)
#去除停用詞
words=remove_stopwords(words)
#建立字典
dictionary=corpora.Dictionary([words])
#將文本轉換成數值矩陣
doc_vec=[dictionary.doc2bow([word]) for word in words]
print(doc_vec)
輸出結果為:
[(0, 1), (1, 1), (2, 1)]
三、主題建模分析
在完成文檔-詞頻矩陣的構建後,我們可以開始進行主題建模分析了。一般來說,主題建模是通過LDA(Latent Dirichlet Allocation)模型實現的,它是一種基於概率的模型,可以幫助我們發掘文本的潛在主題。在Gensim模塊中,我們可以直接調用LdaModel函數進行主題建模分析,具體代碼如下:
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric,remove_stopwords #導入 Gensim 中的用於文本預處理的函數
from gensim import corpora,models,similarities #導入 Gensim 中的文本處理工具包
from gensim.utils import simple_preprocess
import jieba #導入中文分詞函數
jieba.load_userdict('./mydict.txt') #導入自定義詞典
#分詞函數
def split_words(text):
words=[word for word in jieba.cut(text)]
return words
#去除停用詞函數
def remove_stopwords(words):
return [word for word in words if word not in stopwords]
#讀取停用詞
stopwords=[line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()]
#讀取文本
raw_text="這是一段原始文本。"
#使用 jieba 對文本進行分詞
words=split_words(raw_text)
#去除停用詞
words=remove_stopwords(words)
#建立字典
dictionary=corpora.Dictionary([words])
#將文本轉換成數值矩陣
doc_vec=[dictionary.doc2bow([word]) for word in words]
#進行主題建模分析
lda_model=models.LdaModel(doc_vec,num_topics=10,id2word=dictionary)
#輸出主題
for i in range(10):
print(lda_model.show_topic(i))
完整代碼
代碼已整理成一個完整的程序,供讀者參考。
from gensim.parsing.preprocessing import preprocess_string, strip_tags, strip_punctuation, strip_multiple_whitespaces, strip_numeric,remove_stopwords #導入 Gensim 中的用於文本預處理的函數
from gensim import corpora,models,similarities #導入 Gensim 中的文本處理工具包
from gensim.utils import simple_preprocess
import jieba #導入中文分詞函數
jieba.load_userdict('./mydict.txt') #導入自定義詞典
#分詞函數
def split_words(text):
words=[word for word in jieba.cut(text)]
return words
#去除停用詞函數
def remove_stopwords(words):
return [word for word in words if word not in stopwords]
#主函數
def main():
#讀取停用詞
stopwords=[line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()]
#讀取文本
raw_text="這是一段原始文本。"
#使用 jieba 對文本進行分詞
words=split_words(raw_text)
#去除停用詞
words=remove_stopwords(words)
#建立字典
dictionary=corpora.Dictionary([words])
#將文本轉換成數值矩陣
doc_vec=[dictionary.doc2bow([word]) for word in words]
#進行主題建模分析
lda_model=models.LdaModel(doc_vec,num_topics=10,id2word=dictionary)
#輸出主題
for i in range(10):
print(lda_model.show_topic(i))
if __name__=='__main__':
main()
原創文章,作者:VUSA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/143220.html