TextBlob没有在Pandas数据帧中返回正确数量的字符串实例

时间:2015-07-15 23:02:15

标签: python pandas textblob

对于我实验室的项目,我正在分析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周围没有正确配置?

2 个答案:

答案 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"的使用次数,你可以这样做(假设dfDataFrame,而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)