在python中对大量文本进行标记

时间:2016-07-29 23:13:17

标签: python string nlp tokenize

我有一大堆要标记的文本文件。我有以下代码适用于小型数据集。但是,我在使用大型数据集时使用相同的过程时遇到了麻烦。我给出了一个小数据集的例子,如下所示。

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)

如果我不必将生成器转换为列表以获得所需的结果(即字数),那也是好的。

如果我的问题不清楚,请告诉我。我想尽我所能澄清。谢谢。

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:0)

有许多优化的可用标记器。我会查看CountVectorizer中的sklearn,它是为计算代币而构建的。

如果您想要更多选项,还可以使用nltktextblob。根据我的经验,后者更快。

答案 2 :(得分:0)

您已经提到它是巨大的数据集。使用此

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

IN [2]:

processed_features = []

for sentence in range(0, len(text )):
   # remove all single characters
   processed_feature= re.sub(r'[^\w\s]', ' ', processed_feature)

   # Converting to Lowercase
   processed_feature = processed_feature.lower()

   processed_features.append(processed_feature)

processed_features

#['it works', 'this is not good']

IN [3]:

import nltk
new_contents = []
for i in range(0, len(processed_features)):
    new_content = nltk.tokenize.TreebankWordTokenizer().tokenize(processed_features[i])
    new_contents.append(new_content)

new_contents 

#[['it', 'works'], ['this', 'is', 'not', 'good']