我有一大堆要标记的文本文件。我有以下代码适用于小型数据集。但是,我在使用大型数据集时使用相同的过程时遇到了麻烦。我给出了一个小数据集的例子,如下所示。
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 :(得分: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
,它是为计算代币而构建的。
如果您想要更多选项,还可以使用nltk
或textblob
。根据我的经验,后者更快。
答案 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']