【问题标题】:What is this dictionary assignment doing?这个字典作业在做什么?
【发布时间】:2013-08-07 15:10:37
【问题描述】:

我正在学习 Python,并试图用它来进行情绪分析。我正在关注此链接中的在线教程:http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/。我取了一段代码作为映射器类,摘录如下:

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 部分是做什么用的?为什么需要这样做(如果不是,如何删除?)

【问题讨论】:

    标签: python mapreduce nltk sentiment-analysis


    【解决方案1】:

    循环创建一个嵌套字典,并将所有值设置为 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() 类会更高效替代方法:

    sentimentDict = {}
    
    def loadSentiment():
        with open('Sentiment/positive_words.txt', 'r') as f:
            sentimentDict['positive'] = dict.fromkeys((line.strip() for line in f), 1)
    
        with open('Sentiment/negative_words.txt', 'r') as f:
            sentimentDict['negative'] = dict.fromkeys((line.strip() for line in f), 1)
    

    但是,查看您的 source blog article 会发现字典仅用于对键进行成员资格测试,因此在此处使用集合要好得多,并且对要引导的其余代码透明。

    【讨论】:

    • 谢谢。我最喜欢这个答案。如果它只是想避免重复值,那么 set 显然是合乎逻辑的方式。
    【解决方案2】:

    关键是这是一个 嵌套 dict。 sentimentDict 是字典,sentimentDict['positive']sentimentDict['negative'] 也是字典。

    loadSentiment() 函数中,这些内部字典会填充项目。单词是键,值总是1

    所以你会得到这样的结果:

    {'negative': {'bad': 1,
                  'disgusting': 1,
                  'horrible': 1},
     'positive': {'amazing': 1, 
                  'awesome': 1, 
                  'cool': 1}}
    

    我对值1 的含义的猜测是,这些字典只是在这里初始化,稍后这些计数可能会增加以表示更强或更弱的情绪。

    【讨论】:

    • 呸,比我快 20 秒。+1
    • 查看链接代码 - 值既未读取也未更改。只是作为一套使用。
    • @w.m 那段代码似乎是教程的一部分。所以我不知道“老师”是否只是想从简单开始并设置一个稍后会修改的结构,或者他/她只是选择了不合适的数据结构。
    • @Bill 好吧,既然@Martijn Pieters 在线,您无论如何都可以放弃在python 标签中回答任何问题的任何希望:P
    • @LukasGraf 我认为选择一个令人困惑的(也许是可扩展的)数据结构将不再属于“从简单开始”,所以无论哪种方式都是不合适的
    【解决方案3】:

    这是在创建一个字典字典,所以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.
    

    更多编辑 马丁有答案。我将strip() 误读为split()(我的一个常见错误)。

    【讨论】:

    • 我假设这是一个基本的正面/负面情绪分析,如果每个单词都有一个值,则可以根据需要添加或减去它们以获得情绪分数。谢谢!
    • 啊。那让我失望了。我认为 split() 在那里可以获取每一行的所有单词。
    • 请注意,if word in sentimentDict['negative'] 在 Python 2 中的工作效果好多了,因为 .keys() 返回一个列表,迫使您搜索该列表(O(n) 性能)而不是仅仅根据字典测试成员资格(O(1) 常数性能)。
    • 我不知道。感谢您的推荐。我主要使用 Python3,如果我应该测试 for x in some_dictfor x in some_dict.keys(),老实说会感到困惑。
    【解决方案4】:

    从您给出的链接http://www.alex-hanna.com/tworkshops/lesson-6-basic-sentiment-analysis/ 中的代码来看,它存储 1 作为字典键值的占位符

    单词本身就是键,它的值 (=1) 不重要。

    更好的方法是使用集合字典或简单列表字典,而不是链接显示的字典字典。

    【讨论】:

    • 在列表中查找将是 O(n) 而不是 O(1) 在集合或字典中搜索。
    • @Sukrit Kalra Right - 对于列表它占用 O(n)。但是在这种情况下,一个集合就足够了(集合具有 O(1) 时间的摊销查找顺序)
    猜你喜欢
    • 2019-10-20
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多