TextBlob 未在 Pandas 数据框中返回正确数量的字符串实例
TextBlob not returning the correct number of instances of string in Pandas dataframe
对于我实验室的一个项目,我正在分析 Twitter 数据。我们捕获的推文中都有'sex'这个词,这是我们过滤TwitterStreamer捕获的关键字。
我将包含所有推文数据(json 元标记)的 CSV 转换为 pandas 数据库并保存 'text' 列以隔离推文文本。
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 配置?
CSV 转换不是问题!当您在 DataFrame
(即 Series
)的列上使用 str()
时,它会生成 Series 的 "print-friendly" 输出,这意味着删除大部分数据,只显示前几个和最后几个。这是一份 IPython session 的抄本,可能会更好地说明问题:
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。
如果你想按照自己的方式去做(将所有内容 back 组合成一个字符串并以这种方式使用它),那么使用像 [=42 这样的库是没有意义的=]. Pandas 给你更好的方法:
处理一系列字符串
Pandas 具有用于处理包含字符串的 Series
的工具。这里有一个tutorial-like page about it, and here is the full string handling API documentation。特别是,要查找单词 "sex" 的使用次数,您可以这样做(假设 df
是 DataFrame
,而 text
是包含推文):
import re
counts = df['text'].str.count('sex', re.IGNORECASE)
counts
应该是一个 Series
,其中包含每条推文中 "sex" 的出现次数。 counts.sum()
会给出总使用次数,希望超过 1000 次。
就语言处理而言,我不完全确定这在方法上是否正确,但使用 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
如果您的其中一个元素不是 string
类型,您可以在第一个片段中得到 TypeError
。这更多是 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
一个简单的解决方法是在使用 join
之前将列表理解中的 x
转换为 string
,如下所示:
tweets = pd.Series(str(x) for x in range(1000))
或者你可以更明确一点,首先创建一个列表,将 str
函数映射到它,然后使用 join
.
tweetlist = tweets.tolist()
tweetstr = map(str, tweetlist)
tweetstr = " ".join(tweetstr)
对于我实验室的一个项目,我正在分析 Twitter 数据。我们捕获的推文中都有'sex'这个词,这是我们过滤TwitterStreamer捕获的关键字。
我将包含所有推文数据(json 元标记)的 CSV 转换为 pandas 数据库并保存 'text' 列以隔离推文文本。
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 配置?
CSV 转换不是问题!当您在 DataFrame
(即 Series
)的列上使用 str()
时,它会生成 Series 的 "print-friendly" 输出,这意味着删除大部分数据,只显示前几个和最后几个。这是一份 IPython session 的抄本,可能会更好地说明问题:
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。
如果你想按照自己的方式去做(将所有内容 back 组合成一个字符串并以这种方式使用它),那么使用像 [=42 这样的库是没有意义的=]. Pandas 给你更好的方法:
处理一系列字符串
Pandas 具有用于处理包含字符串的 Series
的工具。这里有一个tutorial-like page about it, and here is the full string handling API documentation。特别是,要查找单词 "sex" 的使用次数,您可以这样做(假设 df
是 DataFrame
,而 text
是包含推文):
import re
counts = df['text'].str.count('sex', re.IGNORECASE)
counts
应该是一个 Series
,其中包含每条推文中 "sex" 的出现次数。 counts.sum()
会给出总使用次数,希望超过 1000 次。
就语言处理而言,我不完全确定这在方法上是否正确,但使用 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
如果您的其中一个元素不是 string
类型,您可以在第一个片段中得到 TypeError
。这更多是 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
一个简单的解决方法是在使用 join
之前将列表理解中的 x
转换为 string
,如下所示:
tweets = pd.Series(str(x) for x in range(1000))
或者你可以更明确一点,首先创建一个列表,将 str
函数映射到它,然后使用 join
.
tweetlist = tweets.tolist()
tweetstr = map(str, tweetlist)
tweetstr = " ".join(tweetstr)