首先,我是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)
答案 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()