在中文的文本挖掘中,对海量文本进行准确分词是其中至关重要一步。当前的Python语言下存在多种开源文本分析包,其中jieba这个包能够提供相对高效的分词方案。

结合jieba代码和一些相关资料,基本得知jieba是基于Trie树结构实现的高效词图扫描,生成句子中汉字所有可能成词情况的有向无环图(DAG)。 结巴分词中自带了一个叫做dict.txt的词典,里面包含词,词条出现次数(基于人民日报等语料库),词性。结巴会根据词典对分词句子切分,生成DAG,与此同时将每个词的出现次数转换成频率。 该频率会根据动态规划查找最大路径,找出基于词频的切分组合。

对于不存在与词典中的词,结巴则采用了基于汉字成词能力的HMM模型,使用Viterbi算法进行分词。也就是说如果dict.txt词典中没有任何词,结巴也能够根据HMM模型分词。下面写一个demo测试下结巴的分词能力。

测试文本数据采用了一篇翻译过来的医学论文《Importance of Being Adaptable Developing Guidelines for Lung Nodule Evaluation》.

结巴的提取关键词API非常易用, 这里我们提取测试文本中出现频率前100的高频词汇。 并将中文编码转为unicode.

content = open("testing.txt","rb").read()

# tags extraction based on TF-IDF algorithm

tags = jieba.analyse.extract_tags(content, topK=100, withWeight=False)

text =" ".join(tags)

text = unicode(text)

在变量text中存储了我们需要的关键词结果。

接下来我们使用python中wordcloud这个库来快速生成一个词云图。由于wordcloud并不包含中文字体。对于显示中文分词,一定要对word cloud指定中文字体位置,否则最后词云图的中文都是方框乱码。

wc = WordCloud(font_path='simsun.ttc',

background_color="white", max_words=300, mask=trump_coloring,

max_font_size=40, random_state=42)

# generate word cloud

wc.generate(text)

词云图结果

2052d21a704c

wordcloud2.png

从词云图结果上大概可以看出,关键性高频名词基本被容纳进去,但是有一些无意义的高频介词也被包括进去。后期在提高模型正确率时,一方面需要扩充语义库,另一方面要对词性进行定义,将某些高频但无意义的词进行过滤。

全文代码:

# -*- encoding:utf-8 -*-

import jieba.analyse

from os import path

from scipy.misc import imread

import matplotlib as mpl

import matplotlib.pyplot as plt

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

if __name__ == "__main__":

mpl.rcParams['font.sans-serif'] = ['FangSong']

#mpl.rcParams['axes.unicode_minus'] = False

content = open("testing.txt","rb").read()

# tags extraction based on TF-IDF algorithm

tags = jieba.analyse.extract_tags(content, topK=100, withWeight=False)

text =" ".join(tags)

text = unicode(text)

# read the mask

d = path.dirname(__file__)

trump_coloring = imread(path.join(d, "Trump.jpg"))

wc = WordCloud(font_path='simsun.ttc',

background_color="white", max_words=300, mask=trump_coloring,

max_font_size=40, random_state=42)

# generate word cloud

wc.generate(text)

# generate color from image

image_colors = ImageColorGenerator(trump_coloring)

plt.imshow(wc)

plt.axis("off")

plt.show()

参考资料:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐