nltk句子标记化器给出了AttributeError

时间:2016-05-12 12:52:34

标签: python python-3.x nltk tokenize text-mining

我是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,可能会有很多我在这里没有做到的事情。

1 个答案:

答案 0 :(得分:3)

给你带来麻烦的那条线是正确的:这就是你应该如何使用句子标记器,一个字符串作为它的参数。你得到一个错误,因为你创造了一个怪物: - )

Punkt句子标记器基于无监督算法:你给它一个长文本,它可以找出句子边界必须在哪里。但是您已经使用列表句子(comments_list中的前300个元素)训练了您的标记器,这是不正确的。不知何故,当你试图正确使用它时,令牌器不会注意到,并且会给你一些错误。

要解决此问题,请使用单个字符串训练您的标记生成器。您最好将字符串列表加入如下:

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

PS。在标记文字字符串时,它必须是错误的。当然,有效的代码和你问题中的代码之间还存在其他差异。