Last active
August 29, 2015 14:03
-
-
Save chengjun/44cf28565671cb65dcf0 to your computer and use it in GitHub Desktop.
calculate_sentiment
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| def caculate_single_sentence_sentiment(group): | |
| gsen = 0 | |
| no_words = group[0][0][0][0][0] # 否定词 | |
| level_words = group[0][0][0][0][1] # 程度词 | |
| sen_words = group[0][0][0][0][2] # 情感词 | |
| no_words_positions = [no_word[2] for no_word in no_words] | |
| level_words_positions = [level_word[2] for level_word in level_words] | |
| num_no_words = len(no_words) | |
| weight = 1 | |
| # 第一层:根据否定词的个数进行句法分析 | |
| if len(no_words) == 1: ## 存在一个否定词 | |
| level_words_after_score = 0 | |
| level_words_before_score = 0 | |
| for no_word in no_words: # 从否定词开始 | |
| for i in range(len(level_words_positions)): | |
| if level_words_positions[i] > no_word[2]: ### 否定词在前 | |
| level_words_after_score += level_words[i][1] | |
| elif level_words_positions[i] < no_word[2]: | |
| level_words_before_score += level_words[i][1] | |
| if no_word[2] > max(level_words_positions): | |
| weight = 1 # 很不开心,是表示非常不开心。 | |
| else: | |
| weight= 0.5 # 我不太开心 是表示有点不开心。 | |
| if level_words_after_score ==0: | |
| level_words_after_score =1 | |
| if level_words_before_score ==0: | |
| level_words_before_score =1 | |
| gsen = weight*level_words_before_score*-1*level_words_after_score*sen_words[1] # 没有考虑唯一性 | |
| elif len(no_words) == 2: ## 存在2个否定词 | |
| #“没有不开心”表示开心,假设情感值为+5分,那么“没有非常不开心”是多少分? - 黠之大者 >删除 | |
| #没有非常不开心,应该得分在-3分左右,有一点不开心 | |
| level_words_after_score = 0 | |
| level_words_before_score = 0 | |
| for no_word in no_words: # 从否定词开始 | |
| if no_word[2] == min(no_words_positions): ### 前面的程度词 | |
| for i in range(len(level_words_positions)): | |
| if level_words_positions[i] < no_word[2]: | |
| level_words_before_score += level_words[i][1] | |
| elif no_word[2] == max(no_words_positions): ### 后面的程度词 | |
| for i in range(len(level_words_positions)): | |
| if level_words_positions[i] < no_word[2] and level_words_positions[i]> min(no_words_positions) : ### 否定词在前 | |
| level_words_after_score += level_words[i][1] | |
| weight = -0.5 | |
| if level_words_after_score ==0: | |
| level_words_after_score =1 | |
| if level_words_before_score ==0: | |
| level_words_before_score =1 | |
| gsen = (level_words_after_score*weight)*sen_words[1]/(level_words_before_score) | |
| elif len(no_words) > 2: ##三个以上否定词 | |
| if num_no_words%2 ==0: | |
| weight = 1 | |
| else: | |
| weight = -1 | |
| gsen = weight*sen_words[1] | |
| elif len(no_words) == 0: ##没有否定词 | |
| level_words_before_score = 0 | |
| for i in level_words: | |
| level_words_before_score +=i[1] | |
| if level_words_before_score ==0: | |
| level_words_before_score =1 | |
| gsen = sen_words[1]*level_words_before_score | |
| return gsen |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment