5.1 意义与同义词

考虑(1a)中的句子。如果我们用 automobile 替换掉(1a)中的词 motorcar,变成(1b),句子的意思几乎保持不变:

  1. >>> from nltk.corpus import wordnet as wn
  2. >>> wn.synsets('motorcar')
  3. [Synset('car.n.01')]

因此,motorcar 只有一个可能的含义,它被定义为car.n.01,car 的第一个名词意义。car.n.01被称为 synset 或“同义词集”,意义相同的词(或“词条”)的集合:

  1. >>> wn.synset('car.n.01').lemma_names()
  2. ['car', 'auto', 'automobile', 'machine', 'motorcar']

同义词集中的每个词可以有多种含义,例如:car 也可能是火车车厢、一个货车或电梯厢。但我们只对这个同义词集中所有词来说最常用的一个意义感兴趣。同义词集也有一些一般的定义和例句:

  1. >>> wn.synset('car.n.01').definition()
  2. 'a motor vehicle with four wheels; usually propelled by an internal combustion engine'
  3. >>> wn.synset('car.n.01').examples()
  4. ['he needs a car to get to work']

虽然定义帮助人们了解一个同义词集的本意,同义词集中的词往往对我们的程序更有用。为了消除歧义,我们将这些词标记为car.n.01.automobilecar.n.01.motorcar等。这种同义词集和词的配对叫做词条。我们可以得到指定同义词集的所有词条[1],查找特定的词条[2],得到一个词条对应的同义词集[3],也可以得到一个词条的“名字”[4]

  1. >>> wn.synset('car.n.01').lemmas() ![[1]](/projects/nlp-py-2e-zh/Images/eeff7ed83be48bf40aeeb3bf9db5550e.jpg)
  2. [Lemma('car.n.01.car'), Lemma('car.n.01.auto'), Lemma('car.n.01.automobile'),
  3. Lemma('car.n.01.machine'), Lemma('car.n.01.motorcar')]
  4. >>> wn.lemma('car.n.01.automobile') ![[2]](/projects/nlp-py-2e-zh/Images/6efeadf518b11a6441906b93844c2b19.jpg)
  5. Lemma('car.n.01.automobile')
  6. >>> wn.lemma('car.n.01.automobile').synset() ![[3]](/projects/nlp-py-2e-zh/Images/e941b64ed778967dd0170d25492e42df.jpg)
  7. Synset('car.n.01')
  8. >>> wn.lemma('car.n.01.automobile').name() ![[4]](/projects/nlp-py-2e-zh/Images/f3ad266a67457b4615141d6ba83e724e.jpg)
  9. 'automobile'

与词 motorcar 意义明确且只有一个同义词集不同,词 car 是含糊的,有五个同义词集:

  1. >>> wn.synsets('car')
  2. [Synset('car.n.01'), Synset('car.n.02'), Synset('car.n.03'), Synset('car.n.04'),
  3. Synset('cable_car.n.01')]
  4. >>> for synset in wn.synsets('car'):
  5. ... print(synset.lemma_names())
  6. ...
  7. ['car', 'auto', 'automobile', 'machine', 'motorcar']
  8. ['car', 'railcar', 'railway_car', 'railroad_car']
  9. ['car', 'gondola']
  10. ['car', 'elevator_car']
  11. ['cable_car', 'car']

为方便起见,我们可以用下面的方式访问所有包含词 car 的词条。

  1. >>> wn.lemmas('car')
  2. [Lemma('car.n.01.car'), Lemma('car.n.02.car'), Lemma('car.n.03.car'),
  3. Lemma('car.n.04.car'), Lemma('cable_car.n.01.car')]

注意

轮到你来:写下词 dish 的你能想到的所有意思。现在,在 WordNet 的帮助下使用前面所示的相同的操作探索这个词。