我有两个列表。第一个是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的朴素贝叶斯函数。