【问题标题】:Python NLTK exercise: chapter 5Python NLTK 练习:第 5 章
【发布时间】:2013-04-30 12:35:42
【问题描述】:

大家好, 我开始按照 NLTK 团队的官方书籍学习 NLTK。

我在第 5 章-“标记”中-我无法解决 PDF 版本第 186 页的练习之一:

给定由 cfd2['VN'].keys() 指定的过去分词列表,尝试收集该列表中紧接在项目之前的所有单词标签对的列表。

我试过这样:

wsj = nltk.corpus.treebank.tagged_words(simplify_tags=True)

[wsj[wsj.index((word,tag))-1:wsj.index((word,tag))+1] for (word,tag) in wsj if word in cfd2['VN'].keys()]

但它给了我这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/nltk/corpus/reader/util.py", line 401, in iterate_from
for tok in piece.iterate_from(max(0, start_tok-offset)):
File "/usr/local/lib/python2.7/dist-packages/nltk/corpus/reader/util.py", line 295, in iterate_from
self._stream.seek(filepos)
AttributeError: 'NoneType' object has no attribute 'seek'

我认为我在访问 wsj 结构时做错了什么,但我不知道出了什么问题!

你能帮帮我吗?

提前致谢!

【问题讨论】:

    标签: python nltk tagging


    【解决方案1】:

    wsjnltk.corpus.reader.util.ConcatenatedCorpusView 类型,其行为类似于列表(这就是为什么您可以使用像 index() 这样的函数的原因),但是“幕后”NLTK 从不将整个列表读入内存,它只会读取它需要的文件对象中的那些部分。似乎如果您迭代 CorpusView 对象并同时使用index()(需要再次迭代),则文件对象将返回None

    虽然它不如列表推导那么优雅,但它可以这样工作:

      for i in range(len(wsj)):
        if wsj[i][0] in cfd2['VN'].keys():
          print wsj[(i-1):(i+1)]
    

    【讨论】:

      【解决方案2】:

      看起来索引调用和切片都导致异常:

      wsj = nltk.corpus.treebank.tagged_words(simplify_tags=True)
      cfd2 = nltk.ConditionalFreqDist((t,w) for w,t in wsj)
      wanted = cfd2['VN'].keys()
      
      # just getting the index -> exception before 60 items
      for w, t in wsj:
          if w in wanted:
              print wsj.index((w,t))
      
      # just slicing -> sometimes finishes, sometimes throws exception
      for i, (w,t) in enumerate(wsj):
          if w in wanted:
              print wsj[i-1:i+1]
      

      我猜它是由访问您正在迭代的流中的先前项目引起的。

      如果您在 wsj 上迭代一次以创建索引列表并在第二次迭代中使用它们来获取切片,则效果很好:

      results = [
          wsj[j-1:j+1]
          for j in [
              i for i, (w,t) in enumerate(wsj)
              if w in wanted
          ]
      ]
      

      附带说明:在没有 start 参数的情况下调用 index 每次都会返回第一个匹配项。

      【讨论】:

        【解决方案3】:

        wsjConcatenatedCorpusView 类型,我认为它在一个空元组('.', '.') 上窒息。最简单的解决方案是将ConcatenatedCorpusView 显式转换为list。你可以这样做:

        wsj = list(wsj)

        然后迭代工作正常。获取重复项的索引是一个单独的问题。见:https://gist.github.com/denten/11388676

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-22
          • 1970-01-01
          • 2015-04-06
          • 2015-10-02
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多