【火炉炼AI】机器学习042-NLP文本的主题建模

【火炉炼AI】机器学习042-NLP文本的主题建模

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)

文本的主题建模时用NLP来识别文本文档中隐藏的某种模式的过程,可以发现该文档的隐藏主题,以便对文档进行分析。主题建模的实现过程是,识别出某文本文档中最有意义,最能表征主题的词来实现主题分类,即寻找文本文档中的关键词,通过关键词就可以识别出某文档的隐藏主题。

1. 准备数据集

本次所用的数据集存放在一个txt文档中,故而需要从txt文档中加载该文本内容,然后再对这些文本进行预处理。由于预处理的步骤比较多,故而此处建立一个class来完成数据的加载和预处理过程,也使得代码看起来更简洁,更通用。

# 准备数据集,建一个class来加载数据集,对数据进行预处理
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
from nltk.stem.snowball import SnowballStemmer
from gensim import models, corpora

class DataSet:

    def __init__(self,txt_file_path):
        self.__txt_file=txt_file_path

    def __load_txt(self): # 从txt文档中加载文本内容,逐行读入
        with open(self.__txt_file,‘r‘) as file:
            content=file.readlines() # 一次性将所有的行都读入
        return [line[:-1] for line in content] # 去掉每一行末尾的\n

    def __tokenize(self,lines_list): # 预处理之一:对每一行文本进行分词
        tokenizer=RegexpTokenizer(‘\w+‘)
        # 此处用正则表达式分词器而不用word_tokenize的原因是:排除带有标点的单词
        return [tokenizer.tokenize(line.lower()) for line in lines_list]

    def __remove_stops(self,lines_list): # 预处理之二:对每一行取出停用词
        # 我们要删除一些停用词,避免这些词的噪声干扰,故而需要一个停用词表
        stop_words_list=stopwords.words(‘english‘)  # 获取英文停用词表
        return [[token for token in line if token not in stop_words_list]
                for line in lines_list]
        # 这儿有点难以理解,lines_list含有的元素也是list,这一个list就是一行文本,
        # 而一行文本内部有N个分词组成,故而lines_list可以看出二维数组,需要用两层generator

    def __word_stemm(self,lines_list): # 预处理之三:对每个分词进行词干提取
        stemmer=SnowballStemmer(‘english‘)
        return [[stemmer.stem(word) for word in line] for line in lines_list]

    def prepare(self):
        ‘‘‘供外部调用的函数,用于准备数据集‘‘‘
        # 先从txt文件中加载文本内容,再进行分词,再去除停用词,再进行词干提取
        stemmed_words=self.__word_stemm(self.__remove_stops(self.__tokenize(self.__load_txt())))
        # 后面的建模需要用到基于dict的词矩阵,故而先用corpora构建dict在建立词矩阵
        dict_words=corpora.Dictionary(stemmed_words)
        matrix_words=[dict_words.doc2bow(text) for text in stemmed_words]
        return dict_words, matrix_words 

    # 以下函数主要用于测试上面的几个函数是否运行正常
    def get_content(self):
        return self.__load_txt()

    def get_tokenize(self):
        return self.__tokenize(self.__load_txt())

    def get_remove_stops(self):
        return self.__remove_stops(self.__tokenize(self.__load_txt()))

    def get_word_stemm(self):
        return self.__word_stemm(self.__remove_stops(self.__tokenize(self.__load_txt())))

这个类是否运行正常,是否能够得到我们预期的结果了?可以用下面的代码来测试

# 检验上述DataSet类是否运行正常
dataset=DataSet("E:\PyProjects\DataSet\FireAI\data_topic_modeling.txt")

# 以下测试load_txt()函数是否正常
content=dataset.get_content()
print(len(content))
print(content[:3])

# 以下测试__tokenize()函数是否正常
tokenized=dataset.get_tokenize()
print(tokenized)

# 一下测试__remove_stops()函数是否正常
removed=dataset.get_remove_stops()
print(removed)

# 以下测试__word_stemm()函数是否正常
stemmed=dataset.get_word_stemm()
print(stemmed)

# 以下测试prepare函数是否正常
_,prepared=dataset.prepare()
print(prepared)

输出的运行结果比较长,可以看我的github源代码。

2. 构建模型,训练数据集

我们用LDA模型(Latent Dirichlet Allocation, LDA)做主题建模,如下:

# 获取数据集
dataset=DataSet("E:\PyProjects\DataSet\FireAI\data_topic_modeling.txt")
dict_words, matrix_words =dataset.prepare()

# 使用LDAModel建模
lda_model=models.ldamodel.LdaModel(matrix_words,num_topics=2,
                           id2word=dict_words,passes=25)
# 此处假设原始文档有两个主题

上面的代码会建立LDAModel并对模型进行训练,需要注意,LDAModel位于gensim模块中,这个模块需要自己用pip install gensim来安装,安装之后才能使用。

LDAModel会计算每个单词的重要性,然后建立重要性计算方程,依靠此方程来给出预测主题。

如下代码可以打印出该重要性方程:

# 查看模型中最重要的N个单词
print(‘Most important words to topics: ‘)
for item in lda_model.print_topics(num_topics=2,num_words=5):
    # 此处只打印最重要的5个单词
    print(‘Topic: {}, words: {}‘.format(item[0],item[1]))

-------------------------------------输---------出--------------------------------

Most important words to topics:

Topic: 0, words: 0.075"need" + 0.053"order" + 0.032"system" + 0.032"encrypt" + 0.032"work"

Topic: 1, words: 0.037"younger" + 0.037"develop" + 0.037"promot" + 0.037"talent" + 0.037"train"

--------------------------------------------完-------------------------------------

########################小**********结###############################

1,一般机器学习项目需要我们自己处理的内容都是数据集方面,可以将数据集处理过程写成一个专门的class,比如上面我把文本预处理过程写在class里面,每一个函数代表一种预处理方式,这样条理清楚,具有一定通用性。

2,此处我们使用gensim模块中的LDAModel来做主题建模,gensim模块是一个非常有用的NLP处理工具,在文本内容分析中应用较多。

#################################################################

注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

原文地址:https://www.cnblogs.com/RayDean/p/9810117.html

时间: 2024-08-29 09:57:36

【火炉炼AI】机器学习042-NLP文本的主题建模的相关文章

【火炉炼AI】机器学习007-用随机森林构建共享单车需求预测模型

[火炉炼AI]机器学习007-用随机森林构建共享单车需求预测模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 共享单车是最近几年才发展起来的一种便民交通工具,基本上是我等屌丝上班,下班,相亲,泡妞必备神器.本项目拟使用随机森林回归器构建共享单车需求预测模型,从而查看各种不同的条件下,共享单车的需求量. 1. 准备数据集 本次使用的数据集来源于加利福尼亚大学欧文分校(UCI)大学的公

【火炉炼AI】机器学习006-用决策树回归器构建房价评估模型

[火炉炼AI]机器学习006-用决策树回归器构建房价评估模型 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 最近几十年,房价一直是中国老百姓心中永远的痛,有人说,中国房价就像女人的无肩带文胸,一半人在疑惑:是什么支撑了它?另一半人在等待:什么时候掉下去? 而女人,永不可能让它掉下来.就算快掉下来了,提一提还是又上去了..... 虽然我们不能预测中国房价什么时候崩盘,但是却可以用机器学

【火炉炼AI】机器学习019-项目案例:使用SVM回归器估算交通流量

[火炉炼AI]机器学习019-项目案例:使用SVM回归器估算交通流量 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 我们都知道,SVM是一个很好地分类器,不仅适用于线性分类模型,而且还适用于非线性模型,但是,在另一方面,SVM不仅可以用于解决分类问题,还可以用于解决回归问题. 本项目打算使用SVM回归器来估算交通流量,所使用的方法和过程与我的上一篇文章[火炉炼AI]机器学习018-项

【火炉炼AI】机器学习017-使用GridSearch搜索最佳参数组合

[火炉炼AI]机器学习017-使用GridSearch搜索最佳参数组合 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 在前面的文章([火炉炼AI]机器学习012-用随机森林构建汽车评估模型及模型的优化提升方法),我们使用了验证曲线来优化模型的超参数,但是使用验证曲线难以同时优化多个参数的取值,只能一个参数一个参数的优化,从而获取每个参数的最优值,但是有时候,一个非常优秀的模型,可能A

【火炉炼AI】机器学习018-项目案例:根据大楼进出人数预测是否举办活动

[火炉炼AI]机器学习018-项目案例:根据大楼进出人数预测是否举办活动 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 我们经常看到办公大楼中人来人往,进进出出,在平时没有什么活动的时候,进出大楼的人数会非常少,而一旦举办有大型商业活动,则人山人海,熙熙攘攘,所以很明显,大楼进出的人数和大楼是否举办活动有很明显的关联,那么,是否可以构建一个模型,通过大楼进出人数来预测该大楼是否在举办

【火炉炼AI】机器学习046-图像边缘的检测方法

[火炉炼AI]机器学习046-图像边缘的检测方法 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 图像中各种形状的检测时计算机视觉领域中非常常见的技术之一,特别是图像中直线的检测,圆的检测,图像边缘的检测等,下面我们来研究一下如何快速检测图像边缘. 边缘是不同区域的分界线,是周围(局部)像素有显著变化的像素的集合,有幅值与方向两个属性.这个不是绝对的定义,主要记住边缘是局部特征以及周围

【火炉炼AI】机器学习048-Harris检测图像角点

[火炉炼AI]机器学习048-Harris检测图像角点 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 角点检测算法大致有三类:基于灰度图像的角点检测,基于二值图像的角点检测,基于轮廓曲线的角点检测.基于灰度图像的角点检测又可分为基于梯度.基于模板和基于模板梯度组合3类方法,其中基于模板的方法主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点亮度对比足够大的点定义为角点.常见的基

【火炉炼AI】机器学习050-提取图像的Star特征

[火炉炼AI]机器学习050-提取图像的Star特征 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 ) 对于图像的特征点,前面我们讨论过边缘检测方法,Harris角点检测算法等,这些检测算法检测的都是图像的轮廓边缘,而不是内部细节,如果要进一步提取图像内部细节方面的特征,需要用到SIFT特征提取器和Star特征提取器.上一篇我们讲解了SIFT特征提取器,下面我们来介绍Star特征提取器.

【火炉炼AI】深度学习005-简单几行Keras代码解决二分类问题

[火炉炼AI]深度学习005-简单几行Keras代码解决二分类问题 (本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, Keras 2.1.6, Tensorflow 1.9.0) 很多文章和教材都是用MNIST数据集作为深度学习届的"Hello World"程序,但是这个数据集有一个很大的特点:它是一个典型的多分类问题(一共有10个分类),在我们刚刚开始接触深度学习时,我倒是觉得