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

Lui*_*uel 5 python tokenize nltk

首先,我是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
Run Code Online (Sandbox Code Playgroud)

以下适用于小文件:

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

luk*_*ree 10

问题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))
Run Code Online (Sandbox Code Playgroud)

如果您需要列表中的令牌,只需执行以下操作:

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

希望有所帮助!

  • 但要注意`word_tokenize`假设它一次只运行一个句子,所以这会给你一些标记化错误.真的,你需要读取文件的一大块,用`sent_tokenize`拆分它,然后将它传递给`word_tokenize`.如果你需要逐行阅读,并且你的句子跨越线条,这是一种痛苦.所以你可能更愿意忍受现在的不完美之处...... (3认同)