您的位置:

使用Python Gensim实现主题建模:简单有效的文本分析技术

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

本文将介绍如何使用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()