我正在使用JAWS访问WordNet。有一个词,有没有办法检测它是否是一个专有名词?看起来这些同义词具有相当粗略的词汇类别。
澄清一下,这些词语没有上下文 - 它们只是单独呈现。如果一个词可以想象地被用作普通名词,那么它是可以接受的。所以“标记”很好,因为虽然它可能是某人的名字,但它也可以指代一个点。但是,“非洲”不是。
答案 0 :(得分:12)
不幸的是,您无法从WordNet同义词中可靠地确定正确的名词信息。你在寻找的是Named Entity Recognition。从维基百科页面可以找到Java中提供的多个版本的链接。我个人推荐Stanford NER或LingPipe。
<强>更新强>
根据没有上下文单词的附加约束,您可以使用大写作为主要指标,然后仔细检查WordNet以查看该单词是否可以用作名词。也许是这样的:
String word = "foo";
boolean isProperNoun = false;
if (Character.isUpperCase(word.charAt(0))) {
WordNetDatabase database = WordNetDatabase.getFileInstance();
Synset[] synsets = database.getSynsets(word, SynsetType.NOUN);
isProperNoun = synsets.length > 0;
}
这将消除这样的误报:
如果你建立它...
作为你希望...
哦罗密欧,罗密欧......
仍然只是抓住
中的大写名词在标记的图书中,它说...
你最近听过 Roots 或 Who 了吗?
但仍然在
上给你误报标记第一个实例...
预订'他们,Danno。
因为可以,但没有上下文你不知道。
如果你想变得非常棘手,你可以跟踪任何名词上的hypernym树,看看你是否达到了像'公司'或'国家'那样明显的东西。然而,上次我使用WordNet(4年前)时,上位词/下位词关系不是非常可靠或一致,这可能会导致很多假阴性(并且没有改善我上面提到的误报,因为它们完全是依赖于上下文)。
答案 1 :(得分:2)
让我运行这个过去你。你可能不得不通过更多关于英语的书来运行,以深入了解一个人无法在上下文中确定一个单词的词性的事实。
您可以做的最好的事情是测试排除...确定WordNet知道在给定的词性中没有使用。在某些情况下,您可能会发现WordNet中只列出了一个词性。例如,我知道除了作为名词之外没有使用“汽车”。
将正确的名词与普通名词区分开来更加困难。当然你可以使用启发式...一个名词,它不是一个句子的最初单词并且是大写的,但不是在ALLCAPS中可能是一个专有名词。
最终,区别在于语义而不是词法分析。我怀疑你会找到一个基于在WordNet中查找单词的合理强大的解决方案。我认为在你能够可靠地提取名词之前你需要做自然语言语法分析,更不用说在散文中检测正确的名词。
答案 2 :(得分:2)
如果使用linux命令行来使用Wordnet,则可以使用'wn -synsn'来获取单词的所有同义词。专有名词将被大写。如,
$: wn mark -synsn
Synonyms/Hypernyms (Ordered by Estimated Frequency) of noun mark
15 senses of mark
Sense 1
mark, grade, score
=> evaluation, valuation, rating
.
.
.
Sense 8
Mark, Saint Mark, St. Mark
INSTANCE OF=> Apostle, Apostelic Father
INSTANCE OF=> Evangelist
INSTANCE OF=> saint
但是,严重的是,请不要仅依赖于Wordnet。有可能成为名词的专有名词Wordnet将不会向您提取任何信息。例如,尝试使用Henrik这个名称!
然而,您可以从Google n-gram语料库等数据集中 为您的单词 w 构建一个上下文 ,并使用此类上下文构建一个返回置信度分数的分类器(即分类器可以说 w 是一个专有名词,0 <= c <= 1置信度。)
答案 3 :(得分:1)
该信息似乎并未专门存储在WordNet中。但是,您可以查看名词sysnet的第一个单词形式,看它是否大写。不知道官方是多么正确,但似乎有效说明苍蝇不是一个专有名词而法国是。