nlp - 如何检测句子中的单词是否指向颜色/身体部位/车辆

时间:2015-07-11 08:42:49

标签: nlp stanford-nlp wordnet lexical-analysis named-entity-recognition

因为标题表明我想知道句子中的某个单词是否指向

1]颜色

The grass is green.

因此“绿色”是颜色

2]身体部位

Her hands are soft

因此“手”是身体的一部分

3]车辆

I am driving my car on the causeway

因此“汽车”是一种载体

在类似的问题中,解析器是可能的有效解决方案之一。 例如斯坦福解析器被提出了类似的问题

How to find if a word in a sentence is pointing to a city

现在的问题是stanford解析器可用于检测:

LOCATION
ORGANIZATION
DATE
MONEY
PERSON
PERCENT
TIME

但是,如果您想尝试检测其他内容,可以选择word-net作为类似问题中提到的选项

How do I list out all English terms in a sentence that indicate an animal?

其中一个答案建议使用wordnet并利用下位词/上位词关系。答案还提到了wordnet的名词.animal文件。

下面的链接显示了wordnet中所有其他文件的列表 https://wordnet.princeton.edu/man/lexnames.5WN.html

我的方法是我可以使用

1]

(noun.body FOR body parts)

2]

(noun.artifact FOR vehicles)

3]

 The (hyponym/hypernym) relationship can be used to detect if word is pointing to a color or not.

那么这是一种有效的方法吗?

我怎样才能使用(hyponym / hypernym)是wordnet?

注意:我打算使用:JWI(MIT Java Wordnet界面)

1 个答案:

答案 0 :(得分:1)

参考 hyponymy / hypernymy 方法,这将涉及探索wordnet树及其词之间的关系。

一个单词的下位词 Synset ,更准确)代表了更具特色的概念,而上位词代表概念本质上更为通用。与Wordnet的树状结构类比,您可以将下位词视为您正在查看的单词( node )的 children ,上位词为这个词的父母

作为一个例子,采用上下文 dog 这个词的上义词和上位词:

dog = wn.synsets('dog')[0]
print(dog.hypernyms())
print(dog.hyponyms())

产生以下结果:

[Synset('canine.n.02'), Synset('domestic_animal.n.01')]

[Synset('basenji.n.01'), Synset('corgi.n.01'), Synset('cur.n.01'), 
Synset('dalmatian.n.02'), Synset('great_pyrenees.n.01'), S 
Synset('griffon.n.02'), Synset('hunting_dog.n.01'), Synset('lapdog.n.01'), 
Synset('leonberg.n.01'), Synset('mexican_hairless.n.01'), 
Synset('newfoundland.n.01'), Synset('pooch.n.01'), Synset('poodle.n.01'), 
Synset('pug.n.01'), Synset('puppy.n.01'), Synset('spitz.n.01'), 
Synset('toy_dog.n.01'), Synset('working_dog.n.01')]

以类似的方式,如果我们想要知道哪些单词代表颜色,我们可以探索代表颜色的不同单词的上位词,希望它们有一个共同的祖先(上位词)。从这个意义上说,我做了以下实验:

print(wn.synsets('green')[0].hypernyms())
print(wn.synsets('blue')[0].hypernyms())
print(wn.synsets('red')[0].hypernyms())
print(wn.synsets('yellow')[0].hypernyms())

所有这些共享相同的hypernym列表:

[Synset('chromatic_color.n.01')]

另外

print(wn.synsets('black')[0].hypernyms())
print(wn.synsets('gray')[0].hypernyms())

产生结果

[Synset('achromatic_color.n.01')]

我们接下来要做的就是打印这些结果集的所有下位词:

print(wn.synset('chromatic_color.n.01').hyponyms())
print(wn.synset('chromatic_color.n.01').hyponyms())

给出结果

[Synset('blond.n.02'), Synset('blue.n.01'), Synset('brown.n.01'), 
Synset('complementary_color.n.01'), Synset('green.n.01'), 
Synset('olive.n.05'), Synset('orange.n.02'), Synset('pastel.n.01'), 
Synset('pink.n.01'), Synset('purple.n.01'), Synset('red.n.01'), 
Synset('salmon.n.04'), Synset('yellow.n.01')]

[Synset('black.n.01'), Synset('gray.n.01'), Synset('white.n.02')]

可以应用相同的技术来探索与身体部位车辆相关的选项。

另外,对于 reddish 这样的衍生词,我知道有两种绕过它们缺席的方法:

  • 通过 Porter Stemmer 来阻止标记化文本(请参阅this link
  • 使用 Morphy 获取基本表单,让您在Wordnet中查找生成的单词(有关Morphy的详细信息,请参阅this link)。我会推荐这种方法,因为词干可能会产生Wordnet中不存在的单词