2016-07-29 52 views
0

我有一個巨大的文本文件來標記化列表。我有以下代碼適用於小數據集。但是,我在使用與大數據集相同的過程時遇到了問題。我給出了一個小數據集的例子,如下所示。令牌化大量的python文本

In [1]: text = [["It works"], ["This is not good"]] 

In [2]: tokens = [(A.lower().replace('.', '').split(' ') for A in L) for L in text] 

In [3]: tokens 
Out [3]: 
[<generator object <genexpr> at 0x7f67c2a703c0>, 
<generator object <genexpr> at 0x7f67c2a70320>] 

In [4]: list_tokens = [tokens[i].next() for i in range(len(tokens))] 
In [5]: list_tokens 
Out [5]: 
[['it', 'works'], ['this', 'is', 'not', 'good']] 

儘管所有的小數據集的工作這麼好,我遇到的問題處理一個巨大的字符串(字符串超過1,000,000列表)使用相同的代碼清單列表。由於我仍然可以用In [3]中的巨大數據集對字符串進行標記,因此它在In [4](即在終端中死亡)失敗。我懷疑這只是因爲文本的正文太大。

我在這裏,因此,尋求對程序的改進建議,以獲取字符串列表中的一個列表,我有In [5]

但是,我的實際目的是計算每個列表中的單詞。例如,在上面的小數據集的例子中,我會得到如下的東西。

[[0,0,1,0,0,1], [1, 1, 0, 1, 1, 0]] (note: each integer denotes the count of each word) 

如果我不需要將生成器轉換爲列表以獲得所需結果(即字數),那也是很好的。

如果我的問題不清楚,請讓我知道。我很樂意盡我所能澄清。謝謝。

+0

我會用一個'設置()'建立的所有字符串的所有字的原始列表,然後通過重複使用一個計數以產生值表。 – beroe

+0

你的電腦有多少內存?另外,我想你的數據集存儲在一個文件中,你可以一句一句地加載它嗎?你會省下很多內存 – hmicn

回答

1

您可以創建的唯一字set,然後通過循環和計算每個那些...

#! /usr/bin/env python 

text = [["It works works"], ["It is not good this"]] 

SplitList = [x[0].split(" ") for x in text] 
FlattenList = sum(SplitList,[]) # "trick" to flatten a list 
UniqueList = list(set(FlattenList)) 
CountMatrix = [[x.count(y) for y in UniqueList] for x in SplitList] 

print UniqueList 
print CountMatrix 

輸出是單詞的總名單,以及他們在每串計數:

['good', 'this', 'is', 'It', 'not', 'works'] 
[[0, 0, 0, 1, 0, 2], [1, 1, 1, 1, 1, 0]] 
+0

我很抱歉。我沒有看到你使用的文字是不同的。所以你其實是對的。萬分感謝!! – achimneyswallow

+1

當然。我只是改變了文字,以確保它能夠重複使用。 – beroe

+0

由於我用我的巨大數據集嘗試了您的代碼,該進程仍然在終端中被終止。儘管如此,我仍然感謝您的意見。代碼很漂亮。 – achimneyswallow

0

有很多優化的可用標記器。我會看中的CountVectorizer,它是爲計數令牌而構建的。

你也可以,如果你想要更多的選擇使用nltktextblob。根據我的經驗,後者更快。

+0

謝謝。我使用了CountVectorizer。儘管我試圖將原始文本轉換爲計數數據,但是,我用完了內存。這裏是我的帖子http://stackoverflow.com/questions/38670059/vectorization-in-sklearn-seems-to-be-very-memory-expensive-爲什麼我會嘗試textblob。我以前不知道這個選項。謝謝你讓我知道。 – achimneyswallow

+0

嘗試在'gensim'中探索。該程序包是爲了避免使用大量RAM而編寫的。您可以使用保存在磁盤上的文件(而不是將它們加載到內存中)。我很確定'gensim'有一個標記器。 – Jason