mayabot / mynlp

一个生产级、高性能、模块化、可扩展的中文NLP工具包。(中文分词、平均感知机、fastText、拼音、新词发现、分词纠错、BM25、人名识别、命名实体、自定义词典)
https://mynlp.mayabot.com/
Apache License 2.0
675 stars 90 forks source link

分词输出结果拼接后和原始句子不一致 #8

Closed tiandiweizun closed 5 years ago

tiandiweizun commented 5 years ago

发现有个问题:分词输出结果拼接起来和原有的输入结果不一致,我看了一下,应该是归一化导致的,比如:“今年的2019年9月13日,中秋节快乐”中的中文逗号改成了英文逗号,“出现了一大批模糊主题”中的“糊”改成了“煳”,我感觉输出原始结果比较合适,或者如果用户想使用归一化或原始的结果,能否可以通过传入参数进行限定

jimichan commented 5 years ago

的确是个问题。 词典分词里面应该不适用归一化,但是感知机分词必要经过归一化的过程。 我看一下API里面怎么保持原有输出。 “糊”改成了“煳”应该是归一化词典的问题

tiandiweizun commented 5 years ago

如果最后的长度一致的话,那可以做一个简单的封装,根据offset直接取原始query里面的词就可以了,如果长度不一致,可以构建一个结构:原始词、归一词,比如日期时间、数字、电话、网址等,原始词就是用户的输入,归一化的(time、number、phone、url)只是代号让感知机来训练的,这样最后输出取原始的即可,可以参见HanLP在这块的处理方案。

jimichan commented 5 years ago

将在3.0.1中做出修改

val lerxer = Lexers.coreBuilder()
                .keepOriCharOutput()
                .build()
        Assert.assertEquals("看看 下面 这 中文 逗号 , Keep 大小写",
                lerxer.scan("看看下面这中文逗号,Keep 大小写").toPlainString()
        )

为Builder新增keepOriCharOutput()方法,开启保持字符串不变。默认不开启