阻止的逆过程

时间:2012-02-28 11:30:15

标签: java similarity stemming porter-stemmer

我使用lucene雪球分析仪进行干预。结果不是有意义的话。我提到了question

其中一个解决方案是使用一个数据库,该数据库包含单词的词干版本与单词的一个稳定版本之间的映射。 (无论社区的基础是什么(社区/或其他一些词),从社区到社区的例子)

我想知道是否有一个执行这样功能的数据库。

4 个答案:

答案 0 :(得分:4)

理论上不可能从词干中恢复特定单词,因为一个词干可以是许多单词共有的。根据您的应用程序,一种可能性是构建一个每个映射到多个单词数组的词干数据库。但是,你需要预测哪一个词适合给定一个词干来重新转换。

作为这个问题的一个非常天真的解决方案,如果你知道单词标签,你可以尝试在数据库中存储带有标签的单词:

run:
   NN:  runner
   VBG: running
   VBZ: runs

然后,鉴于词干“run”和标签“NN”,您可以确定“runner”是该上下文中最可能的词。当然,这种解决方案远非完美。值得注意的是,您需要处理这样一个事实:在不同的上下文中,相同的单词形式可能会被不同地标记。但请记住,解决这个问题的任何尝试都充其量只是近似值。

编辑:从下面的评论中,看起来你可能想要使用词形还原而不是词干。以下是使用Stanford Core NLP tools

获取单词的引理的方法
import java.util.*;

import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;

Properties props = new Properties();

props.put("annotators", "tokenize, ssplit, pos, lemma");
pipeline = new StanfordCoreNLP(props, false);
String text = "Hello, world!";
Annotation document = pipeline.process(text);

for(CoreMap sentence: document.get(SentencesAnnotation.class)) {
    for(CoreLabel token: sentence.get(TokensAnnotation.class)) {
        String word = token.get(TextAnnotation.class);
        String lemma = token.get(LemmaAnnotation.class);
    }
}

答案 1 :(得分:3)

您提到的问题包含一条经常被忽视的重要信息。你需要的是被称为“lemmatisation” - 将变形词减少到它们的规范形式。它与词干有关但不同,仍然是一个开放的研究问题。对于形态更复杂的语言来说尤其困难(英语并不那么难)。 Wikipedia有一个您可以尝试的软件列表。我使用的另一个工具是TreeTagger - 它真的很快且相当准确,虽然它的主要目的是词性标注,但是lemmatisation只是一个奖励。尝试使用谷歌搜索“统计lemmatisation”(是的,我确实对统计与基于规则的NLP有强烈的感受)

答案 2 :(得分:1)

你可能会看NCI Metathesaurus - 虽然大多数是生物医学的,但它们提供了自然语言处理的例子和一些Java的开源工具集,你可以通过浏览它们的代码找到它们。

答案 3 :(得分:1)

如果要使用Python进行此操作:

您可能喜欢这个使用Stemming的开源项目,该项目包含一种算法来执行反向Stemming:

this page of the project上,有关于如何执行反向阻止的说明。总结起来,它的工作方式如下。

首先,您将阻止一些文档,此处是简短的(法语)字符串,其中删除了停用词,例如: ['sup chat march trottoir', 'sup chat aiment ronron', 'chat ronron', 'sup chien aboi', 'deux sup chien', 'combien chien train aboi']

然后,诀窍是保留最流行的原始单词的数量以及每个词干单词的数量: {'aboi': {'aboie': 1, 'aboyer': 1}, 'aiment': {'aiment': 1}, 'chat': {'chat': 1, 'chats': 2}, 'chien': {'chien': 1, 'chiens': 2}, 'combien': {'Combien': 1}, 'deux': {'Deux': 1}, 'march': {'marche': 1}, 'ronron': {'ronronner': 1, 'ronrons': 1}, 'sup': {'super': 4}, 'train': {'train': 1}, 'trottoir': {'trottoir': 1}}

最后,您现在可以猜测如何自行实现。只需使用词干词最多的原始词即可。您可以参考以下实现,该实现在MIT许可下作为Multilingual-Latent-Dirichlet-Allocation-LDA项目的一部分提供: