ncpq 发表于 2015-10-02 10:03

使用python NLTK中的wordnet接口写一个遍历wordnet的程序

WordNet是面向语义的英语词典,类似于传统字典。它是NLTK语料库的一部分,可以被这样调用:

>>>from nltk.corpus import wordnet as wn

Wordnet可以看作一棵庞大的词汇树,在树的某些局部是图,但这并不影响到我们对它的遍历。
之需要将所有遍历的词语节点放到tuple中,自然会去除重复,也就知道它下面有多少个词了。
wordnet的根节点是entity,那么这个遍历wordnet的程序可以写成一个遍历树的递归的程序。
然而这个递归的程序为并不会写,所以来求助大家。希望大家能够帮助给出能够跑起来的程序。

>>> printwn.synsets('entity')


获取entity这个单词的义项列表。
然后这个义项会有多个子节点:

>>> list = wn.synsets('entity')
>>> print list.hyponyms()


大致的过程就是这样,总节点数量应该是8万多个。


ncpq 发表于 2015-10-25 17:31

自己把这个程序写出来了,这个程序能够正确的计算wordnet中的节点数量,但是代码写得很拙劣,希望各位提出改进的意见:# -*- coding: utf-8 -*-
import nltk
from nltk.corpus import wordnet as wn

#一个全局列表a
global a
a = []

#返回一个单词的全部子节点
def getAllSub(list=[]):
    if len(list) == 0:
          return
    for n in list:
      a.append(n)
      getAllSub(n.hyponyms())
      getAllSub(n.instance_hyponyms())
               
if __name__ == "__main__":
    #返回一个单词的同义词集列表g
    g = wn.synsets('entity')
    getAllSub(g)
    s= set(a)
    print(len(s))可以看到这里我使用了全局的变量来返回递归函数计算的值,那么怎样不使用全局变量来返回计算后的值呢,请大家指教~

Hadron74 发表于 2016-04-05 16:45

试试networkx包,有很多现成的包和方法可用。
https://networkx.github.io/
页: [1]
查看完整版本: 使用python NLTK中的wordnet接口写一个遍历wordnet的程序