使用大型文本数据生成特征而不会崩溃

时间:2019-03-01 19:19:59

标签: python pandas nlp large-data

我有两个列表。第一个是10,000个单个单词的字符串的列表。第二个是列表2,000,000个2元组。每个元组中的第一项是标记化句子的列表。元组中的第二项是1或0。

word_features = ['red', 'ball', 'keyword', 'else']
tuples_tokenized = [(['this', 'has', 'red', 'and', 'ball'], 1.0), (['this', 'has', 'one', 'keyword'], 0.0), (['I', 'am', 'now', 'done'], 0.0)]

很抱歉,我无法提供更清晰的期望输出,但是我想创建一个pandas数据框,其中行数等于第二个列表中的元组数,列数等于数第一个列表中的单词。我希望该数据框可以用与pd.get_dummies()相似的方式填充1和0。 [n,m]行中的1表示可以在rom n中的元组的标记化句子中找到m列的单词。

name | binary | 'red' | 'ball' | 'keyword' | 'else'
['this', 'has', 'red', 'and', 'ball'] | 1.0 | 1 | 1 | 0 | 0
['this', 'has', 'one', 'keyword']     | 0.0 | 0 | 0 | 1 | 0
['I', 'am', 'now', 'done']            | 0.0 | 0 | 0 | 0 | 0

因为我不知道如何实现,所以我尝试创建一个功能列表,然后可以将这些功能形成一个数据框的行。下面的函数集记录了我的努力,尽管由于我的数据集很大,它被杀死了约15%。

import nltk

def find_features(document, word_features):
    words = set(document)
    features = {}
    for w in word_features:
        features[w] = (w in words)
    return features

def create_feature_set(tuples_tokenized, word_features, chunk_size=25):
    print('Number of tuples searched: %s' % len(tuples_tokenized))
    print('Number of words searching for: %s' % len(word_features))
    dt_start = datetime.datetime.now()
    print('Starting time:', dt_start)
    feature_sets = []
    i, total_chunks = 0, len([x for x in chunks(tuples_tokenized, chunk_size)])
    for chunk in chunks(tuples_tokenized, chunk_size):
        i += 1
        print('Chunk %s out of %s' % (i, total_chunks))
        print('Time elapsed:', datetime.datetime.now() - dt_start)
        for (text, post) in chunk:
            feature_set = find_features(text, word_features)
            feature_sets.append(feature_set)
    print('%s sets found' % len(feature_sets))
    return feature_sets

def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]

feature_sets=[]
feature_sets = create_feature_set(tuples_tokenized, word_features, chunk_size=10)

是否有一种方法可以对我的数据进行分块处理,以便可以在我的计算机上对其进行处理而不会被杀死,或者有一种创建数据框的方法,正如我上面试图说明的那样?我也想知道是否有一种方法可以使用数组或压缩矩阵,但是我不知道如何实现。

最终的动机是,如果有帮助,则使用NLTK或sklearn的朴素贝叶斯函数。

0 个答案:

没有答案