LDA用于文本的主题提取,关于它的理论知识看了很多,现在想在python环境下做一个实践。实践的数据集,英文的主要是希拉里的邮件数据集:
准备工作需要:
1、搭建python 环境
2、pip install gensim
3、安装nltk语言包
4、下载希拉里邮件数据集文件:HillaryEmails.csv
有币的同学可以在csdn里面找到。

#coding=utf8
import numpy as np
import pandas as pd
import re
from gensim import corpora, models, similarities
import gensim
from nltk.corpus import stopwordsdf = pd.read_csv("./input/HillaryEmails.csv")
df = df[[‘Id‘, ‘ExtractedBodyText‘]].dropna()def clean_email_text(text):text = text.replace(‘\n‘," ") #新行,我们是不需要的text = re.sub(r"-", " ", text) #把 "-" 的两个单词,分开。(比如:july-edu ==> july edu)text = re.sub(r"\d+/\d+/\d+", "", text) #日期,对主体模型没什么意义text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #时间,没意义text = re.sub(r"[\w]+@[\.\w]+", "", text) #邮件地址,没意义text = re.sub(r"/[a-zA-Z]*[:\//\]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i", "", text) #网址,没意义pure_text = ‘‘# 以防还有其他特殊字符(数字)等等,我们直接把他们loop一遍,过滤掉for letter in text:# 只留下字母和空格if letter.isalpha() or letter==‘ ‘:pure_text += letter# 再把那些去除特殊字符后落单的单词,直接排除。# 我们就只剩下有意义的单词了。text = ‘ ‘.join(word for word in pure_text.split() if len(word)>1)return textdocs = df[‘ExtractedBodyText‘]
docs = docs.apply(lambda s: clean_email_text(s))
doclist = docs.values
stopwords = set(stopwords.words(‘english‘))texts = [[word for word in doc.lower().split() if word not in stopwords] for doc in doclist]dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)print lda.print_topics(num_topics=20, num_words=5)

但是对于国内的应用来说,还是处理中文文本的情况占大多数,所以我刚开始在网易新闻、和讯网上自己做了一个文件集合,但是手工做还是非常费劲。无意中发现了前人整理的搜狐新闻数据集,数据量挺大的,分成了9个大类,每个大类2000个文档。
下载地址:https://pan.baidu.com/s/1gg2y3Gf 密码:hk3y

那就用这个文档好啦。
参考文章:https://www.mlln.cn/2018/02/07/gensim-lda-文档主题提取实现/

这个文章分词工具用的是 pyltp这个工具,百度了一下这个工具的安装似乎问题很多。于是我采用了熟悉的工具jieba。只要一个pip install jieba命令就安装成功了。

首先获得文件夹下的所有文档:

import os
def list_all_files(rootdir):_files = []list = os.listdir(rootdir) #列出文件夹下所有的目录与文件for i in range(0,len(list)):path = os.path.join(rootdir,list[i])if os.path.isdir(path):_files.extend(list_all_files(path))if os.path.isfile(path):_files.append(path)return _filesfiles=list_all_files('C:\\Users\\jack\\Desktop\\sohu_news\\SogouC.reduced\\Reduced\\C000013')
file_list=[]

定义停用词库,网上下载一个中文停用词库即可:

def stop(filepath):  stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8', errors='ignore').readlines()]  return stopwords  stopWords=stop("stop_words.txt")

定义去除标点符号的正则表达式pattern:

import re
pattern=re.compile(r'[-,$()#+&*《》<>。,、:“”()]')

下面就可以处理文档集合了,生成lda的语料集合:

import numpy as np
import pandas as pd
import re
import os
import jieba
import jieba.analysefor f in files:with open(f,'rb') as fr:print(f)f_read_decode=fr.read().decode('gb2312',errors='ignore')content=re.sub(pattern,"",f_read_decode)words=jieba.cut(content,cut_all='False')stayed_line=""for word in words:#            if word.encode("utf-8") not in stopWords:if word not in stopWords:#                print(word)stayed_line+=word+' 'con=list(stayed_line.split(' '))file_list.append(con)file_name.append(f.split('\\')[-1])

这里文档的格式gb2312,先用rb二进制格式读取,然后用gb2312格式进行decode。
直接用utf-8会读取成乱码。如何查看文档的编码格式呢。
参考文章:https://www.cnblogs.com/fanyuchen/p/7151584.html

import chardet
with open("C:\\Users\\fyc\\Desktop\\json.txt", "r") as f:text = f.read()type = chardet.detect(text)  #获取编码格式text1 = text.decode(type["encoding"])

一上完成之后,就可以往lda模型喂数据了,数据的格式是列表,每个列表的元素的是一个文档的词语列表,相当于一个一层嵌套。

from gensim import corpora,models,similarities
import gensim
dic = corpora.Dictionary(file_list)
clean_data = [dic.doc2bow(words) for words in file_list]lda = models.ldamodel.LdaModel(clean_data, id2word=dic,  num_topics=5)
# 查看主题
for topic in lda.print_topics(num_words=10):print(topic[1])

结果如下:

0.023*"
" + 0.003*"治疗" + 0.003*"中" + 0.003*"做" + 0.003*"医院" + 0.003*"nbsp" + 0.003*"企业" + 0.003*"工作" + 0.003*"说" + 0.002*"健康"
0.027*"
" + 0.006*"医院" + 0.004*"中" + 0.004*"治疗" + 0.004*"nbsp" + 0.003*"工作" + 0.003*"说" + 0.003*"做" + 0.003*"中国" + 0.002*"检查"
0.039*"
" + 0.006*"nbsp" + 0.004*"中" + 0.004*"医院" + 0.003*"药品" + 0.003*"gt" + 0.003*"时" + 0.002*"治疗" + 0.002*"企业" + 0.002*"做"
0.036*"
" + 0.004*"中" + 0.004*"医院" + 0.004*"说" + 0.003*"治疗" + 0.003*"卫生" + 0.003*"时" + 0.003*"手术" + 0.003*"企业" + 0.002*"医疗"
0.037*"
" + 0.015*"nbsp" + 0.003*"gt" + 0.003*"治疗" + 0.003*"医院" + 0.003*"
nbsp" + 0.003*"工作" + 0.003*"时" + 0.003*"说" + 0.002*"中"

改进意见:
因为我只用了其中一个健康的目录做实验,主题看起来差不多,而且有一些没有意义的词在分词之前没有处理,可以在停用词字典里面做加工。
另外在分词时可以加上词性标注,在结果中只取名词 动词等词性的词。

完整代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sat May 11 20:40:22 2019@author: jack
"""import numpy as np
import pandas as pd
import re
import os
import jieba
import jieba.analyse
from gensim import corpora,models,similarities
import gensim def stop(filepath):  stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8', errors='ignore').readlines()]  return stopwords  jieba.analyse.set_stop_words("stop_words.txt")
jieba.load_userdict("C:\\Users\\jack\\user_dict.txt")def list_all_files(rootdir):_files = []list = os.listdir(rootdir) #列出文件夹下所有的目录与文件for i in range(0,len(list)):path = os.path.join(rootdir,list[i])if os.path.isdir(path):_files.extend(list_all_files(path))if os.path.isfile(path):_files.append(path)return _filesfiles=list_all_files('C:\\Users\\jack\\Desktop\\sohu_news\\SogouC.reduced\\Reduced')
file_list=[]
file_name=[]
pattern=re.compile(r'[-,$()#+&*《》<>。,、:“”()]')
#stopWords=[]
#for word in open('stop_words.txt','r'):
#    stopWords.append(word.strip())
stopWords=stop("stop_words.txt")
print(stopWords)#print(files)
for f in files:with open(f,'rb') as fr:print(f)f_read_decode=fr.read().decode('gb2312',errors='ignore')content=re.sub(pattern,"",f_read_decode)words=jieba.cut(content,cut_all='False')stayed_line=""for word in words:
#            if word.encode("utf-8") not in stopWords:if word not in stopWords:
#                print(word)stayed_line+=word+' 'con=list(stayed_line.split(' '))
#        print(con)
#        print(con)file_list.append(con)file_name.append(f.split('\\')[-1])
#        print('\n')
#print(file_name)
#print(file_list[1])dic = corpora.Dictionary(file_list)
clean_data = [dic.doc2bow(words) for words in file_list]lda = models.ldamodel.LdaModel(clean_data, id2word=dic,  num_topics=5)
# 查看主题
for topic in lda.print_topics(num_words=10):print(topic[1])

全部集合的数据lda的结果如下:

0.020*"
" + 0.008*"网络" + 0.008*"系统" + 0.008*"中国" + 0.007*"信息" + 0.006*"日" + 0.006*"志愿" + 0.004*"技术" + 0.004*"第一" + 0.003*"美国"
0.054*"
" + 0.006*"说" + 0.005*"中" + 0.003*"中国" + 0.003*"时" + 0.003*"nbsp" + 0.003*"训练" + 0.002*"做" + 0.002*"工作" + 0.002*""
0.024*"
" + 0.008*"大学" + 0.007*"学生" + 0.006*"工作" + 0.006*"教育" + 0.005*"专业" + 0.005*"社会" + 0.005*"学校" + 0.004*"研究" + 0.004*"中"
0.023*"
" + 0.010*"中国" + 0.009*"nbsp" + 0.007*"美国" + 0.004*"军事" + 0.004*"日本" + 0.004*"发展" + 0.004*"导弹" + 0.004*"国家" + 0.003*"日"
0.015*"
" + 0.008*"工资" + 0.006*"会计" + 0.005*"投资" + 0.005*"元" + 0.004*"日" + 0.004*"银行" + 0.004*"航空" + 0.004*"贷款" + 0.003*"劳动"

感觉还是有提升的空间。

文本主题模型之LDA在搜狐新闻数据集上的实践相关推荐

  1. 世界更清晰,搜狐新闻客户端集成HUAWEI HiAI 亮相荣耀Play发布会!

    ​​6月6日,搭载有"很吓人"技术的荣耀Play正式发布,来自各个领域的大咖纷纷为新机搭载的惊艳技术站台打call,其中,搜狐公司董事局主席兼首席执行官张朝阳揭秘:华为和搜狐新闻客 ...

  2. R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)

    文本分析:主题建模 library(tidyverse) theme_set( theme_bw()) 目标 定义主题建模 解释Latent Dirichlet以及此过程的工作原理 演示如何使用LDA ...

  3. LDA文本主题模型的学习笔记

    引言 我们经常会听到LDA文本主题模型,经常用于文本分类.LDA由Blei, David M..Ng, Andrew Y..Jordan于2003年提出,用来推测文档的主题分布.它可以将文档集中每篇文 ...

  4. 自然语言处理之LDA:文本主题模型之隐含狄利克雷分布(LDA)

    自然语言处理之LDA:文本主题模型之隐含狄利克雷分布(LDA) 一.朴素贝叶斯分析 二.PLSA模型 三. 基本函数知识 3.1 词袋模型 3.2 二项分布 3.3 多项分布 3.4 Gamma函数 ...

  5. 文本主题模型之非负矩阵分解(NMF)

    1. 非负矩阵分解(NMF)概述 非负矩阵分解(non-negative matrix factorization,以下简称NMF)是一种非常常用的矩阵分解方法,它可以适用于很多领域,比如图像特征识别 ...

  6. 【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类

    一.概述 本实验做的是一个很常见的数据挖掘任务:新闻文本分类. 语料库来自于搜狗实验室2008年和2012年的搜狐新闻数据, 下载地址:https://www.sogou.com/labs/resou ...

  7. 机器学习之LSI:文本主题模型之潜在语义分析(LSI)

    机器学习之LSI:文本主题模型之潜在语义分析(LSI) 一.潜在语义分析(LSI)概述 二.LSI简单示例概述 三.LSI主题模型总结 四.代码实现 一.潜在语义分析(LSI)概述 潜在语义索引(La ...

  8. Python爬虫——主题爬取搜狐新闻(步骤及代码实现)

    目录 一 .实现思路 二.获取url变化规律 三.爬取新闻名称及其超链接 四.判断与主题的契合度 四.输出结果 五.总代码 一 .实现思路 本次爬取搜狐新闻时政类 获取url--爬取新闻名称及其超链接 ...

  9. 文本主题模型之潜在语义分析(LSA)

    转载地址:www.cnblogs.com/pinard/p/6805861.html 在文本挖掘中,主题模型是比较特殊的一块,它的思想不同于我们常用的机器学习算法,因此这里我们需要专门来总结文本主题模 ...

  10. 搜狐新闻文本分类:机器学习大乱斗

    目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差别 工具 深度学习:keras 传统机器学习:sklear ...

最新文章

  1. 一文讲透推荐系统提供web服务的2种方式
  2. xen虚拟化实战系列(一)之xen虚拟化环境安装
  3. ubuntu中supervisor的安装和学习
  4. socket connec连接超时处理
  5. numpy 转存为matlab_Numpy学习打卡task01
  6. linux php和java环境变量配置_Linux下配置Java环境变量
  7. lazada铺货模式的选品_Lazada的商业模式有哪些?要怎么做?
  8. 初学iBATIS的朋友,如果你不看我这篇文章,你一定后悔,因为它官方文档里面的示例少一个
  9. 挑战malloc极限,看看你的系统有多大的内存分配能力
  10. 程序员究竟还需要读书么?
  11. android svn新建分支,android studio中创建、切换svn分支
  12. 上海二手房价数据分析
  13. 如何用 Python 实现手机远程控制电脑
  14. 美女硕士养猪记:如何用大数据激活一头猪
  15. Anaconda3、TensorFlow和keras简单安装方法(较详细)
  16. 虚拟桌面的服务器,虚拟桌面与集合
  17. boost之内存管理
  18. 专接本计算机专业课难吗,河北计算机专业专接本难吗
  19. 关于sklearn因子分析(factor analysis)中因子旋转的问题
  20. 读书笔记 - 读 《乌合之众》 古斯塔夫-勒庞

热门文章

  1. 四核64位处理器,MIMX8MQ5DVAJZAB 满足智能设备应用
  2. x86服务器能装64位系统吗,x86处理器能装64位系统吗_64位系统装32位的可以么
  3. python文件的运行方法
  4. 链表的中间结点-python
  5. 顶部标题栏的布局设计
  6. Android 类似360 系统启动时间提示
  7. JavaScript运筹帷幄,掌控全局
  8. sd卡无法读取怎么修复?还能恢复数据吗?
  9. php 服务端埋点,客户端埋点方案总结
  10. 英特尔cpu与主板芯片组对应关系(包含12代)