Python 访问 Sklearn CountVectorizer 的标签
Python Access Labels of Sklearn CountVectorizer
这是我清理后的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
如您所见,有两条记录具有相同的number
。现在我将创建并安装矢量化器。
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
...似乎没有合理的方式来访问原始 number
。我已经尝试过遍历每一行的方法,但是由于每个 number
可能有多个摘要,所以这 运行 会遇到问题。使用分组 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 的频率数组。这很好,但是它不允许我将该列表数组推送到数据框中。而且我仍然无法访问 nunmber
.
如何在不循环分组 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
编辑: 这是对这个问题的重新审视:。但是,在实施该答案中描述的方法后,我面临大型语料库的内存问题,因此它似乎不可扩展。
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
这是我清理后的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
如您所见,有两条记录具有相同的number
。现在我将创建并安装矢量化器。
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
...似乎没有合理的方式来访问原始 number
。我已经尝试过遍历每一行的方法,但是由于每个 number
可能有多个摘要,所以这 运行 会遇到问题。使用分组 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 的频率数组。这很好,但是它不允许我将该列表数组推送到数据框中。而且我仍然无法访问 nunmber
.
如何在不循环分组 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
编辑: 这是对这个问题的重新审视:
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