【问题标题】:Distinct words sentiment analysis不同的词情感分析
【发布时间】:2016-12-06 23:48:32
【问题描述】:

我尝试根据 7000 个单词的词典进行情绪分析。该代码在 Python 中工作,但它选择所有组合而不是不同的单词。

例如,字典显示enter,文本显示enterprise。如何更改它认为不匹配的代码?

dictfile = sys.argv[1]
textfile = sys.argv[2]

a = open(textfile)
text = string.split( a.read() )
a.close()

a = open(dictfile)
lines = a.readlines()
a.close()

dic = {}
scores = {}

current_category = "Default"
scores[current_category] = 0

for line in lines:
   if line[0:2] == '>>':
       current_category = string.strip( line[2:] )
       scores[current_category] = 0
   else:
       line = line.strip()
       if len(line) > 0:
           pattern = re.compile(line, re.IGNORECASE)
           dic[pattern] = current_category

for token in text:
   for pattern in dic.keys():
       if pattern.match( token ):
           categ = dic[pattern]
           scores[categ] = scores[categ] + 1

for key in scores.keys():
   print key, ":", scores[key]

【问题讨论】:

  • 如果您的字典包含单词,那为什么还要使用re呢?为什么不if line == token
  • 感谢您的回答 Robin Koch。问题是字典来自一个单独的文件。我们不能在文件中包含单独的术语,因为我们正在测量情绪。我们不计算字数。提前谢谢你
  • 我仍然不确定你匹配什么。你能提供一些例子吗?如果你真的做re.compile('enter').match('entprise') 你不需要正则表达式。如果您的字典实际上包含正则表达式,那么您应该将其添加到问题中。
  • 我正在做的是,我创建了一个包含情绪的单独文本文件。每种情绪都包含大量与该情绪相关的单词。例如:情绪快乐包含词语;微笑、大笑、小狗、漂亮、阳光等。但也有其他不同的情感包含文字。因此,当 python 脚本被编译时,它会通过文本运行。结果如下;开心:4 伤心:1 生气:2 以此类推。现在的问题是几个单词没有被检测为一个单词。例如:如果在文本中出现阳光这个词,也会计算太阳。
  • 所以你一个字数。只是单词属于类别。你不需要 (7000) 个正则表达式。

标签: python


【解决方案1】:

.match() 从行首开始匹配。所以你可以在你的正则表达式中使用行尾锚:

re.compile(line + '$')

或者你可以使用单词边界:

re.compile('\b' + line + '\b')

【讨论】:

    【解决方案2】:
    1. 您的缩进不连贯。有些关卡使用 3 个空格,有些使用 4 个空格。

    2. 您尝试将文本中的每个单词与字典中的所有 7000 个单词进行匹配。相反,只需在字典中查找这个词。如果不存在,请忽略错误(EAFP 原则)。

    3. 另外,我不确定使用类方法 (string.split()) 是否比对象方法 ("".split()) 有任何优势。

    4. Python 也有一个 defaultdict,它自己用 0 初始化一个字典。

    编辑:

    1. 我使用.read().split('\n'),而不是.readlines()。这消除了换行符。

    2. 不是在默认空格字符而是在正则表达式'\W+'(所有不是“单词字符”的)分割文本是我摆脱标点符号的尝试。

    在我建议的代码下方:

    import sys
    from collections import defaultdict
    
    dictfile = sys.argv[1]
    textfile = sys.argv[2]
    
    with open(textfile) as f:
        text = f.read()
    
    with open(dictfile) as f:
        lines = f.read()
    
    categories = {}
    scores = defaultdict(int)
    
    current_category = "Default"
    scores[current_category] = 0
    
    for line in lines.split('\n'):
        if line.startswith('>>'):
            current_category = line.strip('>')
        else:
            keyword = line.strip()
            if keyword:
                categories[keyword] = current_category
    
    for word in re.split('\W+', text):
        try:
            scores[categories[word]] += 1
        except KeyError:
            # no in dictionary
            pass
    
    for keyword in scores.keys():
        print("{}: {}".format(keyword, scores[keyword]))
    

    【讨论】:

    • 感谢您的代码 Robin,但不幸的是它只计算所有单词。也许我以错误的方式解释了它,所以我试着说清楚:-我有 .txt 字典-在这本字典中有 8 种不同的情绪,以及与这种情绪相关的单词。 -我有一个文本,我想检查字典中的单词。 - 文本中表示感觉一词,此时代码在字典中出现感觉一词时给出匹配(感觉的一部分)。目的是它仅在字典中有确切单词时才给出匹配。我希望我现在说清楚了吗?
    • 代码和你的代码完全一样。计算单词并将它们添加到每个类别中。但我不使用.match(),而是直接将单词相互比较。 - 请提供样本文件,从中可以看出您认为可以看到的差异。
    • 这是文件。在 idtext 文件中显示“wantrouwen”。当您运行脚本并使用我附上的字典时,它只包含“trouwen”这个词,它不应该匹配。
    • 我的代码中有错字。 scores[dic[key]] += 1 应该是 `scores[dic[token]] += 1。我更正了这一点并使用了更有意义的变量名。我还修复了换行符和标点符号的一些问题。我希望它为您提供进一步开发的起点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多