nltk sentence tokenizer 给出 AttributeError

nltk sentence tokenizer gives AttributeError

我是 python 和 NLTK 的新手。 有一个问题让我感到困惑:

当我做的时候

tokenized = custom_sent_tokenizer.tokenize("some long text")

它给了我完美的结果。但是当我将这个硬编码字符串更改为包含大量文本的变量时,它会给我主题中提到的错误即:

tokenized = custom_sent_tokenizer.tokenize(text)
...
AttributeError: 'list' object has no attribute 'abbrev_types'

下面是我的完整代码:

from __future__ import division
import urllib.request
import csv
import nltk
from string import punctuation
from nltk.corpus import stopwords
from nltk.tokenize import PunktSentenceTokenizer

comments = open("CNPS_Comments.txt").read()
comments_list = comments.split('\n')

custom_sent_tokenizer = PunktSentenceTokenizer(comments_list[:300])
##tokenized = custom_sent_tokenizer.tokenize("some long text")
text=""
for comment in comments_list:
   text += comment

tokenized = custom_sent_tokenizer.tokenize(text)
def process_content():
  try:
    for i in tokenized[:5]:
        words = nltk.word_tokenize(i)
        tagged = nltk.pos_tag(words)
        print(tagged)

except Exception as e:
    print(str(e))


process_content()

我今天从 python 开始,这里可能有很多事情我没有有效地完成。

给您带来麻烦的那一行是正确的:这就是您应该如何使用句子分词器,将单个字符串作为其参数。你收到一个错误,因为你创建了一个怪物:-)

Punkt 句子分词器基于无监督算法:您给它一段长文本,它会计算出句子边界必须位于何处。但是您已经使用 list 句子(comments_list 中的前 300 个元素)训练了分词器,这是不正确的。分词器不知何故没有注意到,并在您尝试正确使用它时给您一些错误。

要解决此问题,请使用单个字符串训练分词器。您最好将字符串列表连接成一个这样的列表:

tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))

PS。当您对文字字符串进行标记时,您一定是错误地认为它可以成功运行。当然,有效代码与您问题中的代码之间还有其他差异。