【发布时间】:2021-10-29 04:36:56
【问题描述】:
我正在尝试优化以下计算,因为没有子集很难在普通笔记本电脑上计算它(因为 RAM),这只是实际问题的示例。我需要指导如何加快速度。
我相信我需要使用稀疏矩阵,因为这是典型的问题,但我不确定如何在没有 pandas 的情况下处理它。或者,也许有一个帮助程序库经过优化可以执行此类操作。
如果不是,我正在考虑使用 dask 并行计算一些计算。
示例数据:
from sklearn.datasets import fetch_20newsgroups
import pandas as pd
import random
data = fetch_20newsgroups(subset='train')
data = pd.DataFrame({'text': data.data[:1000]})
CAT1 = [f'cat1_{i}' for i in range(3)]
CAT2 = [f'cat2_{i}' for i in range(10)]
data['cat1'] = [random.choice(CAT1) for _ in range(data.shape[0])]
data['cat2'] = [random.choice(CAT2) for _ in range(data.shape[0])]
data
我的计算:
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(1, 3), min_df=5, max_df=1.0)
X = vectorizer.fit_transform(data['text'])
topwords = pd.DataFrame(X.toarray(), index=pd.MultiIndex.from_frame(data[['cat1', 'cat2']]))
topwords.columns = vectorizer.get_feature_names()
topwords = topwords.reset_index().melt(id_vars=['cat1', 'cat2'],
var_name='WORDS',
value_name='Value')
topwords = topwords.groupby(['cat1', 'cat2', 'WORDS'])['Value'].sum().reset_index()
topwords = topwords.groupby(['cat1', 'cat2']).apply(lambda x: x.nlargest(10, 'Value'))
topwords.reset_index(drop=True, inplace=True)
[编辑]:这是我能做到的最好的了。我解决了 RAM 的问题。但它仍然太慢,因为字典上的那个 group by。我想知道我怎样才能做得更好。
from collections import Counter
data['text_count'] = data['text'].apply(lambda row: Counter(row.split())) # Wall time: 1.22 s
data = data.groupby(['cat1', 'cat2'])['text_count'].sum().reset_index() # Wall time: 2min 5s
data['top_words'] = data['text_count'].apply(lambda row: row.most_common(3)) # Wall time: 203 ms
data = data.explode('top_words') # Wall time: 4 ms
data = pd.DataFrame(data['top_words'].tolist(),
columns= ['WORDS', 'Value'],
index=pd.MultiIndex.from_frame(data[['cat1', 'cat2']])).reset_index() # Wall time: 27.5 ms
【问题讨论】:
标签: python-3.x nlp countvectorizer