5.2 WordNet 的层次结构

WordNet 的同义词集对应于抽象的概念,它们并不总是有对应的英语词汇。这些概念在层次结构中相互联系在一起。一些概念也很一般,如 实体 状态 事件 ;这些被称为唯一前缀或者根同义词集。其他的,如 油老虎 有仓门式后背的汽车 等就比较具体的多。5.1展示了一个概念层次的一小部分。

/projects/nlp-py-2e-zh/Images/74248e04835acdba414fd407bb4f3241.jpg

图 5.1:WordNet 概念层次片段:每个节点对应一个同义词集;边表示上位词/下位词关系,即上级概念与从属概念的关系。

WordNet 使在概念之间漫游变的容易。例如:一个如 motorcar 这样的概念,我们可以看到它的更加具体(直接)的概念——下位词。

  1. >>> motorcar = wn.synset('car.n.01')
  2. >>> types_of_motorcar = motorcar.hyponyms()
  3. >>> types_of_motorcar[0]
  4. Synset('ambulance.n.01')
  5. >>> sorted(lemma.name() for synset in types_of_motorcar for lemma in synset.lemmas())
  6. ['Model_T', 'S.U.V.', 'SUV', 'Stanley_Steamer', 'ambulance', 'beach_waggon',
  7. 'beach_wagon', 'bus', 'cab', 'compact', 'compact_car', 'convertible',
  8. 'coupe', 'cruiser', 'electric', 'electric_automobile', 'electric_car',
  9. 'estate_car', 'gas_guzzler', 'hack', 'hardtop', 'hatchback', 'heap',
  10. 'horseless_carriage', 'hot-rod', 'hot_rod', 'jalopy', 'jeep', 'landrover',
  11. 'limo', 'limousine', 'loaner', 'minicar', 'minivan', 'pace_car', 'patrol_car',
  12. 'phaeton', 'police_car', 'police_cruiser', 'prowl_car', 'race_car', 'racer',
  13. 'racing_car', 'roadster', 'runabout', 'saloon', 'secondhand_car', 'sedan',
  14. 'sport_car', 'sport_utility', 'sport_utility_vehicle', 'sports_car', 'squad_car',
  15. 'station_waggon', 'station_wagon', 'stock_car', 'subcompact', 'subcompact_car',
  16. 'taxi', 'taxicab', 'tourer', 'touring_car', 'two-seater', 'used-car', 'waggon',
  17. 'wagon']

我们也可以通过访问上位词来浏览层次结构。有些词有多条路径,因为它们可以归类在一个以上的分类中。car.n.01entity.n.01间有两条路径,因为wheeled_vehicle.n.01可以同时被归类为车辆和容器。

  1. >>> motorcar.hypernyms()
  2. [Synset('motor_vehicle.n.01')]
  3. >>> paths = motorcar.hypernym_paths()
  4. >>> len(paths)
  5. 2
  6. >>> [synset.name() for synset in paths[0]]
  7. ['entity.n.01', 'physical_entity.n.01', 'object.n.01', 'whole.n.02', 'artifact.n.01',
  8. 'instrumentality.n.03', 'container.n.01', 'wheeled_vehicle.n.01',
  9. 'self-propelled_vehicle.n.01', 'motor_vehicle.n.01', 'car.n.01']
  10. >>> [synset.name() for synset in paths[1]]
  11. ['entity.n.01', 'physical_entity.n.01', 'object.n.01', 'whole.n.02', 'artifact.n.01',
  12. 'instrumentality.n.03', 'conveyance.n.03', 'vehicle.n.01', 'wheeled_vehicle.n.01',
  13. 'self-propelled_vehicle.n.01', 'motor_vehicle.n.01', 'car.n.01']

我们可以用如下方式得到一个最一般的上位(或根上位)同义词集:

  1. >>> motorcar.root_hypernyms()
  2. [Synset('entity.n.01')]

注意

轮到你来: 尝试 NLTK 中便捷的图形化 WordNet 浏览器:nltk.app.wordnet()。沿着上位词与下位词之间的链接,探索 WordNet 的层次结构。