这是清洁后的 df:
number summary cleanSummary
0 1-123 he loves ice cream love ice cream
1 1-234 she loves ice love ice
2 1-345 i hate avocado hate avocado
3 1-123 i like skim milk like skim milk
如您所见,有两条记录具有相同的编号
。现在我将创建并安装矢量化器。
cv = CountVectorizer(token_pattern=r"(?u)\b\w+\b", ngram_range=(1,1), analyzer='word')
cv.fit(df['cleanSummary'])
现在我要变身了。
freq = cv.transform(df['cleanSummary'])
现在如果我看一下freq
...
freq = sum(freq).toarray()[0]
freq = pd.DataFrame(freq, columns=['frequency'])
freq
frequency
0 1
1 1
2 1
3 2
4 1
5 2
6 1
7 1
...似乎没有一种合乎逻辑的方法来访问原始号码
。我尝试过循环遍历每一行的方法,但这会遇到问题,因为每个数字
可能有多个摘要。使用分组 df 的循环...
def extractFeatures(groupedDF, textCol):
features = pd.DataFrame()
for id, group in groupedDF:
freq = cv.transform(group[textCol])
freq = sum(freq).toarray()[0]
freq = pd.DataFrame(freq, columns=['frequency'])
dfinner = pd.DataFrame(cv.get_feature_names(), columns=['ngram'])
dfinner['number'] = id
dfinner = dfinner.join(freq)
features = features.append(dfinner)
return features
...可以工作,但性能很糟糕(即需要 12 小时才能运行一个句子长度的 45,000 个文档)。
如果我改变
freq = sum(freq).toarray()[0]
到
freq = freq.toarray()
我得到每个文档的每个 ngram 的频率数组。这很好,但是它不允许我将该列表数组推送到数据框中。我仍然无法访问 number
。
如何在不循环分组 df 的情况下访问每个 ngram 的原始标签 number
?我想要的结果是:
number ngram frequency
1-123 love 1
1-123 ice 1
1-123 cream 1
1-234 love 1
1-234 ice 1
1-345 hate 1
1-345 avocado 1
1-123 like 1
1-123 skim 1
1-123 milk 1
编辑:这在某种程度上是对这个问题的重新审视:Convert CountVectorizer and TfidfTransformer Sparse Matrices into Separate Pandas Dataframe Rows 。然而,在实现该答案中描述的方法之后,我面临着大型语料库的内存问题,因此它似乎不可扩展。
最佳答案
freq = cv.fit_transform(df.cleanSummary)
dtm = pd.DataFrame(freq.toarray(), columns=cv.get_feature_names(), index=df.number).stack()
dtm[dtm > 0]
number
1-123 cream 1
ice 1
love 1
1-234 ice 1
love 1
1-345 avocado 1
hate 1
1-123 like 1
milk 1
skim 1
dtype: int64
关于Sklearn CountVectorizer 的 Python 访问标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45905722/