Sklearn CountVectorizer 的 Python 访问标签

标签 python python-3.x pandas scikit-learn 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

如您所见,有两条记录具有相同的编号。现在我将创建并安装矢量化器。

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/

相关文章:

python - 使用 python 中的日志记录模块记录日志后运行函数

python - 无法解析应用条件语句的某些信息

python - 特定数据符合时间序列的标准是什么?

python - 转置和连接字符串

python - 递归/迭代函数返回括号内的内容?

python - Numpy 操作对 groupby 无效。使用 .groupby(...).mean() 代替,这就是我所做的

python - 使用 Pandas 计算滚动窗口中的不同字符串

python - 将静态方法与享元装饰器一起使用时出错

python - 使用查询集从 Django 获取百万记录很慢

python - 删除不符合要求的列值