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