【发布时间】:2014-02-11 09:40:14
【问题描述】:
我一直在寻找一些 Java 库,它可以为我提供有关同义词集的“频率计数”的信息。我检查了 JWNL 和 JWI,他们没有提供此类信息。 有人知道其他 Java WordNet API 吗?
【问题讨论】:
-
不是完全重复,但这里有一个非常相似的问题:stackoverflow.com/q/20936502/841830
我一直在寻找一些 Java 库,它可以为我提供有关同义词集的“频率计数”的信息。我检查了 JWNL 和 JWI,他们没有提供此类信息。 有人知道其他 Java WordNet API 吗?
【问题讨论】:
每个 Synset 都有一个基于语料库的频率指示器。
JAWS - http://lyle.smu.edu/~tspell/jaws 提供Synset#getTagCount
不确定 JWNL 和 JWI,但在这些库中查找 synset api。
注意:(个人观点)不要相信这个频率指标,它会严重误导。
【讨论】:
我相信 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 年以来就没有更新过)。
【讨论】:
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());
}
}
}
}
}
【讨论】: