这是我清洁后的df:
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
......似乎不是访问原始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
的合理方式。我已经尝试了循环遍历每一行的方法,但这会遇到问题,因为每个freq = sum(freq).toarray()[0]
可能有多个摘要。使用分组df的循环...
freq = freq.toarray()
......有效,但表现很差(即12个小时可以运行45,000个文件,一个句子长度)。
如果我改变
nunmber
到
number
我为每个文档得到每个ngram的频率数组。这很好,但它不允许我将列表数组推送到数据帧中。我仍然无法访问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
。
如何在不循环分组df的情况下访问每个ngram的原始标签{{1}}?我想要的结果是:
{{1}}
编辑:这是对这个问题的重新审视:Convert CountVectorizer and TfidfTransformer Sparse Matrices into Separate Pandas Dataframe Rows。但是,在实现该答案中描述的方法之后,我面临着大型语料库的内存问题,因此它似乎不具备可扩展性。
答案 0 :(得分:2)
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