在信息时代,大量的文本数据涌入我们的视野。如何从海量文本中提取出有用的信息,对于企业和个人都是非常重要的。而主题建模是一种有效的文本分析技术,可以帮助我们发掘文本的潜在主题,进而进行分析和挖掘。
本文将介绍如何使用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()