用WordNet检测专有名词?

我正在使用JAWS访问WordNet 。 有一个词,有没有办法检测它是否是一个专有名词? 看起来这些同义词具有相当粗略的词汇类别。

澄清一下,没有任何语境 – 它们只是单独呈现。 如果一个词可以想象地用作普通名词,那么它是可以接受的。 所以“标记”很好,因为虽然它可能是某人的名字,但它也可以指代一个点。 但是,“非洲”不是。

不幸的是,您无法从WordNet同义词中可靠地确定正确的名词信息。 您正在寻找的是命名实体识别 。 从维基百科页面可以找到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。

因为它们可能是,但没有上下文你不知道。

如果你想变得非常棘手,你可以跟踪任何名词上的hypernym树,看看你是否达到了像’公司’或’国家’那样明显的东西。 然而,上次我使用WordNet(4年前)时,上位词/下位词关系不是非常可靠或一致,这可能会导致很多假阴性(并且没有改善我上面提到的误报,因为它们完全是依赖于上下文)。

让我过去你。 你可能不得不翻阅更多关于英语的书籍,以深入了解一个人无法在上下文中确定一个单词的词性这一事实。

您可以做的最好的是测试排除…确定WordNet知道在给定的词性中没有使用。 在某些情况下,您可能会发现WordNet中只列出了一个词性。 例如,我知道除了作为名词之外没有使用“汽车”。

专有名词与普通名词区分开来更加困难。 当然你可以使用启发式…一个名词,它不是一个句子的最初单词并且是大写的,但不是在ALLCAPS中可能是一个专有名词。

最终,区别是语义而不是词法分析。 我怀疑你会找到一个基于在WordNet中查找单词的相当强大的解决方案。 我认为在你能够可靠地提取名词之前,你需要做自然语言语法分析,更不用说在散文中检测专有名词了。

如果使用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中。 但是,您可以查看名词sysnet的第一个单词forms,看它是否大写。 不知道官方是多么的,但它似乎有效地告诉苍蝇不是一个专有名词而法国是。