【问题标题】:The reverse process of stemming词干的逆过程
【发布时间】:2012-02-28 11:30:15
【问题描述】:

我使用 lucene 雪球分析器来执行词干提取。结果是没有意义的话。我提到了这个question

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

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

【问题讨论】:

    标签: java similarity stemming porter-stemmer


    【解决方案1】:

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

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

    run:
       NN:  runner
       VBG: running
       VBZ: runs
    

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

    编辑:从下面的 cmets 来看,您可能想要使用词形还原而不是词干提取。以下是使用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);
        }
    }
    

    【讨论】:

    • 像 run 这样的词可以用 stemmer 很好地工作。我说的是效率之类的词。词干上的效率变成了没有意义的效率。我打算完成的是将效率转换为效率,无论什么产生效率(效率/其他词)
    • 那么您可能正在寻找词形还原(查找单词的“基本”形式 - 将在字典中列出的内容),而不是词干(查找单词的“根”)。一个词干可以有很多基本词——“效率”->“效率”->“效率”是没有意义的。一个引理正好对应一个基本词:“efficient” -> “efficient”,“efficiency” -> “efficiency”,“efficiencies” -> “efficiency”。在词干提取中,您会丢失变形和基本词。在词形还原中,您只会失去拐点。我刚刚在帖子中添加的代码应该可以帮助您开始使用斯坦福词形还原工具。
    • 嗨 .. 请查看我的这个 [问题] (stackoverflow.com/questions/9528080/…) 并帮助我!
    • stanford nlp 是否执行停用词删除?
    • 我不这么认为。您能详细说明在这种情况下删除停用词是什么意思吗?
    【解决方案2】:

    您所引用的问题包含一条经常被忽视的重要信息。您需要的被称为“词形还原” - 将屈折词还原为其规范形式。它与词干相关但不同,仍然是一个开放的研究问题。对于形态更复杂的语言来说尤其困难(英语没那么难)。 Wikipedia 有一个您可以试用的软件列表。我使用的另一个工具是TreeTagger——它非常快速且相当准确,尽管它的主要目的是词性标记,词形还原只是一个好处。尝试在谷歌上搜索“统计词形还原”(是的,我确实对统计与基于规则的 NLP 有强烈的感觉)

    【讨论】:

      【解决方案3】:

      您可能会查看NCI Metathesaurus -- 尽管主要是生物医学性质的,但它们提供了自然语言处理的示例和一些 Java 开源工具集,您可能会通过浏览他们的代码发现有用。

      【讨论】:

        【解决方案4】:

        如果您想在 Python 中执行此操作:

        您可能会喜欢这个使用词干提取并包含进行逆词干提取的算法的开源项目:

        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 项目的一部分提供:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-08
          • 1970-01-01
          • 2012-09-24
          • 2011-10-03
          相关资源
          最近更新 更多