这个字典作业在做什么?

时间:2013-08-07 15:10:37

标签: python mapreduce nltk sentiment-analysis

我正在学习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部分是什么?为什么需要这样做(如果不是这样的话,可以删除?)

4 个答案:

答案 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)不重要。

更好的方法是在链接显示时设置字典或简单列表而不是字典字典。