我正在学习Python,并且正在尝试使用它来执行情绪分析。我正在关注此链接的在线教程:http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/。我把一段代码作为一个mapper类,其摘录如下:
sentimentDict = {
'positive': {},
'negative': {}
}
def loadSentiment():
with open('Sentiment/positive_words.txt', 'r') as f:
for line in f:
sentimentDict['positive'][line.strip()] = 1
with open('Sentiment/negative_words.txt', 'r') as f:
for line in f:
sentimentDict['negative'][line.strip()] = 1
在这里,我可以看到创建了一个新词典,其中包含两个键,正面和负面,但没有值。
在此之后,打开两个文本文件,每行都被剥离并映射到字典。
然而,= 1部分是什么?为什么需要这样做(如果不是这样的话,可以删除?)
答案 0 :(得分:7)
循环创建一个嵌套字典,并将所有值设置为1,可能只是使用键作为清除重复值的方法。
您可以使用集合来避免= 1
值:
sentimentDict = {}
def loadSentiment():
with open('Sentiment/positive_words.txt', 'r') as f:
sentimentDict['positive'] = {line.strip() for line in f}
with open('Sentiment/negative_words.txt', 'r') as f:
sentimentDict['negative'] = {line.strip() for line in f}
请注意,您甚至不需要创建初始词典;你可以用一个语句,一个集合理解来创建整个集合。
如果其他代码 依赖于字典设置为1
的字典(可能在稍后阶段更新计数),那么使用{{更高效率'会更高效而不是类方法:
dict.fromkeys()
然而,查看您的source blog article表明字典仅用于对密钥进行成员资格测试,因此使用这里的集合对于要引导的其余代码来说要好得多且透明。
答案 1 :(得分:2)
重点是这是一个嵌套字典。 sentimentDict
是字典,sentimentDict['positive']
和sentimentDict['negative']
也是字典。
在loadSentiment()
函数中,这些内部dicts会填充项目。单词是键,值始终为1
。
所以你得到这样的东西:
{'negative': {'bad': 1,
'disgusting': 1,
'horrible': 1},
'positive': {'amazing': 1,
'awesome': 1,
'cool': 1}}
我对值1
的含义的猜测是这些词典刚刚在这里初始化,后来这些词数可能会增加,以表示更强或更弱的情绪。
答案 2 :(得分:1)
这是创建字典词典,因此sentimentDict['negative'][/something/] = 1
可能会创建一个类似于此的字典*:
sentimentDict : {'negative' : { 'some_word' : 1, 'some_other_word' : 1, etc. }}
这些值来自line.strip()
,这可能会产生一个正面和负面的单词列表。每个单词分别成为“否定”和“正面”词组中的一个键(它们应该是不同的文件,生成不同的列表),每个单词的值为1.这样,您可以轻松地运行文件,取出文件中的每个单词,然后将其插入字典并添加结果:
sentiment_count = 0
for word in some_file:
if word in sentimentDict['negative'].keys():
sentiment_count += sentimentDict['negative'][word]
etc.
ONE MORE EDIT
Martijn有答案。我误以为strip()
为split()
(我常犯的错误)。
答案 3 :(得分:0)
根据您提供的链接http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/中的代码,它将1存储为字典键值的占位符
单词本身是关键,其值(= 1)不重要。
更好的方法是在链接显示时设置字典或简单列表而不是字典字典。