2016-12-06 72 views
0

我尝试做一个基于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] 
+0

如果你的字典有* *的话,为什么重新使用呢?为什么不'如果行==令牌? –

+0

谢谢你的亲友Robin Koch。问题在于字典来自一个单独的文件。我们不能在文件中包含分离的术语,我们正在测量情绪。我们没有做一个字数。预先感谢您 – Guido

+0

我仍然不确定您与什么相匹配。你能提供一些例子吗?如果你真的做了're.compile('enter')。match('entprise')',你不需要正则表达式。如果你的字典实际上包含正则表达式,那么你应该把它添加到问题中。 –

回答

0

.match()匹配从行的开头。所以,你可以使用锚线的一端在REG例如:

re.compile(line + '$') 

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

re.compile('\b' + line + '\b') 
0
  1. 你的缩进是语无伦次。有些级别使用3个空格,有些使用4个空格。

  2. 您尝试将字词上的每个单词与字典中的所有7000个单词进行匹配。相反,只需查看字典中的单词即可。如果不在那里,请忽略错误(EAFP原则)。

  3. 此外,我不确定在对象方法("".split())上是否有使用类方法(string.split())的优势。

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

编辑:

  • 代替.readlines()我使用.read().split('\n')。这消除了换行符。

  • 拆分文本不是在默认的空格字符,但在正则表达式'\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])) 
    
    +0

    谢谢你的代码罗宾,但不幸的是它只计算所有的单词。也许我用错误的方式解释了它,所以我试图说清楚: - 我在.txt字典上 - 在这本字典中有8种不同的情绪,这些情绪与这些情绪有关。 - 我有一个文本,我想检查字典中的单词。 - 在文本中代表单词情感,此时代码在词典感觉出现在词典中(部分感觉)时发出匹配。目的是当词典中的确切单词出现时,它才会进行匹配。我希望我现在说清楚了吗? – Guido

    +0

    代码完成与您完全相同的操作。计算单词并为每个类别添加它们。但是我不使用'.match()',而是直接比较单词。 - 请提供示例文件,从中可以看出您认为看到的不同之处。 –

    +0

    这是文件。在idtext文件中显示'wantrouwen'。当你运行这个脚本时,你使用的字典仅附有'trouwen'这个词,它不应该匹配。 – Guido