使用Python NLTK对大(> 70MB)TXT文件进行标记。连接&写入数据以传输错误

时间:2012-03-24 16:12:32

标签: python nltk tokenize

首先,我是python / nltk的新手,所以如果问题太基础,我很抱歉。我有一个大文件,我试图标记;我得到了内存错误。

我读过的一个解决方案是一次读取一行文件,这是有道理的,然而,当这样做时,我得到错误cannot concatenate 'str' and 'list' objects。我不确定为什么会显示错误,因为(在阅读文件后,我检查它的类型,它实际上是一个字符串。

我试图将7MB文件分成4个较小的文件,运行时,我得到: error: failed to write data to stream

最后,当尝试一个非常小的文件样本(100KB或更少)并运行修改后的代码时,我能够对文件进行标记化。

对正在发生的事情的任何见解?谢谢。

# 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 个答案:

答案 0 :(得分:9)

问题n°1:你正在通过char迭代文件char。如果你想有效地读取每一行,只需打开文件(不要读取它)并按如下方式迭代file.readlines()。

问题n°2:word_tokenize函数返回一个标记列表,因此你试图将一个str加到一个标记列表中。首先必须将列表转换为字符串,然后将其加到另一个字符串中。我将使用join函数来做到这一点。将我的代码中的逗号替换为要用作粘合/分隔符的char。

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)

希望有所帮助!

答案 1 :(得分:0)

在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()