2016-07-29 110 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