文章目录:
-
一.词云技术
1.词云
2.安装WordCloud
-
二.WordCloud基本用法
1.快速入门
2.中文编码问题
3.词云形状化
-
三.文档主题模型
1.LDA主题模型
2.LDA安装过程
-
四.LDA基本用法及实例
1.初始化操作
2.计算文档主题分布
3.主题关键词的Top-N
4.可视化处理
-
五.总结
-
https://github.com/eastmountyxz/Python-zero2one
-
[Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解
-
[Python从零到壹] 十三.机器学习之聚类算法四万字总结(K-Means、BIRCH、树状聚类、MeanShift)
-
[Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。
近年来,词云热点技术和文档主题分布分析被更广泛地应用于数据分析中,通过词云热点技术形成类似云的彩色图片来聚集关键词,从视觉上呈现文档的热点关键词;通过文档主题分布识别文档库或知识语料中潜藏的主题信息,计算作者感兴趣的文档主题和每篇文档所涵盖的主题比例。本文主要介绍WordCloud技术的词云热点分布和LDA模型的主题分布,并结合真实的数据集进行讲解。
一.词云技术
1.词云
2.安装WordCloud
pip install WordCloud
pip install jieba
二.WordCloud基本用法
1.快速入门
贵州省 位于 中国 西南地区 简称 黔 贵
走遍 神州大地 醉美 多彩 贵州
贵阳市 贵州省 省会 林城 美誉
数据分析 数学 计算机科学 相结合 产物
回归 聚类 分类 算法 广泛应用 数据分析
数据 爬取 数据 存储 数据分析 紧密 相关 过程
甜美 爱情 苦涩 爱情
一只 鸡蛋 可以 画 无数次 一场 爱情 能
真 爱 往往 珍藏 平凡 普通 生活
# -*- coding: utf-8 -*-
#coding=utf-8
#By:Eastmount CSDN
import jieba
import sys
import matplotlib.pyplot as plt
from wordcloud import WordCloud
text = open('test.txt').read()
print(type(text))
wordlist = jieba.cut(text, cut_all = True)
wl_space_split = " ".join(wordlist)
print(wl_space_split)
my_wordcloud = WordCloud().generate(wl_space_split)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
import jieba
import sys
import matplotlib.pyplot as plt
from wordcloud import WordCloud
text = open('test.txt').read()
wordlist = jieba.cut(text, cut_all = True)
wl_space_split = " ".join(wordlist)
print(wl_space_split)
-
精确模式:该模式将句子最精确地切开,适合做文本分析。
-
全模式:将句子中所有可以成词的词语都扫描出来, 速度非常快,缺点是不能解决歧义问题。
-
搜索引擎模式:在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
#coding=utf-8
#By:Eastmount CSDN
import jieba
#全模式
text = "我来到北京清华大学"
seg_list = jieba.cut(text, cut_all=True)
print("[全模式]: ", "/ ".join(seg_list))
#[全模式]: 我 / 来到 / 北京 / 清华 / 清华大学 / 华大 /大学
#精确模式
seg_list = jieba.cut(text, cut_all=False)
print("[精确模式]: ", "/ ".join(seg_list))
#[精确模式]: 我 / 来到 / 北京 / 清华大学
#默认是精确模式
seg_list = jieba.cut(text)
print("[默认模式]: ", "/ ".join(seg_list))
#[默认模式]: 我 / 来到 / 北京 / 清华大学
#搜索引擎模式
seg_list = jieba.cut_for_search(text)
print("[搜索引擎模式]: ", "/ ".join(seg_list))
#[搜索引擎模式]: 我 / 来到 / 北京 / 清华 / 华大 / 大学 / 清华大学
# 读取mask/color图片
d = path.dirname(__file__)
nana_coloring = imread(path.join(d, "1.jpg"))
# 对分词后的文本生成词云
my_wordcloud = WordCloud( background_color = 'white', #背景颜色
mask = nana_coloring, #设置背景图片
max_words = 2000, #设置最大现实的字数
stopwords = STOPWORDS, #设置停用词
max_font_size = 200, #设置字体最大值
random_state = 30, #设置有多少种随机生成状态,即有多少种配色方案
)
# generate word cloud
my_wordcloud.generate(wl_space_split)
-
my_wordcloud = WordCloud().generate(wl_space_split)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
2.中文编码问题
-
wordcloud = WordCloud(font_path = ‘MSYH.TTF’).fit_words(word)
3.词云形状化
#coding=utf-8
#By:Eastmount CSDN
from os import path
from scipy.misc import imread
import jieba
import sys
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
# 打开本体TXT文件
text = open('data-fenci.txt').read()
# 结巴分词 cut_all=True 设置为全模式
wordlist = jieba.cut(text) #cut_all = True
# 使用空格连接 进行中文分词
wl_space_split = " ".join(wordlist)
print(wl_space_split)
# 读取mask/color图片
d = path.dirname(__file__)
nana_coloring = imread(path.join(d, "pic.png"))
# 对分词后的文本生成词云
my_wordcloud = WordCloud( background_color = 'white',
mask = nana_coloring,
max_words = 2000,
stopwords = STOPWORDS,
max_font_size = 50,
random_state = 30,
)
# generate word cloud
my_wordcloud.generate(wl_space_split)
# create coloring from image
image_colors = ImageColorGenerator(nana_coloring)
# recolor wordcloud and show
my_wordcloud.recolor(color_func=image_colors)
plt.imshow(my_wordcloud) # 显示词云图
plt.axis("off") # 是否显示x轴、y轴下标
plt.show()
# save img
my_wordcloud.to_file(path.join(d, "cloudimg.png"))
三.文档主题模型
1.LDA主题模型
-
从每篇网页D对应的多项分布θ中抽取每个单词对应的一个主题z。
-
从主题z对应的多项分布φ中抽取一个单词w。
-
重复步骤(1)(2),共计Nd次,直至遍历网页中每一个单词。
2.LDA安装过程
-
gensim:https://radimrehurek.com/gensim/models/ldamodel.html
-
scikit-learn:利用pip install sklearn命令安装扩展包,LatentDirichletAllocation函数即为LDA原型
-
github:https://github.com/ariddell/lda
-
pip install lda
四.LDA基本用法及实例
1.初始化操作
#coding=utf-8
#By:Eastmount CSDN
# coding:utf-8
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
#读取语料
corpus = []
for line in open('test.txt', 'r').readlines():
corpus.append(line.strip())
#将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer()
#计算个词语出现的次数
X = vectorizer.fit_transform(corpus)
#获取词袋中所有文本关键词
word = vectorizer.get_feature_names()
print('特征个数:', len(word))
for n in range(len(word)):
print(word[n],end=" ")
print('')
#查看词频结果
print(X.toarray())
#coding=utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
#读取语料
corpus = []
for line in open('test.txt', 'r').readlines():
corpus.append(line.strip())
#将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus) #计算个词语出现的次数
word = vectorizer.get_feature_names() #获取词袋中所有文本关键词
print('特征个数:', len(word))
for n in range(len(word)):
print(word[n],end=" ")
print('')
print(X.toarray()) #查看词频结果
#计算TF-IDF值
transformer = TfidfTransformer()
print(transformer)
tfidf = transformer.fit_transform(X) #将词频矩阵X统计成TF-IDF值
#查看数据结构 输出tf-idf权重
print(tfidf.toarray())
weight = tfidf.toarray()
model = lda.LDA(n_topics=3, n_iter=500, random_state=1)
model.fit(X)
#model.fit_transform(X)
2.计算文档主题分布
#coding=utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import lda
import numpy as np
#生成词频矩阵
corpus = []
for line in open('test.txt', 'r').readlines():
corpus.append(line.strip())
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
word = vectorizer.get_feature_names()
#LDA分布
model = lda.LDA(n_topics=3, n_iter=500, random_state=1)
model.fit(X)
#文档-主题(Document-Topic)分布
doc_topic = model.doc_topic_
print("shape: {}".format(doc_topic.shape))
for n in range(9):
topic_most_pr = doc_topic[n].argmax()
print(u"文档: {} 主题: {}".format(n,topic_most_pr))
3.主题关键词的Top-N
#主题-单词(Topic-Word)分布
word = vectorizer.get_feature_names()
topic_word = model.topic_word_
for w in word:
print(w,end=" ")
print('')
n = 5
for i, topic_dist in enumerate(topic_word):
topic_words = np.array(word)[np.argsort(topic_dist)][:-(n+1):-1]
print(u'*Topic {}n- {}'.format(i, ' '.join(topic_words)))
一只 一场 中国 产物 位于 分类 可以 回归 多彩 存储 平凡 广泛应用 往往 数学 数据 数据分析 无数次 普通 林城 爬取 爱情 珍藏 甜美 生活 相关 相结合 省会 神州大地 简称 算法 紧密 美誉 聚类 苦涩 西南地区 计算机科学 贵州 贵州省 贵阳市 走遍 过程 醉美 鸡蛋
*Topic 0
- 珍藏 多彩 林城 醉美 生活
*Topic 1
- 爱情 鸡蛋 苦涩 一场 中国
*Topic 2
- 数据分析 数据 聚类 数学 爬取
#主题-单词(Topic-Word)分布
print("shape: {}".format(topic_word.shape))
print(topic_word[:, :3])
for n in range(3):
sum_pr = sum(topic_word[n,:])
print("topic: {} sum: {}".format(n, sum_pr))
shape: (3L, 43L)
[[ 0.00060864 0.00060864 0.00060864]
[ 0.06999307 0.06999307 0.06999307]
[ 0.00051467 0.00051467 0.00051467]]
topic: 0 sum: 1.0
topic: 1 sum: 1.0
topic: 2 sum: 1.0
4.可视化处理
#coding=utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import lda
import numpy as np
#生词频矩阵
corpus = []
for line in open('test.txt', 'r').readlines():
corpus.append(line.strip())
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
#LDA分布
model = lda.LDA(n_topics=3, n_iter=500, random_state=1)
model.fit_transform(X)
#文档-主题(Document-Topic)分布
doc_topic = model.doc_topic_
print("shape: {}".format(doc_topic.shape))
for n in range(9):
topic_most_pr = doc_topic[n].argmax()
print("文档: {} 主题: {}".format(n+1,topic_most_pr))
#可视化分析
import matplotlib.pyplot as plt
f, ax= plt.subplots(9, 1, figsize=(10, 10), sharex=True)
for i, k in enumerate([0,1,2,3,4,5,6,7,8]):
ax[i].stem(doc_topic[k,:], linefmt='r-',
markerfmt='ro', basefmt='w-')
ax[i].set_xlim(-1, 3) #三个主题
ax[i].set_ylim(0, 1.0) #权重0-1之间
ax[i].set_ylabel("y")
ax[i].set_title("Document {}".format(k+1))
ax[4].set_xlabel("Topic")
plt.tight_layout()
plt.savefig("result.png")
plt.show()
文档: 1 主题: 1
文档: 2 主题: 0
文档: 3 主题: 2
文档: 4 主题: 2
文档: 5 主题: 0
文档: 6 主题: 2
文档: 7 主题: 1
文档: 8 主题: 1
文档: 9 主题: 0
#coding=utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import lda
import numpy as np
#生词频矩阵
corpus = []
for line in open('test.txt', 'r').readlines():
corpus.append(line.strip())
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
#LDA分布
model = lda.LDA(n_topics=3, n_iter=500, random_state=1)
model.fit_transform(X)
#文档-主题(Document-Topic)分布
doc_topic = model.doc_topic_
print("shape: {}".format(doc_topic.shape))
for n in range(9):
topic_most_pr = doc_topic[n].argmax()
print(u"文档: {} 主题: {}".format(n+1,topic_most_pr))
topic_word = model.topic_word_
#可视化分析
import matplotlib.pyplot as plt
f, ax= plt.subplots(3, 1, figsize=(8,6), sharex=True) #三个主题
for i, k in enumerate([0, 1, 2]):
ax[i].stem(topic_word[k,:], linefmt='b-',
markerfmt='bo', basefmt='w-')
ax[i].set_xlim(-1, 43) #单词43个
ax[i].set_ylim(0, 0.5) #单词出现频率
ax[i].set_ylabel("y")
ax[i].set_title("Topic {}".format(k))
ax[1].set_xlabel("word")
plt.tight_layout()
plt.savefig("result2.png")
plt.show()
五.总结
-
https://github.com/eastmountyxz/Python-zero2one
-
[1] 杨秀璋. 专栏:知识图谱、web数据挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.
-
[2] 杨秀璋. [python数据挖掘课程]十三.WordCloud词云配置过程及词频分析[EB/OL]. (2017-03-21)[2017-11-07]. http://blog.csdn.net/eastmount/article/details/64438407.
-
[3] 杨秀璋. [python] LDA处理文档主题分布及分词、词频、tfidf计算[EB/OL]. (2016-03-15)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50891162.
-
[4] 杨秀璋. [python] 使用scikit-learn工具计算文本TF-IDF值[EB/OL]. (2016-08-08)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50323063.
-
[5] 杨秀璋. [python] 基于k-means和tfidf的文本聚类代码简单实现[EBOL]. (2016-01-16)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50473675.
-
[6] Jiawei Han,Micheline Kamber著. 范明,孟小峰译. 数据挖掘概念与技术. 北京:机械工业出版社,2007.
-
[7] Github. WordCloud[EB/OL].(2017)[2017-12-01]. https://github.com/amueller/word_cloud.
-
[8] 半吊子全栈工匠. 10行python代码的词云[EB/OL]. (2017-03-06)[2017-12-01]. http://blog.csdn.net/wireless_com/article/details/60571394.
-
[9] 杨秀璋. [python] 使用Jieba工具中文分词及文本聚类概念[EB/OL]. (2015-12-11)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50256163.
-
[10] pypi官网. Python中文分词组件 jieba[EB/OL]. https://pypi.python.org/pypi/jieba/.
-
[11] scikit-learn官网. LatentDirichletAllocation[EB/OL]. http://www.scikit-learn.org/.
-
[12] gensim LDA下载地址[EB/OL]. https://radimrehurek.com/gensim/models/ldamodel.html
原文始发于微信公众号(娜璋AI安全之家):[Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论