使用文本字符串创建Pandas数据帧中出现的单词矩阵



我有一个带有一列文本数据的Pandas数据框架。我想将该文本数据的每一行与我感兴趣的单词列表进行比较。比较结果应该是一个矩阵,显示单词(0或1)在该行数据的文本中的出现情况。

输入数据帧:

text
That bear talks
The stone rocks
Tea is boiling
The bear drinks tea

输入单词列表:

[bear, talks, tea]

结果:

text                 bear  talks  tea
That bear talks      1     1      0
The stone rocks      0     0      0
Tea is boiling       0     0      1
The bear drinks tea  1     0      1

我在sklearn.feature_extract.text.HashingVectorizer上找到了一些信息,但据我所知,它只是获取整个数据帧,并将其分解为组件词并对其进行计数。我想做的是在一个非常有限的清单上做这件事。

使用sklearn,我做了以下操作:

from sklearn.feature_extraction.text import HashingVectorizer
countvec = HashingVectorizer()
countvec.fit_transform(resultNLdf2.text)

但这给了我以下信息:

<73319x1048576 sparse matrix of type '<class 'numpy.float64'>'
    with 1105683 stored elements in Compressed Sparse Row format>

这似乎有点大,除非我可以从这个稀疏矩阵中选择我想要的单词,但我不知道如何使用它。

如果我用错了词来解释这个问题,我很抱歉,不确定你是否会称之为矩阵。

编辑

我正在处理的真实数据相当大,有1264555行推文字符串。至少我学会了不要过分简化一个问题:-p。这使得一些给定的解决方案(感谢您的帮助!!)由于内存问题或速度非常慢而无法工作。这也是我关注sklearn的一个原因。

带有:

from sklearn.feature_extraction.text import CountVectorizer
words = ['bear', 'talks', 'tea']
countvec = CountVectorizer(vocabulary=words)
countvec.fit_transform(resultNLdf2.text)

实际上,你可以通过列出一个简单的列表来限制你想看的单词。但这给我留下了一个问题,即它的格式如上所述,我不确定该怎么办。

您可以使用Series.str.get_dummies

>>> print df.join(df.text.str.get_dummies(' ').loc[:, ['bear', 'talks', 'tea']])
                 text  bear  talks  tea
0      That bear talks     1      1    0
1      The stone rocks     0      0    0
2       Tea is boiling     0      0    0
3  The bear drinks tea     1      0    1

在测试了我最初问题的解决方案后,我想坚持使用sklearn,因为它看起来非常快,而且我处理的大量数据似乎没有问题。为了坚持"耳朵,说话,茶"的例子,这里是我现在使用的解决方案:

from sklearn.feature_extraction.text import CountVectorizer
df = pd.DataFrame(["That bear talks", "The stone rocks", "Tea is boiling", "The bear drinks tea"], columns=['text'])
words = ['bear', 'talks', 'tea']
countvec = CountVectorizer(vocabulary=words)
dfFinal = pd.DataFrame(countvec.fit_transform(df.text).toarray(), index=df.text, columns=countvec.get_feature_names())

当然,我仍然有兴趣了解为什么这个或其他解决方案是好的,或者我应该考虑的事情。

由于您有一个有限的列表,您可以循环列表中的单词,并对每个单词执行以下操作:

df['bear'] = df['text'].str.contains('bear')

您可以使用python字符串计数。

import pandas as pd
x= ["That bear talks","The stone rocks","Tea is boiling","The bear drinks tea"]
words = ['bear', 'talks', 'tea']
out=pd.DataFrame(index=x,columns=words)
for i in range(0,out.shape[0]):
    for word in words:
        out.ix[i,str(word)]= out.index[i].count(str(word))
print(out)
                    bear talks tea
That bear talks        1     1   0
The stone rocks        0     0   0
Tea is boiling         0     0   0
The bear drinks tea    1     0   1

相关内容

  • 没有找到相关文章

最新更新