-
中文分词评测方法
2020-04-16 17:11:49为了确定哪种分词结果比较好,通常有两种方式,一种是调用接口,对特定的句子分词,通过感觉对分词结果进行对比,但这种分词结果却带有了很大的主观色彩。在网上也是博客在介绍。另一种则通过测试集对分词结果与标准...中文分词评测方法
对于分词,目前有很多开源的程序,包括hanlp、jieba、哈工大分词等。为了确定哪种分词结果比较好,通常有两种方式,一种是调用接口,对特定的句子分词,通过感觉对分词结果进行对比,但这种分词结果却带有了很大的主观色彩。在网上也是博客在介绍。另一种则通过测试集对分词结果与标准的分词进行分析,得出准确率、召回率等。
步骤
-
开放的测试集选取
一般测试集产生的来源主要源于竞赛,但是,我在搜索过程中,只找到了一个,Second International Chinese Word Segmentation Bakeoff ,虽然竞赛是2005年公开的,但是却没找到别的,大家如果有其他更好的,麻烦留言交流。
接下来我们就以这个测试集对分词结果进行分析。 -
下载数据集
icwb2-data.zip [50 MB, md5],大家尽量跳转到官网进行下载。 -
目录结构
doc nshort_seg.out testing training gold README scripts
其中:
- gold: 包含测试数据和训练数据单词列表。
- scripts: 对比分析效果的脚本。
- testing: 里面包含了未分词的文本,其标准分词在gold的目录的对应文件中。
- training: 包含了训练数据集。
- doc: 包含了竞赛的说明文档。
-
评分方法
script文件夹中,包含了score脚本,脚本执行的时候需要三个参数,训练集、标准分词、自己分词。
执行脚本如下,可根据自己的需求更换对应的参数perl scripts/score gold/pku_training_words.utf8 gold/pku_test_gold.utf8 gold/pku_test.out
-
结果展示
结果中包含了单个文本片段,以及最后总的评分结果,这里我们仅展示总的评分结果。=== TOTAL INSERTIONS: 993 === TOTAL DELETIONS: 7143 === TOTAL SUBSTITUTIONS: 7617 === TOTAL NCHANGE: 15753 === TOTAL TRUE WORD COUNT: 104372 === TOTAL TEST WORD COUNT: 98222 === TOTAL TRUE WORDS RECALL: 0.859 === TOTAL TEST WORDS PRECISION: 0.912 === F MEASURE: 0.885 === OOV Rate: 0.058 === OOV Recall Rate: 0.708 === IV Recall Rate: 0.868
在结果中,RECALL、PRECISION、F MEASURE:分别为召回率、精度和F值,值越高越好。
-
部分代码片段
为了方便开发测试,以hanlp为例,贴出部分生成segment文件的代码- 通用的类
public class Util { /** * 将wordlist转化为string * @param sentence segment生成的List<Term> * @param posflag 是否输出标签,在测试时输入为false * @return */ public static String wordlist2String(List<Term> sentence, boolean posflag){ StringBuffer result = new StringBuffer(); if(sentence.size()>=1){ for(Term w:sentence){ if(w.getWord()!=null && !" ".equals(w.getWord())){//去掉begin和end result.append(w.getWord()); if(true==posflag){ result.append("/"+w.getNature().toString()); } if (w.getWord().equals("\r\n")){ continue; } result.append(" "); } } } return result.toString(); } /** * 读取根路径下的文件 * * @param filePath 文件路径 * * @return byte[] * */ public static String readSystemFileToByte(String filePath) { InputStream inStream = null; byte data[] = null; try { inStream = new FileInputStream(filePath);; ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); byte[] buff = new byte[100]; int rc = 0; while ((rc = inStream.read(buff, 0, 100)) > 0) { swapStream.write(buff, 0, rc); } data = swapStream.toByteArray(); inStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } String dataString = null; try { dataString = new String(data, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return dataString; } /** * 将分词结果输出到文件内容 * @param content 分析结果 * @param path 保存的路径 */ public static void write(String content, String path){ try{ BufferedWriter bw = new BufferedWriter(new FileWriter(path)); bw.write(content); bw.newLine(); bw.close(); }catch (Exception e){ System.out.println(e.getMessage()); } System.out.println("保存成功"); } }
- 测试方法
public void test(){ String inputPath = ""; String outPath=""; //读取文件内容 String content = Transform.readSystemFileToByte(inputPath); //分词并保存结果 String outContent = Transform.wordlist2String(HanLP.segment(content),false); Transform.write(outContent,outPath); }
参考资料
-
-
中文分词的方法
2019-08-14 09:38:42中文分词主要有两个类别:本别是基于字词典分词算法和基于统计的机器学习算法,下面依次介绍这两种方法。 1 基于词典分词算法 也称字符串匹配分词算法。该算法是按照一定...中文分词主要有两个类别:本别是基于字词典分词算法和基于统计的机器学习算法,下面依次介绍这两种方法。
1 基于词典分词算法
也称字符串匹配分词算法。该算法是按照一定的策略将待匹配的字符串和一个已建立好的“充分大的”词典中的词进行匹配,若找到某个词条,则说明匹配成功,识别了该词。常见的基于词典的分词算法分为以下几种:正向最大匹配法、逆向最大匹配法和双向匹配分词法等。
基于词典的分词算法是应用最广泛、分词速度最快的。很长一段时间内研究者都在对基于字符串匹配方法进行优化,比如最大长度设定、字符串存储和查找方式以及对于词表的组织结构,比如采用TRIE索引树、哈希索引等。2 基于统计的机器学习算法
这类目前常用的是算法是HMM、CRF、深度学习等算法,其本质是序列标注,比如stanford、Hanlp分词工具是基于CRF算法。以CRF为例,基本思路是对汉字进行标注训练,不仅考虑了词语出现的频率,还考虑上下文,具备较好的学习能力,因此其对歧义词和未登录词的识别都具有良好的效果。
3 中文分词的难点
- 分词标准:比如人名,在哈工大的标准中姓和名是分开的,但在Hanlp中是合在一起的。这需要根据不同的需求制定不同的分词标准。
- 歧义:对同一个待切分字符串存在多个分词结果。
- 新词:也称未被词典收录的词,该问题的解决依赖于人们对分词技术和汉语语言结构的进一步认识。
参考
-
论文研究-基于改进最大匹配算法的中文分词粗分方法.pdf
2019-09-12 10:36:57通过引入广义词条和诱导词集,在最大匹配算法基础上提出一种中文分词的粗分方法,以最长广义词匹配为原则进行中文分词,利用诱导词集实现交叉型歧义识别。在保证快速准确切分无歧义汉语语句的同时,100%检测并标记有... -
一种面向搜索引擎的中文切分词方法
2017-07-06 17:34:43首先说一下搜索引擎切分词的产生的原因。 在进行全文检索时,首先将要检索的内容分割成较短的文字序列。... 文字的分割方法主要有两种,分别是 词语解析索引 和 文字索引 。 词语解析索引是按照字典首先说一下搜索引擎切分词的产生的原因。
在进行全文检索时,首先将要检索的内容分割成较短的文字序列。然后生成在每个文字序列中所包含字符串的对应表(索引)。当输入检索语句后,也同样进行分割,与索引进行比较。也就是说,两者即使包含有同样的文字排列,但分割方法不同的话也不能正确检索。
文字的分割方法主要有两种,分别是 词语解析索引 和 文字索引 。
词语解析索引是按照字典中最小的词语单位对文本进行分割,既按词义切分。如中科院的 ICTCLAS。
文字索引是不考虑文本中词的意义,只是按照一定的字长的单位进行切分。如 车东的二元切分法。上面两种方法对搜索的影响已经在 不同规则的中文分词对Lucene索引的影响 一文中做了对比。
这里想纠正的一点是:我在里面提到: 从直觉观察来看,索引文件中的Term越多,搜索结果也越快,搜索的相关性也越高。
这句话漏掉了一点,就是Term的“质量”问题。比如采用二元切分方法,产生的Term一定比 单字切分 和 词义切分 要多,但是很显然不能提高搜索的相关性。我的看法是二元切分 提高了搜索关键字的命中率而降低了索引结果的相关性。那么是不是按照词义切分就能解决上面的问题呢?
在跟车东和lhelper谈论GrassLand的开发计划的时候,(车东和lhelper是WebLucene的主要开发者),他们很有方向性的提到:完全按照词义切分不完全适合于全文搜索。得出这样的结论似乎有悖常理。这也是本文要集中讨论的地方。
上面提到:搜索引擎在建立索引时要和用户搜索时采取相同的切分方法,才能够正确检索。而这正是 词义切分 容易出现差错的地方。原因在于当搜索引擎建立索引时,可以通过算法使文本内容中的词语和字典很好的吻合(ICTCLAS 公测招回准确率在90%左右)。而在对用户在输入的关键字进行分词的时候,一方面用户输入的文本要短,另一方面用户只使用自己认为对的关键词,(还不考虑错字、别字 :-( )这样就造成了前后两者分词的差异。
这种差异导致的结果可想而知,甚至不如文字索引 二元切分 更有效。
这时候我们怎么选择?下面引用相关组织的一点评论:
美国加州大学伯克利分校却在报告中称,使用 按词义切分法按词语单位对检索语句进行分割的方法更为有效。“作为的NTCIR资深小组提出的报告,可信度很高。我们也许可以得出以单词为单位进行分割的方法有效这一结论了”(国立信息学研究所副教授神门典子)。但在作为检索对象的数据方面,为防止检索遗漏有时还是使用 文字索引 进行分割好一些。
上面 伯克利分校 的评论可以作为本文要提出的:面向搜索引擎的中文切分方法 的理论起点。
概括起来就是:以词义切分为主要的切分方法,对于其中偏差的部分采用 文字索引切分法。 搜索引擎切分词的目的不是切分出有意义的词,而是切分出用户需要的关键词。
上面提到的只是一个总的思路,在技术上还有很多细节需要考虑。
-
中文分词概述
2020-09-11 22:33:53对于歧义性问题,比如“结婚的和尚未结婚的”,这里有两个分词结果,是“结婚/的/和/尚未结婚/的”,还是“结婚/的/和尚/未结婚/的”,这时就比较难以判断了。 自从中文分词技术出现之后,出现过很多技术。大体可以...现在中文分词主要困难在于未登录词和歧义性问题。对于未登录词非常好理解,就是对于未见过的新词;对于歧义性问题,比如“结婚的和尚未结婚的”,这里有两个分词结果,是“结婚/的/和/尚未结婚/的”,还是“结婚/的/和尚/未结婚/的”,这时就比较难以判断了。
自从中文分词技术出现之后,出现过很多技术。大体可以概括为“规则分词”、“统计分词”、“混合(规则加统计)分词”这三个流派,现在正在实验的为语义分词,但是该方法并不成熟,处于实验阶段。
规则分词
基于规则分词是一种机械分词方法,主要通过维护词典,在切分语句时,将句子中的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不进行切分。按照切分方法,大致分为正向最大匹配法、逆向最大匹配法、双向最大匹配法。
1.
正向最大匹配法(MM法)算法:输入语句L,词典D
1)
从左到右取待切分语句L的m个字符作为匹配字段,其中m为机器词典D中最长词条的字符数;2)
查找机器词典Di.
若存在,则匹配成功。将这个匹配字段作为一个词切分出来;ii.
若不存在,则匹配失败。此时将匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,再次进行匹配,重复上述过程;3)
重复第二步,直到切分完语句L为止。2.
逆向最大匹配法(RMM法)该算法与正向最大匹配法相似,只不过待切分语句是逆向进行切分,并且机器词典中的词条均是逆序方式存放。存在证明指出该切分方式可以适当提高精准度。
3.
双向最大匹配法双向最大匹配法是将正向最大匹配法和逆向最大匹配法进行结果比较,然后按照最大匹配原则,选取切分词数最少的做为结果。
双向最大匹配的规则:
1)
如果正反向分词结果词数不同,则取分词数较少的作为分词结果;2)
如果正反向分词结果词数相同i.
分词结果相同,任意选取一个即可;ii.
分词结果不同,返回单字较少的一个。统计分词
统计分词的基本思想是把每个词看做是由单个字组成的,如果相连的字在文本中出现的次数越多,就证明相连的字就很可能是一个词,从而我们就利用字与字的相邻出现频率来反映成为词的可靠度,当组和频率高于某一个值时,便认为这些字组合成一个词。
1.
HMM算法HMM算法将分词作为字在字符串中的序列标注问题来解决。其中需引入隐状态:B-词首、M-词中、E-词尾、S-单字成词。
需要注意:
1)
其中B\M\E\S是隐藏状态,分词后的语句是观测状态;2)
为防止出现隐藏状态出现“BB”、“BEM”的状况,可以通过设置状态转移矩阵中的部分值为零;3)
学习HMM中的参数,我们一般给出分好词的语料,通过近似算法(也就是计算概率)来求得参数值;4)
对一个语句进行切分,采用维特比算法。2.
N-最短路径方法(后续补充)为解决中文中歧义问题和未登录词问题。一般分词算法,先进行粗分,然后再进行歧义切分、未登录词识别等。在粗分阶段,采用N-最短路径方法,其中分为非统计粗分模型和统计粗分模型(两者不同之处在于边的权值不同)。其基本思想就是:构造有向无环图G,然后利用Dijkstra贪心算法(迪杰斯特拉算法)求出前N个最短路径。
基于规则和统计的分词
1.
结巴分词结巴分词主要为结合基于规则分词和基于统计分词两者的分词算法。其主要思想为:
·
基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);·
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;·
对于未登录词,采用了基于汉字成词能力的
HMM 模型,使用了 Viterbi 算法。 -
自然语言处理的中文分词方法
2015-07-17 22:05:27中文分词方法平台:win7,python,vs20101、CRF++...其中有两种,一种是Linux下(带源码)的,一种是win32的,下载 http://download.csdn.net/source/1425683将这两种版本打成一个包了。 二、安装: a) Windows版的 -
一种利用ngram模型来消除歧义的中文分词方法
2015-05-06 04:44:50这里的歧义是指:同样的一句话,可能有两种或者更多的切分方法,这些切分结果,有的正确,有的不正确。 消除歧义的目的就是从切分结果中挑选切分正确的。 假设我们要切分句子:结婚的和尚未结婚的,使用逆向最大... -
中文分词系列总结
2017-12-19 18:34:35查词典的方法简单高效(得益于动态规划的思想),尤其是结合了语言模型的最大概率法,能够很好地解决歧义问题,但对于中文分词一大难度——未登录词(中文分词有两大难度:歧义和未登录词),则无法解决;... -
solr中文分词
2011-06-05 16:15:00我在solr中尝试了以下三种开源中文分词器,其中两种都因为solr版本过高不能用,郁闷,后来将...但用的人还很多mmseg4j:google code上最后一次代码提交是2010.12月,应该还算活跃,采用MMSeg算法,有两种分词方法:Simp -
postgres中的中文分词zhparser
2018-01-07 17:15:22基本查了下网络,postgres的中文分词大概有两种方法: Bamboo zhparser 其中的Bamboo安装和使用都比较复杂,所以我选择的是zhparser zhparse基于scws scws是简易中文分词系统的缩写,它的原理其实很简单,基于词典... -
【中文分词】亲手开发一款中文分词器——原理
2015-07-10 13:38:46前文已经谈到几种分词方法的手段和困难,本文将从最基本原理开始,一步一步分析我自己的分词器是如何开发的。 从最初出发点开始,我们需要确定那些字的组合是词语。每两个字能否组合成词语,其实取决于两个字同时以... -
中文分词和HMM模型
2019-05-25 21:44:28中文分词 1. 切分方案的标识 0有1/意2见3/分4歧5 两种标识方案 一个词的开始位置标识为1,其余位置标识为0,比如:[11010] 切词的索引位置,则“0有1意2见3分4歧5”的分词结点序列{0,1,3,5} 最常见的分词方法是... -
【转】 solr中文分词
2014-04-22 11:57:00我在solr中尝试了以下三种开源中文分词器,其中两种都因为solr版本过高不能用,郁闷,后来将JAR包反编译,...mmseg4j:google code上最后一次代码提交是2010.12月,应该还算活跃,采用MMSeg算法,有两种分词方法:Si... -
中文分词之正向最大匹配算法
2018-07-19 12:46:10中文分词目前可以分为“规则分词”,“统计分词”,“混合分词(规则+统计)”这三个主要流派。这次介绍下基于规则的分词,其是一种机械的分词方法,主要通过维护词典,在切分语句时,将语句的每个字符串与词表中的... -
elasticsearch索引从ik中文分词器拓展到使用逗号“,”分词
2019-04-12 16:14:32问题描述: 有一个ES实体为,文章标签tags,以字符串形式储存,如“上海,民宿,迪士尼,happy”为一条数据。在实现文章标签搜索排序(使用... 因此寻找方法改变分词方法,有两种办法,第一种,使用中文分词器插件,... -
Elasticsearch设置中文分词
2018-04-16 11:23:45在ES安装目录下有两种方法:1、手动安装 下载https://github.com/medcl/elasticsearch-analysis-ik/releases,然后unzip到your-es-root/plugins/下。2、自动安装./bin/elasticsearch-plugin install ... -
lucene 4.3 中文分词代码演示
2013-07-03 10:10:32首页导入开发需要的架包: 这里采用的中文分词器是mmseg4j: mmseg4j用Chih-Hao Tsai 的MMSeg算法实现的中文分词器,并... MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex加了四个 -
中文分词工具--Jieba
2019-02-11 19:02:54jieba分词值基于规则和统计这两类方法。其首先基于前缀词典进行词图扫描,前缀词典是指词典中的词按照前缀的包含顺序排列的,从而形成一种层级包含结构。这种前缀词典的好处便是可以快速构建包含全部可能分词结果的... -
jieba(结巴)—— Python 中文分词
2016-10-27 12:43:00另外,中文 NLP 和英文 NLP 不太一致的地方还在于,中文首先需要分词,针对中文的分词问题,有两种基本的解决思路: 启发式(Heuristic):查字典 机器学习/统计方法:HMM、CRF jieba 分词是python写成... -
中文分词 《第七篇》
2016-05-05 15:01:00中文分词 《第七篇》 一、分词的方法 分词的方法主要有以下几种: 1、单字切分 单字切分就是把一段文字按照每个字去建立索引。 如果用来切分“我爱你伟大的中国”,就会切成“我”,“爱”,“你”... -
NLP学习路径(三):NLP中文分词技术
2019-03-23 09:35:593)混合分词:上述两种方法的结合。(用得较多) 2、规则分词 主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不予切分。 主要方法有:正向最大匹配法;逆向最大... -
理论:NLP学习路径(三):NLP中文分词技术
2019-09-25 08:15:183)混合分词:上述两种方法的结合。(用得较多) 2、规则分词 主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不予切分。 主要方法有:正向最大匹配法;逆向最大... -
【中文分词系列】 8. 更好的新词发现算法
2017-04-03 00:35:29如果依次阅读该系列文章的读者,就会发现这个系列共提供了两种从0到1的无监督分词方案,第一种就是《【中文分词系列】 2. 基于切分的新词发现》,利用相邻字凝固度(互信息)来做构建词库(有了词库,就可以用词典法...
-
2016通信中级互联网真题.pdf
-
浏览器输入url按下回车后发生了什么
-
安装MySQL无法下一步问题解决了!
-
HP_M1130_M1210_MFP_Full_Solution-v20180815-10158769.rar
-
mysql-connector-c++-8.0.23-win32.msi
-
jsp+mysql+学生习题测试+习题考试系统.zip
-
pcmcia转串口驱动
-
MHA 高可用 MySQL 架构与 Altas 读写分离
-
11. 含k个3的数.cpp
-
入门前端-《JavaScript 语言入门教程-数据类型和数值》
-
PowerBI重要外部工具详解
-
ZYtrans6.6.2.3.zip
-
gexin-rp-sdk-http-4.1.1.0.rar
-
MySQL 性能优化(思路拓展及实操)
-
【硬核】一线Python程序员实战经验分享(1)
-
MySQL 数据库权限管理(用户高级管理和精确访问控制)
-
13种游戏机模拟器源代码.rar
-
STM32单片机程序+原理图.zip
-
access应用的3个开发实例
-
2020-L1-glossary&1.zip