写在前面的话
9月份的第一篇blog, 正好是开学季,作为一个学生,hahahha, 我还是正正经经的贡献一篇认为比较干货的文章给大家吧。
我自己是花了很多时间去看懂LDA的算法了,当然了这篇文章不涉及我们具体的原理。为什么呢,我觉得你还是要搞懂的,其实不是很难,当然如果你看到数学就头大的话,并且你是个害怕困难的人,那就当我说的是错的。如果你很喜欢研究,很喜欢挑战,很喜欢思考的话,我相信你一定会和我一样爱上我们的LDA的算法。
因为很巧妙,逻辑思维很高杠的,就是特别帅气的一个棒呆吊炸天的逻辑思维的烟花盛宴把。
LDA是经典的主题模型算法,今天主要讲的是代码实现,原理部分真的是一大篇一大篇的数学公式,觉得打出来我这一天就等于废了,时间比较宝贵,直接来点实际的比较好。
本文主要是依托了sklearn 来实现LDA
具体的文档请看: sklearn.decomposition.LatentDirichletAllocation
LDA主题模型的实现和调参
1.语料库的加载
一般我们要处理文本,最重要的就是要想清楚我们的语料库是什么,在topic model 中语料可能对我们的实验结果是会有很多的影响的。
首先我们就是要加载我们要处理的文本。
假设我们的数据都放在了某个路径下面,我们把这个路径赋值给path,path这个路径下面有很多我们自己收集整理的文档。
在我写的代码里,我把我处理的每一个文档看做是一个语料库,根据每个人的需要不同,你的语料库可能就是整个文档的集合,代码是有所不同的。
所以我们先要加载文档:
fileList = os.listdir(path)
for file in fileList:
docList = []
filePath = os.path.join(path,file)
f = open(filePath)
doc = f.readlines()
f.close()
for line in doc:
line = line.replace('\n',"")
newline = line.decode('utf-8','ignore').encode('utf-8')
这里我们有一行代码需要做一些说明就是
newline = line.decode('utf-8','ignore').encode('utf-8')
因为有的输入可能不能正确的解析,就会报错,一般就是解码的错误,对于解码的错误我的博客也做过详细的笔记,大家可以查看一下。
当然,如果出现什么utf8 不能正确的解码我们的asci 的编码的问题,我们可以在脚本开始的时候这么做:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
在这里,我把每一行都做一些预处理,关于预处理以及其中的一些基本概念的话,你可以看我前面的一篇文章:自然语言处理中预处理的一些常用操作
在这里我是对每一行单独进行一个预处理
在这里我们对我们的文本进行预处理,需要用到的库就是我们的nltk,在 使用之前可以先自己安装一下
比如一种安装方法就是:
sudo pip install nltk
还可以尝试一些其他的安装方法:
sudo apt-get install nltk
关于nltk 的安装方法可以自行上网搜索,并且实践一下,不难的。
这个时候我们对文本信息进行预处理的话,我们就需要把我们的这个库导入;
在这次编程中我们使用到的文本处理的库导入如下:
import string
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
导入库之后 ,我们就可以进行一些预处理操作,预处理操作一般就是把文字全部转换为小写,删除标点,删除停顿词,删除一些不是英文的字符(在这里我们处理的是英文的文本),删除数字以及一些特殊的字符,分词,提取词干,具体这些词是什么意思,可以看我之前写的一些文章。里面会有详细的介绍。
如果你的文本不是经过矫正的,那么我们还需要修改一些错误,比如你们的文本输入是大众的输入,那么这些输入可能含有很多的错误,我们可以用TextBlob 来做我们的修正。
下面的这个版本的话是比较简单的预处理,
#***********************************
# The general preprocessing steps
#***********************************
def Preprocessing(text):
# 将文本转成小写
text = text.lower()
# 删除我们的标点符号,
for c in string.punctuation:
text = text.replace(c," ")
# 分词
wordList = nltk.word_tokenize(text