2012-03-24 68 views
5

首先,我是python/nltk的新手,所以如果问题太简单,我很抱歉。我有一个我想要标记的大文件;我收到内存错误。使用Python NLTK标记大型(> 70MB)TXT文件。连接和写入数据以传输错误

我读过的一个解决方案是一次读取一行文件,这是有道理的,但是,这样做时,出现错误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) 

回答

9

问题N°1:你是通过迭代这样的字符的文件字符。如果您想要有效地读取每一行,只需打开该文件(不要读取它)并按如下方式遍历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

完美地工作!非常感谢你luke14free – 2012-03-24 17:34:28

+3

但请注意,'word_tokenize'假设它一次只运行一个句子,所以这会给你一些标记错误。真的,你需要读取一个文件块,用'sent_tokenize'分割它,然后将它传递给'word_tokenize'。如果你需要一行一行地阅读,并且你的句子跨越了一条线,这是一种痛苦。所以你可能更喜欢现在只是住在不完善的地方...... – alexis 2012-03-28 16:06:01

+1

是的,我的代码是基于相当强烈的假设,你无法在句子中找到\ n。 – luke14free 2012-03-28 19:15:27

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