我正在使用JAWS访问WordNet。给定一个单词,有没有办法检测它是否是专有名词?看起来同义词集具有相当粗略的词汇类别。
为了澄清,这些词没有上下文 - 它们只是单独呈现。如果可以想象一个词可以用作普通名词,那么它是可以接受的。所以“mark”很好,因为虽然它可以是某人的名字,但它也可以指一个点。然而,“非洲”不是。
不幸的是,您将无法从 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;
}
这将消除这样的误报:
如果你建造它......
如你所愿......
哦,罗密欧,罗密欧......
并且仍然只捕获大写的名词
在马可福音中它说... 你最近听过 The Roots或The Who吗?
但仍然会给你误报
标记第一个实例...
预订他们,Danno。
因为他们可能是,但没有上下文你不知道。
如果你想变得非常棘手,你可以跟踪任何名词的上位词树,看看你是否达到了像“公司”或“国家”这样的明显词。然而,我上次使用 WordNet 时(4 年前),上位词/下位词关系不是很可靠或一致,这可能会导致很多假阴性(并且没有改善我上面提到的假阳性,因为这些完全上下文相关)。
如果你使用 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 置信度。)
让我从你身边跑过去。您可能需要浏览更多有关英语的书籍才能深入了解一个事实,即无法脱离上下文确定单词的词性。
你能做的最好的就是测试排除......确定WordNet知道在给定的词性中没有使用。在某些情况下,您可能会发现 WordNet 中只列出了一个词性。例如,我知道除了作为名词之外没有使用“汽车”。
区分专有名词和普通名词更加困难。当然你可以使用启发式......一个不是句子的初始单词并且大写但不是全大写的名词可能是一个专有名词。
归根结底,区别在于语义而不是词法分析。我怀疑你会根据在 WordNet 中查找单词找到一个相当强大的解决方案。我认为您需要先进行自然语言语法解析,然后才能可靠地提取名词,更不用说检测散文中的专有名词了。
这些信息似乎没有专门存储在 WordNet 中。但是,您可以查看名词 sysnet 的第一个词形式,看看它是否大写。不知道那是多么官方,但它似乎可以告诉fly不是专有名词而法国是。