【问题标题】:How to access "frequency count" in WordNet in any Java WordNet interface如何在任何 Java WordNet 接口中访问 WordNet 中的“频率计数”
【发布时间】:2014-02-11 09:40:14
【问题描述】:

我一直在寻找一些 Java 库,它可以为我提供有关同义词集的“频率计数”的信息。我检查了 JWNL 和 JWI,他们没有提供此类信息。 有人知道其他 Java WordNet API 吗?

【问题讨论】:

标签: java nlp wordnet


【解决方案1】:

每个 Synset 都有一个基于语料库的频率指示器。

JAWS - http://lyle.smu.edu/~tspell/jaws 提供Synset#getTagCount

不确定 JWNL 和 JWI,但在这些库中查找 synset api。

注意:(个人观点)不要相信这个频率指标,它会严重误导。

【讨论】:

【解决方案2】:

我相信 JWI 也可以做到这一点,但不是很直观。

让我们从一个词形还原词开始。如果您有一个没有词形还原的词,您应该在使用 JWI 搜索该词之前使用词形还原器。

String         lemma = ... // the lemmatized word
IRAMDictionary dict  = new RAMDictionary(WN_DIR,ILoadPolicy.IMMEDIATE_LOAD);
IIndexWord indexWord = dict.getIndexWord(lemma, POS.NOUN); // or verbs, etc.

List<IWordID> wrdIDs = indexWord.getWordIDs();
for (IWordID id : wrdIDs) {
    IWord word  = dict.getWord(id);
    int   count = dict.getSenseEntry(word.getSenseKey()).getTagCount();
    System.out.println("Synset: "    + word.getSynset().getGloss());
    System.out.println("Frequency: " + count);
}

这可能看起来过于复杂,但请注意,我们从这个小代码 sn-p 的单词开始,不是同义词集!

在 JWI 中,每个 IWord 唯一标识一个同义词集(尽管同义词集通常包含多个单词),因此计算每个词义频率的方法非常违反直觉(至少对我而言,是的)。

计数由getTagCount() 方法给出,文档中对此进行了说明

返回感知条目的标签计数。标记计数是一个非负整数,表示在各种语义索引文本中标记意义的次数。计数为 0 表示该意义尚未被语义标记。

但请记住,WordNet 中的语义计数已经过时了(据我所知,它们自 2001 年以来就没有更新过)。

【讨论】:

    【解决方案3】:

    extjwnl有一个Word的函数getUseCount(),返回你想要的:

    这里:http://extjwnl.sourceforge.net/javadocs/index.html

    例如:

    IndexWord word = dictionary.lookupIndexWord(POS.NOUN, exampleWord);
    
      List<Synset> synset=word.getSenses();
      int nums = word.sortSenses();
    
      // for each sense of the word
      for (  Synset syn : synset) {
    
        // get the synonyms of the sense
        PointerTargetTree s = PointerUtils.getSynonymTree(syn, 2 /*depth*/);        
        List<PointerTargetNodeList>  l = s.toList();
    
        for (PointerTargetNodeList nl : l) {
          for (PointerTargetNode n : nl) {
            Synset ns = n.getSynset();
            if (ns!=null) {
              List<Word> ws = ns.getWords();
              for (Word ww : ws) {
                // ww.getUseCount() is the frequency of occurance as reported by wordnet engine
                println(ww.getLemma(), ww.getUseCount());
                }
              }
            }
          }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2012-10-17
      • 2013-03-11
      • 1970-01-01
      • 2013-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多