根据文本匹配,在Pandas DataFrame上加入并运行计算

时间:2018-12-24 01:51:35

标签: python pandas sentiment-analysis

我有两个客户评价数据框架。

我的第一个数据框'df'包含数千的原始客户评论,已处理/已清理的评论数据以及情感评分:

reviewBody                   reviewClean           sentimentScore
'I like these goggles'       'like goggles'        1
'I don't like these goggles' 'don't like goggles'  -1
'My strap broke'             'strap broke'         -1
 ...                         ...                  ...

我的第二个数据框'bigrams'包含我的第一个数据框中名为“ reviewClean”的字段中最常见的二元组:

topBigrams                 frequency
'like goggles'               150 
'strap broke'                100
  ...                        ...          

我的目标是获取我的每个topBigram,例如“像护目镜”或“皮带断裂”,查找包含每个二元组和整个评论的相关情感的每个“ reviewClean”,并计算每个topBigram的平均情感得分。

我的最终结果看起来像这样(纯数字表示):

topBigrams                 frequency   avgSentiment
'like goggles'             150         .98
'strap broke'              100         -.90
 ...                        ...         ...

然后我将从这些数据中寻找每个二元组的趋势,从而以更简洁的方式确定积极或消极情绪的驱动力。

我什至不知道从哪里开始。非常感谢您对这里的潜在方法有任何见识。

1 个答案:

答案 0 :(得分:0)

您将必须进行交叉联接see this post,以检查每个评论是否包含每个双字母组。使用apply无法解决问题,因为您需要进行按行字符串比较。

df = pd.DataFrame([['I like these goggles', 'like goggles', 1],
        ["I don't like these goggles", "don't like goggles", -1],
        ['My strap broke', 'strap broke', -1]],
        columns=['reviewBody', 'reviewClean', 'sentimentScore'])

bigrams = pd.DataFrame([['like goggles', 150],
        ['strap broke', 100]],
        columns=['topBigrams', 'frequency'])

dfx = bigrams.assign(key=1).merge(df.assign(key=1), on='key').drop('key', 1)
dfx['has_bigram'] = dfx.apply(lambda x: x.get('topBigrams') in x.get('reviewClean'), axis=1)

在每个清理过的评论中检查了bigram后,您可以使用groupby来计算bigram的平均情绪,仅用于存在bigram的地方。然后将其合并回到bigrams数据框中。

bigrams.merge(dfx.groupby(['topBigrams', 'has_bigram'])
                 .mean()
                 .reset_index()
                 .query('has_bigram')
                 .rename(columns={'sentimentScore':'avgSentiment'})
                 .get(['topBigrams', 'avgSentiment']),
              on='topBigrams')

# returns:
     topBigrams  frequency  avgSentiment
0  like goggles        150             0
1   strap broke        100            -1