我正在使用Stanford-NLP Java库。我发现它在处理句子的词干化,词形还原和标记化为单词时最准确。
我的要求也是对单词进行标记化,例如“leatherjacket”可以正确解释并吐出“皮夹克”。在这个级别,我不处理拼写纠正,但如果可能,请告诉我。
答案 0 :(得分:1)
这是一个复杂的问题,因为你假设你正在对单词进行标记,而不是对标记/原始语言单位进行标记。维基百科将标记化描述为:
在词法分析中,标记化是打破流的过程 文本分为单词,短语,符号或其他有意义的元素 叫做代币。
PTBTokenizer(CoreNLP主要令牌化器)在上粗略地分词,而不是实际的词。因此,以下句子将产生6个令牌。
我有一件非常酷的皮夹克
['我','有'' a','真的','很酷',& #39; leatherjacket']
了解标记化并不安静,您可以推荐解决方案作为标记化过程的前提。 Peter Norvig在谷歌与臭名昭着的Artifical Intelligence: A Modern approach共同讨论了他的玩具(概率/判别)算法,该算法达到了80% - 90%的准确率。 implementation he published is in Python,但已被移植到其他语言,可能适合您的需要。 Rael GC在42行中实现了Java解决方案,在his website上令人印象深刻。
或者你可以创建自己的标记器,它更进一步,是某种混合拼写纠正器/标记器。然而,这将是非常困难/乏味的,并且由于新颖性而值得发表。但简短的回答,这里没有金色的子弹。
答案 1 :(得分:0)
我不确定我们现在有什么可以做的。但我个人之前已就此问题进行过研究,将这样的组件添加到Stanford CoreNLP可能会很有趣。
我的简单方法基本上是:
构建一个合理频繁的词典(来自维基百科?)(你想要“皮革”和“夹克”在词典中,但不是“皮革夹克”)
对于给定的单词,生成分割候选者,每个单词的大小最小(你想将“leatherjacket”分成“皮革”和“夹克”,你不想将“非政治”分成“一个”和“政治”)
计算你的粉碎单词和二元宝石的比例
(出现“皮革”“夹克”)/(出现“皮革夹克”)
如果此比率超过某个阈值,请将“leatherjacket”替换为“leather”“jacket”
我生成了一长串粉碎的示例,并根据我的训练数据调整了我的阈值。