【问题标题】:Getting a Large List of Nouns (or Adjectives) in Python with NLTK; or Python Mad Libs使用 NLTK 在 Python 中获取大量名词(或形容词);或 Python Mad Libs
【发布时间】:2013-07-19 03:47:16
【问题描述】:

this question 一样,我有兴趣通过词性获得大量单词(一长串名词;一串形容词),以便在其他地方以编程方式使用。 This answer 有一个使用 WordNet 数据库(SQL)格式的解决方案。

有没有办法使用 Python NLTK 中内置的语料库/工具来获取此类列表。我可以获取大量文本,对其进行解析,然后存储名词和形容词。但是考虑到内置的字典和其他工具,有没有更聪明的方法来简单地提取 NLTK 数据集中已经存在的单词,编码为名词/形容词(随便)?

谢谢。

【问题讨论】:

    标签: python machine-learning nltk


    【解决方案1】:

    您应该使用Moby Parts of Speech Project 数据。不要只使用默认情况下直接在 NLTK 中的内容。下载文件的工作量很小,加载后很容易用 NLTK 解析它们。

    【讨论】:

      【解决方案2】:

      值得注意的是,Wordnet 实际上是 NLTK 下载器默认包含的语料库之一。因此,您可以想象直接使用您已经找到的解决方案,而无需重新发明任何轮子。

      例如,您可以这样做来获取所有名词同义词集:

      from nltk.corpus import wordnet as wn
      
      for synset in list(wn.all_synsets('n')):
          print synset
      
      # Or, equivalently
      for synset in list(wn.all_synsets(wn.NOUN)):
          print synset
      

      该示例将为您提供所需的每个名词,甚至会将它们分组到它们的同义词中,因此您可以尝试确保它们在正确的上下文中使用。

      如果您想将它们全部放入一个列表中,您可以执行以下操作(尽管这会根据您想要使用单词和同义词的方式而有所不同):

      all_nouns = []
      for synset in wn.all_synsets('n'):
          all_nouns.extend(synset.lemma_names())
      

      或者作为单行:

      all_nouns = [word for synset in wn.all_synsets('n') for word in synset.lemma_names()]
      

      【讨论】:

      • 优秀。我会试试这个。我知道 wordnet 是 NLTK 的一部分,但我没有充分了解 api。谢谢。
      • @cforster 不用担心,很乐意为您提供帮助。
      • 应该是...list(wn.all_synsets(wn.NOUN))...吗? wn.NOUN 是一个设置为 'n' 的常量,但它更具可读性
      • @Oxinabox 可以说更具可读性,不过我会附上注释,感谢您提出!
      • list(wn.wordnet.all_synsets(wn.wordnet.NOUN)) for python 3, 'ADJ', 'ADJ_SAT', 'ADV', 'VERB' 也是可能的
      【解决方案3】:

      本周早些时候我看到了一个类似的问题(找不到链接),但就像我当时所说的那样,我不认为维护一个名词/形容词/任何东西的列表是个好主意。这主要是因为同一个词可以有不同的词性,具体取决于上下文。

      但是,如果您仍然坚持使用这些列表,那么我会这样做(我没有在这台机器上安装有效的 NLTK,但我记得基础知识):

      nouns = set()
      for sentence in my_corpus.sents():
          # each sentence is either a list of words or a list of (word, POS tag) tuples
          for word, pos in nltk.pos_tag(sentence): # remove the call to nltk.pos_tag if `sentence` is a list of tuples as described above
      
              if pos in ['NN', "NNP"]: # feel free to add any other noun tags
                  nouns.add(word)
      

      希望对你有帮助

      【讨论】:

      • 哎呀,既然你可以使用预先构建的语料库,为什么还要对不同的语料库进行 pos_tag 呢?我觉得这对于大型语料库来说需要很长时间。
      • 根据使用情况,同一个“词”(假设是“字符串”以不让语言学家生气)可能作为多个词性存在这一事实是没有问题的。如果你正在编写一个 Mad-Lib 完成器,scratch 既是名词又是动词的事实是没有问题的,对吧?我确实喜欢这个解决方案不需要下载/解析另一个文件。
      • @SlaterTyranus:我并不是要建议 OP 对新的语料库进行 pos 标记。相反,我的意思是说应该标记 NLTK 附带的语料库之一。如果我没记错的话,如果语料库已经被标记,pos_tag 不会执行任何新的标记,而只是返回已经标记的数据
      • 哦,我明白了。我的错误,这更有意义。
      猜你喜欢
      • 2011-02-19
      • 2013-06-19
      • 2018-02-24
      • 1970-01-01
      • 2011-07-26
      • 2012-11-11
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多