实验目的:
了解分词包并进行使用
实验要求:
调查现有的分词工具包,并选择两种使用进行分词效果的比较
实验工具:
Python3.6.5;thulac;jieba;wordcloud
实验内容及过程:
现有的分词工具包有很多,在此主要选择了中文分词工具包进行调查。即便如此,常见的开源中文分词工具包也有很多,以下列出了在Bakeoff国际中文处理比赛中比较优秀的分词工具包:
perminusminus
Stanford 汉语分词工具(Bakeoff-2两项第一)
哈工大语言云(LTP -cloud)
ICTCLAS——(Bakeoff -1两项第一)
Ansj(ICTCLAS的java实现)
庖丁解牛分词
盘古分词
IKAnalyzer
imdict-chinese-analyzer
mmseg4j
FudanNLP(复旦大学)
Jcseg
SCWS
Friso
HTTPCWS
libmmseg
OpenCLAS
CRF++ (Bakeoff-3四项第一)
除此之外,还有很优秀的jieba、SnowNLP、thulac(清华大学自然语言处理与社会人文计算实验室)等分词工具包。我选取了4种进行详细了解。
Thulac:
THULAC是由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。功能简单,处理速度快,但仅支持处理UTF8编码中文文本;提供Java、c++、Python版本,具有以下特点:
Thulac利用的是该实验室集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
thulac的分词准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
它处理速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。
编译和安装简单,在Python环境下,调用API接口就可以方便使用。
jieba:
jieba 基于Python的中文分词工具,使用简单,功能强大
支持三种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。 支持繁体分词
并且支持自定义词典
算法:
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法
主要功能:
jieba.cut;jieba.cut_for_search;jieba.Tokenizer(dictionary=DEFAULT_DICT)(新建自定义分词器,可用于同时使用不同词典);词性标注;载入词典;调整词典;基于 TF-IDF 算法的关键词抽取;并行分词。
哈工大语言云(LTP -cloud):
语言云(语言技术平台云 LTP-Cloud)是由哈工大社会计算与信息检索研究中心研发的云端自然语言处理服务平台。 后端依托于语言技术平台,语言云为用户提供了包括分词、词性标注、依存句法分析、命名实体识别、语义角色标注在内的丰富高效的自然语言处理服务。
作为基于云端的服务,语言云具有如下一些优势:
免安装:用户只需要下载语言云客户端源代码,编译执行后即可获得分析结果,无需调用静态库或下载模型文件。
省硬件:语言云客户端几乎可以运行于任何硬件配置的计算机上,用户不需要购买高性能的机器,即可快捷的获得分析结果。
跨平台:语言云客户端几乎可以运行于任何操作系统之上,无论是Windows、Linux各个发行版或者Mac OS。
跨编程语言:语言云已经提供了包括C++,Java,C#,Python,Ruby在内的客户端
IKAnalyzer
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
语言和平台: 基于java 语言开发,最初它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer 3.0 则发展为面向 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对 Lucene 的默认优化实现。
算法:采用了特有的“正向迭代最细粒度切分算法” 。采用了多子处理器分析模式,支持:英文字母( IP 地址、Email、URL )、数字(日期、常用中文数量词、罗马数字、科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。支持用户词典扩展定义。针对 Lucene 全文检索优化的查询分析器 IKQueryParser ;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高 Lucene 检索的命中率。
IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是LuceneAnalyzer接口的实现。该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用"人民"搜索含"人民币"的文章,这是大部分用户的搜索思维;不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上"人民"和"人民币"是完全搭不上关系的。
我选用了Thulac和jieba来试用:
先用thulac和jieba进行了简单的分词处理,并进行对比:
代码和结果如下:
发现thulac将红和酒分了出来,而jieba没有。之后又使用了一个更为复杂的语料尝试:
比较之后发现thulac并不像文档里吹的那么准确啊,jieba的分词效果似乎要更好些。
然后我着重使用了jieba分词工具包。
发现jieba的新词识别功能很nice:
原本没有“杭研”、“蓝瘦香菇”,但是也被Viterbi算法识别出来了。
尝试了一下搜索引擎模式:
词性标注:
同时尝试了添加自定义词典功能,发现分词准确性明显上升。
并行分词和关键词提取未进行尝试。
此外尝试了
NLP IR的分词功能,情感分析等功能,很简单就不贴图了,看起来很有趣。
使用wordcloud生成词云,直接使用 pip install wordcloud 就可以安装成功了,但是在网上搜教程时发现有些人在安装时,总是报错。这时要注意可能是下载的文件与python的版本不一样,要查询到正确的版本,方法:在shell中输入import pip; print(pip.pep425tags.get_supported());注意库的依赖。
然后就可以用Wordcloud来生成词云了:
for line in fin.readlines():
line = line.strip('\n')
text += ' '.join(jieba.cut(line))
text += ' '
fout = open('text.txt','wb')
pickle.dump(text,fout)
fout.close()
fr=open('text.txt','rb')
text=pickle.load(fr)
print("加载成功")
backgroud_Image=plt.imread('alice.jpg')
print('加载图片成功!')
'''设置词云样式'''
wc=WordCloud(
background_color='white',
mask=backgroud_Image,
font_path='C:\Windows\Fonts\STZHONGS.TTF', #若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
max_words=2000,
stopwords=STOPWORDS,
max_font_size=150,
random_state=30
)
wc.generate_from_text(text)
print('开始加载文本')
img_colors=ImageColorGenerator(backgroud_Image)
wc.recolor(color_func=img_colors)
plt.imshow(wc)
plt.axis('off')
plt.show()
print('display success!')
实验总结:
jieba分词真的挺好用的,而且其针对的搜索引擎模式可以很好地服务于爬虫。