我有一个带有一列文本数据的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