如果问题是是否可以使用WordNet
做句子释义。许多语法/句法成分都是可能的。您需要的系统:
- 首先获取标记的单独语义并解析句子的语法。
- 然后理解复合句的整体语义(特别是隐喻性的)
- 然后用一些语法生成器重新排列句子。
到目前为止,我只知道 ACE 解析器/生成器可以做类似的事情,但是需要对系统进行大量的攻击才能使其作为释义生成器工作。http://sweaglesw.org/linguistics/ace/ http://sweaglesw.org/linguistics/ace/
所以为了回答你的问题,
是否可以使用 WordNet 将句子改写为替代句子?遗憾的是,WordNet 并不是灵丹妙药。对于释义任务,您需要的不仅仅是语义。
如果无法改变句子结构,是否可以使用WordNet仅替换相关同义词?是的,这是可能的。但是要弄清楚哪个同义词是可替换的很困难......而且您还需要一些形态/语法组件。
首先你会遇到每个词有多种含义的问题:
from nltk.corpus import wordnet as wn
sent = "Obama met Putin the previous week"
for i in sent.split():
possible_senses = wn.synsets(i)
print i, len(possible_senses), possible_senses
[out]:
Obama 0 []
met 13 [Synset('meet.v.01'), Synset('meet.v.02'), Synset('converge.v.01'), Synset('meet.v.04'), Synset('meet.v.05'), Synset('meet.v.06'), Synset('meet.v.07'), Synset('meet.v.08'), Synset('meet.v.09'), Synset('meet.v.10'), Synset('meet.v.11'), Synset('suffer.v.10'), Synset('touch.v.05')]
Putin 1 [Synset('putin.n.01')]
the 0 []
previous 3 [Synset('previous.s.01'), Synset('former.s.03'), Synset('previous.s.03')]
week 3 [Synset('week.n.01'), Synset('workweek.n.01'), Synset('week.n.03')]
然后,即使您知道其含义(比方说第一个含义),您也会在每个含义中获得多个单词,并且并非句子中的每个单词都可以被替换。而且,他们在lemma
形式不是表面形式(例如动词是基本形式(简单现在时),名词是单数):
from nltk.corpus import wordnet as wn
sent = "Obama met Putin the previous week"
for i in sent.split():
possible_senses = wn.synsets(i)
if possible_senses:
print i, possible_senses[0].lemma_names
else:
print i
[out]:
Obama
met ['meet', 'run_into', 'encounter', 'run_across', 'come_across', 'see']
Putin ['Putin', 'Vladimir_Putin', 'Vladimir_Vladimirovich_Putin']
the
previous ['previous', 'old']
week ['week', 'hebdomad']