Токенизация большого (> 70 МБ) TXT-файла с использованием Python NLTK. Конкатенация и запись данных в поток ошибок - PullRequest
5 голосов
/ 24 марта 2012

Прежде всего, я новичок в python / nltk, поэтому приношу свои извинения, если вопрос слишком базовый. У меня есть большой файл, который я пытаюсь токенизировать; Я получаю ошибки памяти.

Одно из решений, о которых я читал, - это чтение файла по одной строке за раз, что имеет смысл, однако при этом я получаю ошибку cannot concatenate 'str' and 'list' objects. Я не уверен, почему эта ошибка отображается, поскольку (после прочтения файла я проверяю его тип, и это на самом деле строка.

Я попытался разделить файлы размером 7 МБ на 4 меньших, и при запуске я получаю: error: failed to write data to stream.

Наконец, при попытке выполнить очень маленький образец файла (100 КБ или менее) и запустить измененный код, я могу токенизировать файл.

Любое понимание того, что происходит? Спасибо.

# tokenizing large file one line at a time
import nltk
filename=open("X:\MyFile.txt","r").read()
type(raw) #str
tokens = '' 
for line in filename
        tokens+=nltk.word_tokenize(filename)
#cannot concatenate 'str' and 'list' objects

Следующее работает с маленьким файлом:

import nltk
filename=open("X:\MyFile.txt","r").read()
type(raw)
tokens = nltk.word.tokenize(filename)

Ответы [ 2 ]

10 голосов
/ 24 марта 2012

Проблема № 1: Вы перебираете файл char по типу char таким образом.Если вы хотите эффективно читать каждую строку, просто откройте файл (не читайте его) и выполните итерации по file.readlines () следующим образом.

Проблема № 2: функция word_tokenize возвращает список токенов,Итак, вы пытаетесь подвести сумму str к списку токенов.Сначала вы должны преобразовать список в строку, а затем суммировать ее в другую строку.Я собираюсь использовать функцию соединения, чтобы сделать это.Замените запятую в моем коде символом, который вы хотите использовать в качестве клея / разделителя.

import nltk
filename=open("X:\MyFile.txt","r")
type(raw) #str
tokens = '' 
for line in filename.readlines():
    tokens+=",".join(nltk.word_tokenize(line))

Если вместо этого вам нужны токены в списке, просто выполните:

import nltk
filename=open("X:\MyFile.txt","r")
type(raw) #str
tokens = []
for line in filename.readlines():
    tokens+=nltk.word_tokenize(line)

Надеюсь, чтопомогает!

0 голосов
/ 20 сентября 2015

В python файлы выступают в роли итераторов. Таким образом, вы можете просто перебирать файл без необходимости вызывать какие-либо методы. Это вернет одну строку за итерацию.

Проблема 1: вы создали токены в виде строки, а word_tokenize() возвращает список.

Проблема 2: Просто откройте файл для чтения с помощью open('filename',"r").

import nltk
f=open("X:\MyFile.txt","r")
tokens=[]
for line in f:
    tokens+=nltk.word_tokenize(line)
print tokens
f.close()
...