我有两个客户评价数据框架。
我的第一个数据框'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
... ... ...
然后我将从这些数据中寻找每个二元组的趋势,从而以更简洁的方式确定积极或消极情绪的驱动力。
我什至不知道从哪里开始。非常感谢您对这里的潜在方法有任何见识。
答案 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