首页 > 解决方案 > TextBlob - 遍历文章以计算极性和主观性分数

问题描述

我正在研究 TextBlob 来计算我编制的 Excel 表上的文章列表的情绪分数(极性、主观性)。

以下是该表的示例:

2004 年 11 月 3 日 04:03 埃菲通讯社和其他媒体称,在西班牙有史以来最严重的恐怖袭击中,马德里拥挤的火车上发生了三起炸弹袭击,造成至少 60 人死亡。红十字会说至少有200人受伤。“这是一场大屠杀,”社会党领袖何塞·路易斯·罗德里格斯·萨帕特罗说,他指责巴斯克恐怖组织 ETA。

2005 年 7 月 7 日 04:41 伦敦关闭了地铁系统,并在紧急服务人员接到金融区及其周边地区的爆炸事件后撤离了所有车站。

2009 年 1 月 12 日 04:00 美国国际集团 (AIG) 今天宣布,它已经完成了与纽约联邦储备银行 (FRBNY) 的两项先前宣布的交易,这些交易使 AIG 欠纽约联邦储备银行的债务减少了 250 亿美元以换取 FRBNY 收购某些新成立的子公司的优先股权。

22/08/2013 11:38 纳斯达克因电脑问题关闭 3 小时

通过单独执行每一行,我已经能够以最简单的方式使用 textblob:

analysis = TextBlob("NASDAQ shuts down for 3 hours due to a computer problem")
print(analysis.sentiment)

我想要导入包含日期和时间的 excel 文件以及两列中的文章,然后继续循环遍历每一行以计算极性和主观性分数并将其保存在文件中。

我试过用这种方式修改 Thomson Reuters News Analytics 上的代码:

import pandas as pd
import numpy as np
from textblob import TextBlob

path_to_file = "C:/Users/Parvesh/Desktop/New Project/Sentiment Analysis/events.csv"
df = pd.read_csv(path_to_file, encoding='latin-1')
df.head()

df['Polarity'] = np.nan
df['Subjectivity'] = np.nan

pd.options.mode.chained_assignment = None

for idx, articles in enumerate(df['articles'].values):  # for each row in our df dataframe
    sentA = TextBlob("articles")  # pass the text only article to TextBlob to analyze
    df['Polarity'].iloc[idx] = sentA.sentiment.polarity  # write sentiment polarity back to df
    df['Subjectivity'].iloc[idx] = sentA.sentiment.subjectivity  # write sentiment subjectivity score back to df
df.head()

df.to_csv("out.csv", index=False)

虽然代码不起作用......我没有得到任何分数。

关于我如何做到这一点的任何建议?

我是 Python 的新手(我正在使用 Pycharm)。我主要在 Stata 和 Matlab 上编写代码。

请帮忙!

标签: pythontextblob

解决方案


您应该将逻辑移动到一个函数中,然后使用该函数将该函数应用于 DataFrame 的每一行pd.Series.map()。使用.map()or.apply()比手动循环更快更干净。

import pandas as pd
from textblob import TextBlob

path_to_file = "C:/Users/Parvesh/Desktop/New Project/Sentiment Analysis/events.csv"
df = pd.read_csv(path_to_file, encoding='latin-1')
df.head()

# function to extract polarity and subjectivity from text
def process_text(text):
    blob = TextBlob(text)
    return blob.sentiemnt.polarity, blob.sentiment.subjectivity

# apply to each row of the 'articles' Series using the pd.Series.map method
df["polarity"], df["sentiment"] = zip(*df.articles.map(process_text))

df.head()

df.to_csv("out.csv", index=False)

免责声明:我没有测试过这个。


推荐阅读