对于我实验室的项目,我正在分析Twitter数据。我们捕获的推文都有“性别”这个词。在它们中,我们过滤了TwitterStreamer基于的关键字。
我转换了CSV,其中所有的推文数据(json元标记)都放在一个pandas数据库中并保存了'文本'用于隔离推文文本的列。
import pandas as pd
import csv
df = pd.read_csv('tweets_hiv.csv')
saved_column4 = df.text
print saved_column4
输出正确的输出:
0 Some example tweet text
1 Oh hey look more tweet text @things I hate #stuff
...a bunch more lines
Name: text, Length: 8540, dtype: object
但是,当我尝试这个时
from textblob import TextBlob
tweetstr = str(saved_column4)
tweets = TextBlob(tweetstr).upper()
print tweets.words.count('sex', case_sensitive=False)
我的输出是22
。
“性别”这个词的发生率至少应该是这样的。因为CSV中有行,可能更多。我无法弄清楚这里发生了什么。 TextBlob是否在dtype:object周围没有正确配置?
答案 0 :(得分:0)
CSV转换不是问题!当您在str()
的列(即DataFrame
)上使用Series
时,它会使"打印友好"系列的输出,这意味着删除大部分数据,只显示前几个和最后几个。以下是IPython会话的成绩单,可能会更好地说明问题:
In [1]: import pandas as pd
In [2]: blah = pd.Series('tweet %d' % n for n in range(1000))
In [3]: blah
Out[3]:
0 tweet 0
1 tweet 1
... (output continues from 1 to 29)
29 tweet 29
... (OUTPUT SKIPS HERE)
970 tweet 970
... (output continues from 970 to 998)
998 tweet 998
999 tweet 999
dtype: object
In [4]: blahstr = str(blah)
In [5]: blahstr.count('tweet')
Out[5]: 60
因此,由于str()
操作的输出会切断我的数据(甚至可能截断列值,如果我使用了更长的字符串),我得不到1000,我得60。 / p>
如果你想按自己的方式去做(将所有 back 组合成一个字符串并以这种方式使用它),那么使用像Pandas这样的库是没有意义的。熊猫给你更好的方法:
Pandas拥有使用包含字符串的Series
的工具。这是一个tutorial-like page about it,这里是完整的string handling API documentation。特别是,为了找到单词" sex"的使用次数,你可以这样做(假设df
是DataFrame
,而text
是包含推文的专栏):
import re
counts = df['text'].str.count('sex', re.IGNORECASE)
counts
应为Series
,其中包含" sex"的出现次数。在每条推文中。 counts.sum()
将为您提供总使用次数,有望超过1000次。
答案 1 :(得分:0)
在语言处理方面,我并不完全确定这在方法上是正确的,但使用join
会为您提供所需的计数。
import pandas as pd
from textblob import TextBlob
tweets = pd.Series('sex {}'.format(x) for x in range(1000))
tweetstr = " ".join(tweets.tolist())
tweetsb = TextBlob(tweetstr).upper()
print tweetsb.words.count('sex', case_sensitive=False)
# 1000
如果您只需要计数而不必使用TextBlob
,那么只需执行:
import pandas as pd
tweets = pd.Series('sex {}'.format(x) for x in range(1000))
sex_tweets = tweets.str.contains('sex', case=False)
print sex_tweets.sum()
# 1000
如果您的某个元素不属于TypeError
类型,则可以在第一个代码段中获得string
。这更多是join
问题。可以使用以下代码段进行简单的测试:
# tweets = pd.Series('sex {}'.format(x) for x in range(1000))
tweets = pd.Series(x for x in range(1000))
tweetstr = " ".join(tweets.tolist())
这给出了以下结果:
Traceback (most recent call last):
File "F:\test.py", line 6, in <module>
tweetstr = " ".join(tweets.tolist())
TypeError: sequence item 0: expected string, numpy.int64 found
一个简单的解决方法是在使用x
之前将列表推导中的string
转换为join
,如下所示:
tweets = pd.Series(str(x) for x in range(1000))
或者您可以更明确地创建列表,将str
函数映射到它,然后使用join
。
tweetlist = tweets.tolist()
tweetstr = map(str, tweetlist)
tweetstr = " ".join(tweetstr)