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