sentiwordnet的简单使用

# Example line:

# POS     ID     PosS  NegS SynsetTerm#sentimentscore    Desc

# a   00009618  0.5    0.25  spartan#4 austere#3 ascetical#2  describe

 

sentiwordnet中,一行数据如上所示,第一项是单词的词性;第二项是单词的ID;第三第四项分别是积极得分和消极得分;第五项字符串分别是:单词#语义标号 单词#语义标号,这里列出的单词都是同义词,意思在第六项所描述;第六项描述前面一组同义词的意思。

因为一个单词有很多种意思,比如‘good’,作为名词有4种含义(即会出现在4行里面,下同),作为形容词有21种含义,作为副词有2种含义。当我们要判断‘good’这个词的情感的时候,我们不会去直接判断这个‘good’到底是什么意思,再代入某一行计算,而是先把所有‘good’统计一下,得到一个平均值,用这个平均值代表所有‘good’的情感得分,这个得分的值在-11之间。如果得分是正的,就是积极的;如果是负的,就是消极的;如果是0.0,就是中性的。

具体计算公式是:score = n是单词的所有含义数

                Sum = 

最后的得分 = score/sum

使用的时候,只需传入单词和词性,即可得到大部分情感词的情感得分,从而判断极性。

 

# author:kou
# date:2014年3月14日 

from __future__ import division

class SentiWordNet():
    def __init__(self,netpath):
        self.netpath = netpath
    self.dictionary = {}
    
    def infoextract(self):
    tempdict = {}
    templist = []
        try:
            f = open(self.netpath,"r")
        except IOError:
            print "failed to open file!"
            exit()
        print 'start extracting.......'
        
    # Example line:
    # POS     ID     PosS  NegS SynsetTerm#sensenumber Desc
    # a   00009618  0.5    0.25  spartan#4 austere#3 ascetical#2  ……

        for sor in f.readlines():
            if sor.strip().startswith("#"):
                pass
            else:
                data = sor.split("\t")
                if len(data) != 6:
                    print 'invalid data'
                    break
                wordTypeMarker = data[0]      
                synsetScore = float(data[2]) - float(data[3])   #// Calculate synset score as score = PosS - NegS
                synTermsSplit = data[4].split(" ")    # word#sentimentscore
        for w in synTermsSplit:
            synTermAndRank = w.split("#")           #
            synTerm = synTermAndRank[0] + "#" + wordTypeMarker    #单词#词性
            synTermRank = int(synTermAndRank[1])    
            if  tempdict.has_key(synTerm):
            t = [synTermRank,synsetScore]
            tempdict.get(synTerm).append(t)            
            else:
            temp = {synTerm:[]}
            t = [synTermRank,synsetScore]
            temp.get(synTerm).append(t)
            tempdict.update(temp)            
            
    for key in tempdict.keys():
        score = 0.0
        ssum = 0.0            
        for wordlist in tempdict.get(key):
        score += wordlist[1]/wordlist[0]
        ssum += 1.0/wordlist[0]
        score /= ssum
        self.dictionary.update({key:score})
    
    def getscore(self,word,pos):
    return self.dictionary.get(word + "#" + pos)
        
            
            
                
if __name__ == '__main__':
    netpath = "C:\\Users\\Administrator\\Desktop\\SentiWordNet.txt"
    swn= SentiWordNet(netpath)
    swn.infoextract()
    print "good#a "+str(swn.getscore('good','a'))
    print "bad#a "+str(swn.getscore('bad','a'))
    print "blue#a "+str(swn.getscore('blue','a'))
    print "blue#a "+str(swn.getscore('blue','n'))
    
        

 

 

 

转载于:https://www.cnblogs.com/KingKou/p/3611686.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值