2012-02-03 23 views
-2

我試圖從標記語料庫的執行語句中提取專有名詞。當我運行的代碼,它僅顯示第1兩句的專有名詞的列表,然後它將停止並提供了以下錯誤:Python中的對象

  Traceback (most recent call last): 
      print(list(words4)) 
      TypeError: 'NoneType' object is not iterable 

代碼:

 #extracting 
     def noun(sen): 
      for t in range(len(sen)): 
       if (sen[t].split('/')[1].lower() == 'np'): 
        w=sen[t].split('/') 
        return w 

     if __name__ == '__main__': 
      import nltk 
      from nltk.corpus import brown 
      f = brown.raw('ca01') 
      print f 
      mylist = [] 
      #splitting 
      sentences = splitParagraphIntoSentences(f) 
      for s in sentences: 
       mylist.append(s.strip()) 

      for i in mylist: 
       print i 

      for s in range(len(mylist)): 
       words1 = mylist[s].split() 
       words2 = mylist[s+1].split() 
       words3= noun(words1) 
       words4= noun(words2) 
       print(list(words3)) 
       print(list(words4)) 

如何解決錯誤。謝謝。

+4

請修復縮進 – kennytm 2012-02-03 19:07:13

+5

您的'noun()'函數可以返回'None'(如果'if'語句中的代碼永遠不會到達),並且'None'不能被迭代。 – 2012-02-03 19:07:44

回答

2

您正在這裏有兩個誤區:

  1. 「NP」是不是唯一的名詞短語,NLTK使用。它也使用「NNP」和其他一些。您需要查看標記集以瞭解其中的內容。但是我不知道你現在要瞄準什麼,所以尋找「np」可能不是完全錯誤的。

  2. 您的noun(sen)功能不總是返回的東西。它只會在您的句子中找到標有「np」的單詞時纔會返回。現在雖然每個句子都有一個名詞是一個合理的假設,但考慮到NLTK不是最先進的,因此可能會偶爾錯過一些名詞。另外,就像我在(1)中提到的那樣,NLTK也可以用「NNP」標註單詞,所以要小心。

要糾正這個問題,請嘗試以下noun(sen)功能(你的稍作修改的版本:

def noun(sen): 
    for t in range(len(sen)): 
     if (sen[t].split('/')[1].lower() == 'np'): 
      w=sen[t].split('/') 
      return w 
    return [] 

PS:請儘量不要使用空單縮進這是不是最好的風格和品牌。眼睛受傷