Sklearn CountVectorizer的Python访问标签

时间:2017-08-27 13:56:29

标签: python python-3.x pandas scikit-learn countvectorizer

这是我清洁后的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。但是,在实现该答案中描述的方法之后,我面临着大型语料库的内存问题,因此它似乎不具备可扩展性。

1 个答案:

答案 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