所以我有一个包含许多列的大型数据框。让我们说我感兴趣的两个主要栏目是消息和名称。每条消息都会像个人身份一样,并附有此人的姓名。让我们说我有一个充满情感/感觉词汇的词汇,这些词汇相当庞大,但简洁的版本可能看起来像['悲伤',' happy','松了一口气,#39;愤怒'愤怒'狂喜','骄傲','失望'] 。对于每个名称(并且名称可以重复,因为它们可以有多个消息),我想跟踪他们使用的情感词及其附带的计数。例如(我已经做了这个,因为我有一个非常大的数据集):
Message Name
I am really happy with my progress. Alice
I was annoyed by his inconsideration. John
I felt proud after seeing her performance. Lisa
I am ecstatic after hearing the good news. Alice
I felt disappointed by her dishonesty Lisa
如果我想要的东西基本上会告诉我以下内容(我不必关心格式,只要它干净):{Alice:happy:1,欣喜若狂:1;约翰:生气:1;丽莎:自豪:1,失望:1}。
最好/最简单的方法是什么?字典词典是最好的方法吗?其次(这是一个额外的相关问题),经过上面的计算,如果我想为每个名字找到最常用的情感词,该怎么办?在这个例子中,一切都与1相关,但想象一下计数是不一样的。
答案 0 :(得分:3)
如果您正在寻找一种非常简单的方式来完成您所寻找的内容,我建议您将pandas groupby功能与collections utility结合使用。< / p>
df = pd.read_csv('messages.csv')
df['Emotion Words'] = df.Message.apply(extract_emotion_words)
print(df)
<强>输出:强>
Message Name Emotion Words
0 I am really happy with my progress. Alice [happy]
1 I am really happy with johns progress. Alice [happy]
2 I was annoyed by his inconsideration. John [annoyed]
3 I felt proud after seeing her performance. Lisa [proud]
4 I am ecstatic after hearing the good news. Alice [ecstatic]
5 I felt disappointed by her dishonesty Lisa [disappointed]
from collections import Counter
df.groupby('Name')['Emotion Words'].sum().apply(Counter)
<强>输出:强>
Name
Alice {'happy': 2, 'ecstatic': 1}
John {'annoyed': 1}
Lisa {'disappointed': 1, 'proud': 1}
dtype: object
由于您还表示您想要获得最常见的情感词,您可以使用Counter.most_common(n)
函数,其中n
是要提取的最常用词的数量(在您的情况下为1):
df.groupby('Name')['Emotion Words'].sum().apply(
lambda words: Counter(words).most_common(1)
)
<强>输出:强>
Name
Alice [(happy, 2)]
John [(annoyed, 1)]
Lisa [(disappointed, 1)]
dtype: object
对于这个小例子,我使用以下函数来提取情感词。肯定可能有更好的方法(也许你已经在使用nltk,如果没有,我会建议你研究它)。
import re
emotionWords = set(['sad', 'happy', 'relieved', 'annoyed', 'angry', 'ecstatic', 'proud', 'disappointed'])
def extract_emotion_words(message):
tokenized = re.split(r'\W+', message.lower())
return list(set(tokenized) & emotionWords)