【带你玩转主题模型Topic Model】—— 之 利用sklearn 实现Latetnt Dirichlet Allocation(LDA)主题模型

写在前面的话

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
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值