NLP天然语言处理中的hanlp分词实例


 

本篇分享的依然是关于hanlp的分词使用,文章内容分享自 gladosAI 的博客,本篇文章中提出了一个问题,hanlp分词影响了实验判断结果。为什么会如此,不妨一块儿学习一下 gladosAI 的这篇文章。java

封面.jpg 

学习内容python

 

在以前的实验中获得了不在词向量里的词与分词结果,结果有500多个词不在词向量里,解决方案就是从新分词,或再追加训练这些词到词向量里。但后者相对麻烦且目前样本量不大。我跟据词向量的做者[6]所使用的分词工具来分词,会比不一样工具(jieba)的效果要好,由于都是同一模式的分词,分出来的词应该都会存在于大型语料库中。实验证实思路是对的,最后结果是只有60几个词不在词向量里,其中大部分为名词,还有些为因语音翻译问题所形成的出错连词,全部这些词也只出现一次,这部分能够考虑最后删去也不会影响结果。改善未出现词是个关键步骤,由于此后模型会用到词向量,若是未出现词过多,会影响词向量效果。ubuntu

问题:不过最后HANLP分词影响了实验判断结果,准确率从93%(jieba分词,同模型同参数)降低到90%。ide

实验:使用HanLP分词工具

1,前期准备,(环境ubuntu,python3)安装JAVA-10[3](hanlp是JAVA开发的,即便使用python调用pyhanlp须要借助java), jpype(python中虚拟java环境),hanlp(开源中文处理工具,不仅是分词还有各类工具),hanlp的root路径配置及data数据包放置[4]学习

2,主要程序[5]spa

w2v_model = KeyedVectors.load_word2vec_format(w2vpath, binary=False, unicode_errors='ignore') # 加载词向量翻译

hanlppath=\"-Djava.class.path=/media/glados/Learning/project/NLP/hanlp/hanlp-1.6.4.jar:/media/glados/Learning/project/NLP/hanlp/"code

jp.startJVM(jp.getDefaultJVMPath(), hanlppath)  # , "-Xms1g", "-Xmx1g")  # 启动JVM, Xmx1g分配1g内存orm

jp.JClass('com.hankcs.hanlp.HanLP$Config').ShowTermNature = False  # 关闭分词属性显示

HanLP = jp.JClass('com.hankcs.hanlp.HanLP') #普通分词模式

words = str(HanLP.segment(sentence)) #分词将结果转为str

words = re.sub('[反斜杠[反斜杠],\n]', ' ', words) # 这里注意实际程序是单\,在blog里会出问题,因此用反斜杠替代

words = words.split()

words = del_stopword(words)

...

jp.shutdownJVM() # 最后关闭java虚拟环境

使用的是HANLP的普通分词功能,另外需注意,hanlp.segment()不能直接输出或赋值给python,由于其是java环境中数据,因此只有转为str()后,再进行处理,不然会报错#A fatal error。(另外还有其余java与python数据对应问题,在这里没遇到,请参考其余)

 

词向量选用的是“Mixed-large综合”[6],其包括百度wiki百科、人民日报等,总共1293214个词。

 

Hanlp的中部份功能无法使用,例如精确分词CRF。另外,要先加载词向量再加载java虚拟环境。#A fatal error has been detected by the Java Runtime Environment

 

3,实验结果

 图1.JPG

(模型使用的是特征为tfidf的lsi模型, 参数:num_topics=3, 判断是否类似阀值为0.45,即大于0.45为true类似 )

 

同模型同参数下,jieba分词结果

 图2.JPG

jieba分词未出如今词向量的约500多,有些词出现了好几回,而hanlp分词只有60几个未出现,且多数为名词,只出现过一次。

4,分析

在样本中,全部样本分词结果jieba比hanlp要多分出100个词左右。因此推测因hanlp分词细粒度大,分出词少,致使较少的共现词出现(也多是hanlp分词精度更高,分出不少虚词被中止词表过滤形成),也就是说,lsi+tfidf模型对词细粒度大、分词少的分词器不友好,因此最后hanlp出错率更大。

jieba与hanlp都是很不错的分词器,结巴使用更方便。hanlp准确度要高一些(感受),并且与文中提到的词向量相匹配。

(我免贵姓AI,jieba:我免/贵姓/AI,hanlp:我/免/贵姓/AI,实际:我/免贵/姓AI)