2012-03-24 18 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()