【问题标题】:NLTK python tokenizing a CSV fileNLTK python标记一个CSV文件
【发布时间】:2015-06-01 10:58:23
【问题描述】:

我已经开始尝试使用 Python 和 NLTK。 我遇到了一条冗长的错误消息,我无法找到解决方案,希望您能提供任何见解。

import nltk,csv,numpy 
from nltk import sent_tokenize, word_tokenize, pos_tag
reader = csv.reader(open('Medium_Edited.csv', 'rU'), delimiter= ",",quotechar='|')
tokenData = nltk.word_tokenize(reader)

我在 OSX Yosemite 上运行 Python 2.7 和最新的 nltk 包。 这也是我尝试的两行代码,结果没有差异:

with open("Medium_Edited.csv", "rU") as csvfile:
tokenData = nltk.word_tokenize(reader)

这些是我看到的错误消息:

Traceback (most recent call last):
  File "nltk_text.py", line 11, in <module>
    tokenData = nltk.word_tokenize(reader)
  File "/Library/Python/2.7/site-packages/nltk/tokenize/__init__.py", line 101, in word_tokenize
    return [token for sent in sent_tokenize(text, language)
  File "/Library/Python/2.7/site-packages/nltk/tokenize/__init__.py", line 86, in sent_tokenize
    return tokenizer.tokenize(text)
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 1226, in tokenize
    return list(self.sentences_from_text(text, realign_boundaries))
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 1274, in sentences_from_text
    return [text[s:e] for s, e in self.span_tokenize(text, realign_boundaries)]
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 1265, in span_tokenize
    return [(sl.start, sl.stop) for sl in slices]
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 1304, in _realign_boundaries
    for sl1, sl2 in _pair_iter(slices):
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 310, in _pair_iter
    prev = next(it)
  File "/Library/Python/2.7/site-packages/nltk/tokenize/punkt.py", line 1278, in _slices_from_text
    for match in self._lang_vars.period_context_re().finditer(text):
TypeError: expected string or buffer

提前致谢

【问题讨论】:

    标签: python-2.7 csv nltk tokenize


    【解决方案1】:

    正如您在Python csv documentation 中所读到的,csv.reader“返回一个读取器对象,它将遍历给定 csv 文件中的行”。换句话说,如果你想标记你的 csv 文件中的文本,你将不得不遍历这些行中的行和字段:

    for line in reader:
        for field in line:
            tokens = word_tokenize(field)
    

    另外,当您在脚本开头导入word_tokenize 时,您应该将其命名为word_tokenize,而不是nltk.word_tokenize。这也意味着您可以删除import nltk 语句。

    【讨论】:

    • 感谢您的回复,这是我编辑的代码:code import csv import numpy as np from nltk import sent_tokenize, word_tokenize as word_tokenize, pos_tag reader = csv.reader(open('Milling_Final_Edited.csv', 'rU'), delimiter=',', quotechar='"') for line in reader: for field in line: tokens = word_tokenize(field) code。 我是 Python 和 NLTK 的新手,所以我有一些事情要做。现在我收到一个编码错误 -code UnicodeDecodeError: 'ascii' codec can't decode byte 0xea in position 1: ordinal not in range(128). code 虽然文件是 utf-8。
    • 尝试import codecs并以codecs.open('Milling_Final_Edited.csv', 'rU', encoding="utf-8")打开文件
    • 新代码import csv, codecs import numpy as np from nltk import sent_tokenize, word_tokenize as word_tokenize, pos_tag as pos_tag reader =codecs.open('Milling_Final_Edited.csv', 'r', encoding="utf-8", errors="ignore") for line in reader: for field in line: tokens = word_tokenize(field) posData = pos_tag(tokens) print(posData)
      我不得不将errors="ignore" 添加到codecs.open 以解决编码错误,但现在我遇到了另一个问题。输出为 [(u'3', 'LS')]。实际文件字符均值('3')的 u 字符婴儿是什么?另外,输出只有 25 行中的 1 行。
    • u 表示这是一个 unicode 字符串。我假设脚本只输出一行,因为你的缩进有问题。确保print 语句与word_tokenize 调用处于同一缩进级别。
    • 你是对的!感谢你的协助。你今天帮了我很大的忙!!路上仍有颠簸,但没关系。
    【解决方案2】:

    它给出了错误 - 预期的字符串或缓冲区,因为您忘记将 str 添加为

    tokenData = nltk.word_tokenize(str(reader))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2016-01-09
      • 2014-12-07
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 2015-03-23
      相关资源
      最近更新 更多