整体思路
1.从数据库中取出文本内容,放进列表
2.遍历列表,使用Jieba对文本内容进行关键词抽取
3.使用WordCloud生成词云图片
一、使用SQL语句获取文本内容列表
def getText():
# 连接数据库
db = pymysql.connect("175.24.32.214", "sa", "123456", "weibo", charset='utf8')
try:
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# 获取微博内容数据
sql = 'select text from weibo where user_id="2730402964";'
cursor.execute(sql)
# 直接通过数据库查询获取的是((1,张三,男),(2,李四,女))这样的元组格式:
# 每条记录通过元组记录属性值,同时每条记录作为一个元组元素组成查询结果元组
results = cursor.fetchall()
# 将微博内容放入contents列表
contents = []
for re in results:
#只取了text属性值,可直接extend
contents.extend(re)
# 关闭数据库连接
db.close()
# 返回微博内容列表contents
return contents
except Exception as e:
print("出错:")
db.rollback()
print(e)
二、使用Jieba抽取关键词
使用Jieba中基于 TF-IDF 算法的关键词抽取
- TF-IDF 算法简介:
(1)简单讲,TF(词频)和IDF(逆文档频率)的计算公式如下:
(2)TF为关键词在文章中的出现频率,IDF为关键词在语料库中的常见程度。
(分母+1是为防止关键词在语料库文档中出现次数为0;分母越小,IDF越大,关键词在语料库中越不常见)(3)最终TF-IDF权重值 = IF * TDF,即关键词在文章中出现次数越多,且在语料库中越不常见,则权重值越高。
- 在Jieba中使用TF-IDF算法:
为去除一些分析意义不大但出现频率很高的词,可设置停用词表来对取消对相应词汇的统计,代码如下:
jieba.analyse.set_stop_words(file_name) # file_name为自定义停用词表路径,每行一个词
提取文本关键词代码:
jieba.analyse.extract_tags(text, topK=20, withWeight=False, allowPOS=())
各参数含义如下:
参数名 | 作用 |
text | 要分析的文本内容 |
topK | 返回权重最大的关键词个数,默认 20 |
withWeight | 是否返回关键词权重值,默认值为 False |
allowPOS | 是否返回仅包括指定词性的词,默认值为空 |
其中allowPOS常用的词性有:
缩写 | 词性 |
a | 形容词 |
d | 副词 |
e | 叹词 |
i | 成语 |
m | 数词 |
n | 名词 |
nr | 人名 |
ns | 地名 |
nt | 机构名 |
o | 拟声词 |
v | 动词 |
详细可参考 => 词性标注表
附上项目中使用代码:
# 从数据库获取微博内容列表
text = getText()
# 存放分词结果列表
words = []
# 使用jieba获取微博内容分词结果
for content in text:
jieba.analyse.set_stop_words("stopwords.txt") ##设置停用词表,这些词便不会加入统计计算。
word = list(jieba.analyse.extract_tags(content))
words.extend(word)
三、使用WordCloud生成词云
这部分比较简单,直接附代码:
#参数words为关键词列表,img_file为背景图片文件路径
def generate_img(words, img_file):
data = ' '.join(word[0] for word in words)
# 将图片作为词云背景
image_coloring = imread(img_file)
wc = WordCloud(
background_color='white',
mask=image_coloring,
font_path='C:\Windows\Fonts\msyh.ttc',
collocations=False,
max_words=150,
min_font_size=5,
max_font_size=40
)
wc.generate(data)
wc.to_file('test.png')
结果图如下:
词云生成结果的效果可以根据参数来进行调整,词云生成参数网上一大堆,就不再搬运了。
代码链接先占个坑,项目全部完成后传到github上。