1

对于我实验室的一个项目,我正在分析 Twitter 数据。我们捕获的推文中都有“性”一词,这是我们过滤 TwitterStreamer 以捕获的关键字。

我将所有推文数据(json 元标记)都存放在 pandas 数据库中的 CSV 进行了转换,并保存了“文本”列以隔离推文文本。

    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.

“sex”一词的出现次数应该至少与 CSV 中的行数一样多,而且可能更多。我无法弄清楚这里发生了什么。TextBlob 是否没有围绕 dtype:object 进行配置?

4

2 回答 2

0

CSV 转换不是问题!当您str()在 a DataFrame(即 a Series)的列上使用时,它会生成 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。

如果您想按照自己的方式进行操作(将所有内容组合单个字符串并以这种方式使用),那么使用 Pandas 之类的库是没有意义的。Pandas 为您提供更好的方法:

使用一系列字符串

Pandas 有用于处理Series包含字符串的 a 的工具。这是一个类似教程的页面,这里是完整的字符串处理 API 文档。特别是,要查找“性”一词的使用次数,您可以执行以下操作(假设df是 a DataFrame,并且text是包含推文的列):

import re
counts = df['text'].str.count('sex', re.IGNORECASE)

counts应该是Series包含每条推文中“性”的出现次数。 counts.sum()会给你使用的总数,希望超过 1000。

于 2015-07-16T00:55:16.663 回答
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如果您的一个元素不是 type ,您可以在第一个片段中获得 a 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列表推导转换为stringbefore using join,如下所示:

tweets = pd.Series(str(x) for x in range(1000))

或者您可以更明确地先创建一个列表,将str函数映射到它,然后使用join.

tweetlist = tweets.tolist()
tweetstr = map(str, tweetlist)
tweetstr = " ".join(tweetstr)
于 2015-07-16T02:00:06.170 回答