Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ttys3/9c0d2497dee5031d9d7309282adeebe9 to your computer and use it in GitHub Desktop.
Save ttys3/9c0d2497dee5031d9d7309282adeebe9 to your computer and use it in GitHub Desktop.
不同分词器在elastic中的实际效果

不同分词器在elastic中的实际效果

介绍不同分词器的文章不少,较经典的有BosonNLP 11款开放中文分词引擎大比拼

可惜这11款分词器只有IK和结巴一直在更新elastic的分词器插件,Boson的插件已经很久没更新

所以加上elastic自带的smartcn 也就只有三种分词器可选。

注1:smartcn基于中科院的ictclas 但用的是1.0, 似乎没再更新

注2:ik拼音分词器是在分词基础上把词转成拼音,不算一个真正的分词器。

这三种分词器在elastic变现如何?网上很难找到比较有实际意义的例子,大都只是些一两个示例。这里我们选取了北大詹卫东给出的一个歧义词示例 ,包含106个容易引起歧义的例句各两个,一共212句话。通过调用elastic的analyze api 查看每句话的分词结果。

SO有人问还有没别的办法查看分词结果 有人说可以用 Term Vector 但我们自己测试发现,这还不如分享analyze api的结果方便。

最终得到的分析结果有些意思:smartcn 是三者中最细粒度的分法,这可以理解,估计不确认的词它就按单字分,但这样检索结果再用 and 的方式,反而可能找到。找不到再查别的分词结果。IK和结巴分词颗粒度比smart大,在这个歧义词表里效果反而不好。

  1. 来北京 这三个字如果用search_index 都能正确分成 “来 北京 ”两个词, 但在原句的语境中,ik和结巴都把他们做别的拆分,所以这种情况先反而是smartcn的分法才有可能查到正确的结果。
  2. 从小 这两个字三种分词器都正确处理成一个词,但是在原文语境中只有ik_max_word(未在以下列出) 能正确分词,因此也只有查询ik的分词结果才能找到
  3. 检索 “恶性事故” ik_smart 和 jieba_search都处理成一个词,只有smartcn分词成 “恶性 事故”两个词,因此只有smartcn做 search_index才可能找到备选结果 “一起恶性交通事故
input || ik_smart || jieba_search || smartcn
一场大雪过后,满世界都银装素裹,漂亮极了。 || 一场/大雪/过后/满世界/都/银装素裹/漂亮/极了 || 一场/大雪/过后/,/满/世界/都/银装素裹/,/漂亮/极了/。 || 一/场/大雪/过后/满/世界/都/银装素裹/漂亮/极了
一大清早,沿街的叫卖声就把他从睡梦中吵醒了 || 一大/清早/沿街/的/叫卖声/就把/他/从/睡梦中/吵/醒了 || 一/大清早/,/沿街/的/叫卖声/就/把/他/从/睡梦中/吵醒/了 || 一/大清早/沿/街/的/叫卖声/就/把/他/从/睡梦/中/吵/醒/了
一聊起来北京后的遭遇,小王就有一肚子的辛酸 || 一/聊起来/北京/后/的/遭遇/小王/就有/一肚子/的/辛酸 || 一/聊起来/北京/后的/遭遇/,/小王/就/有/一肚子/的/辛酸 || 一/聊/起/来/北京/后/的/遭遇/小/王/就/有/一/肚子/的/辛酸
一说到眼前的时局大家都唉声叹气起来 || 一说到/眼前/的/时局/大家/都/唉声叹气/起来 || 一说到/眼前/的/时局/大家/都/唉声叹气/起来 || 一/说/到/眼前/的/时局/大家/都/唉声叹气/起来
一连的官兵都感动得热泪盈眶 || 一连/的/官兵/都/感动得/热泪盈眶 || 一连/的/官兵/都/感动/得/热泪盈眶 || 一/连/的/官兵/都/感动/得/热泪盈眶
三个人选一个,你会选谁 || 三个/人选/一个/你/会选/谁 || 三个/人选/一个/,/你会选/谁 || 三/个/人/选/一个/你/会/选/谁
上天不仅给了她美貌,还给了她智慧 || 上天/不仅/给/了/她/美貌/还给/了/她/智慧 || 上天/不仅/给/了/她/美貌/,/还给/了/她/智慧 || 上天/不仅/给/了/她/美/貌/还/给/了/她/智慧
上物理课时需要特别仔细观察各种实验现象 || 上/物理/课时/需要/特别/仔细观察/各种/实验/现象 || 上/物理课/时/需要/特别/仔细观察/各种/实验/现象 || 上/物理/课时/需要/特别/仔细/观察/各种/实验/现象
上级解除了他的职务 || 上级/解/除了/他/的/职务 || 上级/解除/了/他/的/职务 || 上级/解除/了/他/的/职务
上述研究所可能产生的社会效益和经济效益都是非常可观的 || 上述/研究所/可能/产生/的/社会效益/和/经济效益/都是/非常/可观/的 || 上述/研究所/可能/产生/的/社会效益/和/经济效益/都是/非常/可观/的 || 上述/研究所/可能/产生/的/社会效益/和/经济效益/都/是/非常/可观/的
下午我要领工资,恐怕赶不回去 || 下午/我/要领/工资/恐怕/赶/不/回去 || 下午/我/要领/工资/,/恐怕/赶不/回去 || 下午/我/要领/工资/恐怕/赶/不/回去
不少人为的是往上爬,也有不少人为的是眼前的利益 || 不少/人为/的/是/往上爬/也有/不少/人为/的/是/眼前/的/利益 || 不少/人/为的是/往上爬/,/也有/不少/人/为的是/眼前/的/利益 || 不少/人为/的/是/往/上/爬/也/有/不少/人为/的/是/眼前/的/利益
中国产品质量 || 中国/产品质量 || 中国/产品质量 || 中国/产品/质量
临安府的马快已经全部出动去捉拿飞贼 || 临安/府/的/马快/已经/全部/出动/去/捉拿/飞贼 || 临安/府/的/马快/已经/全部/出动/去/捉拿/飞贼 || 临安/府/的/马/快/已经/全部/出动/去/捉拿/飞贼
为人民工作 || 为人/民/工作 || 为/人民/工作 || 为/人民/工作
买卖盗版软件可能都会触犯法律 || 买卖/盗版软件/可能/都会/触犯/法律 || 买卖/盗版软件/可能/都会/触犯/法律 || 买卖/盗版/软件/可能/都/会/触犯/法律
人身上哪怕有一点小病痛,都会影响到工作学习 || 人/身上/哪怕/有/一点/小/病痛/都会/影响到/工作/学习 || 人/身上/哪怕/有/一点/小/病痛/,/都会/影响/到/工作/学习 || 人/身上/哪怕/有/一点/小/病痛/都/会/影响/到/工作/学习
什么语言学起来都不是件容易的事情 || 什么/语言/学起来/都不是/件/容易/的/事情 || 什么/语言学/起来/都/不是/件/容易/的/事情 || 什么/语言学/起来/都/不/是/件/容易/的/事情
今天我买了好多东西,全是用来送人的礼物 || 今天/我/买了/好多/东西/全是/用来/送人/的/礼物 || 今天/我买了/好多/东西/,/全是/用来/送人/的/礼物 || 今天/我/买/了/好多/东西/全/是/用/来/送/人/的/礼物
今年的会考试题非常难 || 今年/的/会考/试题/非常/难 || 今年/的/会/考试题/非常/难 || 今年/的/会/考试题/非常/难
从小学毕业 || 从/小学/毕业 || 从/小学毕业 || 从/小学/毕业
从小学电脑 || 从/小学/电脑 || 从/小学/电脑 || 从/小学/电脑
一起恶性交通事故 || 一起/恶性/交通事故 || 一起/恶性/交通事故 || 一起/恶性/交通/事故
...

所以我最终的查询语句会是个组合查询 Compound queries,很复杂,类似。这还没想好最终思路

POST sentences/_doc/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "multi_match": {
                        "type": "most_fields",
                        "query": "小学毕业",
                        "analyzer": "ik_smart",
                        "operator": "and",
                        "fields": ["content", "content.jieba", "content.ik"]
                    }
                },
                {
                    "multi_match": {
                        "type": "most_fields",
                        "query": "小学毕业",
                        "operator": "and",
                        "fields": ["content", "content.jieba", "content.ik"]
                    }
                }
            ]
        }
    }
}

HanLP

HanLP 是分词引擎中的新军,但它的文档较详细,对理解分词中的各类问题很有帮助;自己号称“全世界最大语料库” 这是我们又单独考察它的原因。

它自己没有开发es插件,是有志愿者开发,目前支持 1.6.6 , 我们直接替换1.6.8的大语料库好像也也没有问题 。 但这个项目的星不多,让人对质量稍微有点不放心。

如果只是对上述歧义词表的结果作分析,hanlp效果似乎比结巴和ik好一些,感觉是因为做了词性标注,让分词结果更准确。

它提供的几个分词器,标准分词器和nlp,最短路径好像结果基本一致,索引分词可做细粒度分词。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment