2

我正在学习 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 部分是做什么用的?为什么这是必需的(如果不是,它怎么能被删除?)

4

4 回答 4

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()类方法会更高效:

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)

然而,查看您的源博客文章表明,字典仅用于对键进行成员资格测试,因此在此处使用集合要好得多,并且对于引导的其余代码是透明的。

于 2013-08-07T15:15:58.653 回答
2

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

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

所以你会得到这样的东西:

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

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

于 2013-08-07T15:14:53.767 回答
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.

再一次编辑 Martijn 给出了答案。我误读strip()split()(我的一个常见错误)。

于 2013-08-07T15:14:05.433 回答
0

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

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

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

于 2013-08-07T15:18:23.070 回答