机器学习实战-文本模型

文本挖掘有时又被称为文本数据挖掘,一般是指在文本处理过程中发现并提取其中的高质量信息。高质量的信息通常通过分类和预测来产生,如模式识别。文本数据是非结构化的数据,常用的文本挖掘分析技术有文本结构分析、文本摘要、文本分类、文本聚类、文本关联分析、分布分析和趋势预测。
文本挖掘方法有 :信息检索(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)


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部