BosonNLP

情感分析 — BosonNLP HTTP API 1.0 documentation
http://docs.bosondata.net/sentiment.html


https://segmentfault.com/a/1190000003891573


http://blog.csdn.net/yu422560654/article/details/51923213


  • 安装pip
wget https://bootstrap.pypa.io/get-pip.py  --no-check-certificate
sudo python get-pip.py

 
 
  • 1
  • 2
  • 3
  • 安装BosonNLP
pip install -U bosonnlp

 
 
  • 1
  • 2
# -*- coding:utf-8 -*-
from bosonnlp import BosonNLP
nlp = BosonNLP('你的Key')
print(nlp.sentiment('这家味道还不错'))
 
 
  • 1
  • 2
  • 3
  • 4

结果输出: 
2016-07-16 11:16:58,962 INFO Starting new HTTP connection (1): api.bosonnlp.com 
[[0.9934679658749207, 0.006532034125079303]]

  • 使用情感分析和文本摘要
# -*- encoding: utf-8 -*-
from __future__ import print_function, unicode_literals
import json
import requests

SENTIMENT_URL = 'http://api.bosonnlp.com/sentiment/analysis'
# 注意:在测试时请更换为您的API Token
headers = {'X-Token': '你的Key'}

# 读取文件
with open('1.txt', 'rb') as f:
    strs = [line.decode('utf-8') for line in f if line]
# 情感分析(支持批量最多一次100笔)
data = json.dumps(strs)
resp = requests.post(SENTIMENT_URL, headers=headers, data=data.encode('utf-8'))
print(resp.text)

# 摘要(支持单文本)
# 遍历文件内容
for s in strs:
    # print(s)
    source = {
        'not_exceed': 0,
        'percentage': 0.2,
        'title': '',
        'content': (s)
    }
    SENTIMENT_URL = 'http://api.bosonnlp.com/summary/analysis'

    resp = requests.post(
        SENTIMENT_URL,
        headers=headers,
        data=json.dumps(source).encode('utf-8'))
    resp.raise_for_status()
    print(resp.text)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

输入文本》 
互联网金融也带给我们改变:一是更便利。比如原来要跑到银行柜台去办理转账、购买理财产品,今天通过互联网就能实现。二是更普惠。比如淘宝上的店家,传统银行根本不愿意或者不能够提供贷款,但是网络小额贷款就能提供贷款。原来有1000元闲钱都不会买基金,今天有100元甚至1元,都会在网上买基金。三是更便宜。比如通过互联网买卖基金的手续费不到银行柜台的一半。又如,保险产品互联网销售渠道的费用只有银行渠道的十分之一。 
网贷之家的数据显示,2015年7月,正常运营的平台数量为2136家,而截至2016年6月底,该数值为2349家,在此期间,出现了1778家停业及问题平台。就目前形势而言,“出问题”已成为大概率事件,因此,如何处理问题,也值得关注。近日,一纸法院判决书,在P2P行业引起轩然大波:浙江省杭州市中级人民法院公布的刑事判决书《(2015)浙杭刑初字第200号》显示,P2P平台银坊金融平台负责人蔡锦聪犯集资诈骗罪,判处无期徒刑,剥夺政治权利终身,并处没收个人全部财产,这是目前P2P领域最重的判罚。目前来看,快鹿兑付危机的处理,则为行业带来一定的示范性:6月22日,快鹿集团召开兑付危机发生以来第三次正发布会,会议上宣布成立投资人占多数的快鹿投资事件管理处置委员会,管委会同时正式聘请了独立第三方上海市联合律师事务所为公司法律顾问,聘请了独立第三方会计师事务所为公司审计,负责委员会指派的有关上海快鹿投资事件管理处置相关的法务、审计工作。同时,快鹿投资集团代表韦炎平承诺10月1日前全面启动兑付的刚性目标不变。监管层面也加强了干预。“e租宝事件”后,公安部组织建设了“非法集资案件投资人信息登记平台”,目前已受理两起非法集资案件的信息登记工作:e租宝和昆明泛亚有色案件。截至3月2日,已有近14万名e租宝投资人在该平台登记信息。平台名称也有考量:因公安机关办理的是刑事案件,并非涉及债权债务纠纷的民事案件,因此,该平台不使用“债权人登记平台”。在海外,P2P鼻祖Lending Club,也依然在危机中奋战。6月29日凌晨消息, 由于贷款量持续下降,Lending Club宣布裁掉179名员工以恢复投资者信心,同时宣布代理首席执行官斯科特·桑伯恩将成为公司的永久的首席执行官和总裁。当然,这些标杆性的P2P平台处理危机的方式,并不能代表全行业,深8君(以为,无论对于投资者、监管层还是平台自身来说,加速行业洗牌都利大于弊。

输出》 
[[0.9810511962767625, 0.018948803723237533], [0.24979342780912828, 0.7502065721908717]] 
“比如原来要跑到银行柜台去办理转账、购买理财产品,今天通过互联网就能实现。\n又如,保险产品互联网销售渠道的费用只有银行渠道的十分之一。” 
“网贷之家的数据显示,2015年7月,正常运营的平台数量为2136家,而截至2016年6月底,该数值为2349家,在此期间,出现了1778家停业及问题平台。\n“e租宝事件”后,公安部组织建设了“非法集资案件投资人信息登记平台”,目前已受理两起非法集资案件的信息登记工作:e租宝和昆明泛亚有色案件。\n当然,这些标杆性的P2P平台处理危机的方式,并不能代表全行业,深8君(以为,无论对于投资者、监管层还是平台自身来说,加速行业洗牌都利大于弊。”

  • 批量文件导入以及批量生成结果文件
# -*- encoding: utf-8 -*-
from __future__ import print_function, unicode_literals
import json
import requests
import os

info = '/home/yuhz/PycharmProjects/untitled2/fileHome/'
file_add = 'nlp'
SENTIMENT_URL = 'http://api.bosonnlp.com/sentiment/analysis'
# 注意:在测试时请更换为您的API Token
headers = {'X-Token': '你的Key'}

listfile = os.listdir(info)
#read directory
for line in listfile:  # 把目录下的文件都赋值给line这个参数
    if line[-4:] == '.txt' and line.find(file_add) == -1:
        # 读取文件
        file_name = line.replace('.','_'+file_add+'.')
        with open(info+line, 'rb') as f:
            #read line
            strs = [line.decode('utf-8') for line in f if line]
            st_line=''
            # connact words
            for words in strs:
                st_line = st_line + words.strip()
            # 情感分析(支持批量最多一次100笔)
            SENTIMENT_URL = 'http://api.bosonnlp.com/sentiment/analysis'
            data = json.dumps(st_line.strip())
            resp = requests.post(SENTIMENT_URL, headers=headers, data=data.encode('utf-8'))
            a = resp.text
            #摘要
            source = {
                'not_exceed': 0,
                'percentage': 0.2,
                'title': '',
                'content': (st_line.strip())
            }
            SENTIMENT_URL = 'http://api.bosonnlp.com/summary/analysis'
            resp = requests.post(
                SENTIMENT_URL,
                headers=headers,
                data=json.dumps(source).encode('utf-8'))
            resp.raise_for_status()
            #reaplce /n
            b = resp.text.replace('\\n','')
            #write file
            f = open(info+file_name, 'w')
            f.write(a+b)
            f.close()
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 优化输出格式并生成总文件
# -*- encoding: utf-8 -*-
from __future__ import print_function, unicode_literals
from tempfile import TemporaryFile
from xlwt import Workbook
import json
import requests
import os
import xlwt
import traceback
#数据目录
info = '/home/yuhz/PycharmProjects/untitled2/fileHome/'
#结果目录
inforst = '/home/yuhz/PycharmProjects/untitled2/result/'
#生成的文件增加后缀NLP
file_add = 'nlp'
SENTIMENT_URL = 'http://api.bosonnlp.com/sentiment/analysis'
# 注意:在测试时请更换为您的API Token
headers = {'X-Token': 'key'}

listfile = os.listdir(info)
all_content = ''
#写入Excel(定义Excel表头)
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')
row1 = sheet1.row(0)
row1.write(0,'TITLE')
row1.write(1,'POSITIVE')
row1.write(2,'NEGATIVE')
row1.write(3,'SUMMARY')
sheet1.col(0).width = 3000
sheet1.col(1).width = 5000
sheet1.col(2).width = 5000
sheet1.col(3).width = 30000
index = 0
#自动换行
style = xlwt.easyxf('align: wrap on')
#read directory
for line in listfile:  # 把目录下的文件都赋值给line这个参数
    TITLE = ''
    POSITIVE = ''
    NEGATIVE = ''
    SUMMARY = ''
    index = index + 1
    if line[-4:] == '.txt' and line.find(file_add) == -1:
        # 读取文件
        TITLE = line.replace('.txt','')
        all_content = all_content+'TITLE:'+TITLE + '\n'
        file_name = line.replace('.','_'+file_add+'.')
        with open(info+line, 'rb') as f:
            #read line
            #windows style
            try:
                strs = [line.decode('GBK') for line in f if line]
            except UnicodeDecodeError:
                try:
                    #linux style
                    strs = [line.decode('utf-8') for line in f if line]
                except UnicodeDecodeError:
                    #else
                    print(file_name)
            st_line=''
            # connact words
            for words in strs:
                st_line = st_line + words.strip()
            #情感分析(支持批量最多一次100笔)
            SENTIMENT_URL = 'http://api.bosonnlp.com/sentiment/analysis'
            data = json.dumps(st_line.strip())
            resp = requests.post(SENTIMENT_URL, headers=headers, data=data.encode('utf-8'))
            a = resp.text
            #解析返回结果放入变量
            rowset = a.replace('[[','').replace(']]','').replace(' ','').split(',')
            #print(rowset)
            POSITIVE = rowset[0]
            NEGATIVE = rowset[1]
            #format
            a = a.strip().replace(',', ',NEGATIVE:')
            aa = ''
            #拼接生成的情感分析结果
            for words in a.split(','):
                aa = aa + words.replace('[[', 'POSITIVE:').replace(']]', '').replace(' ', '')+'\n'
            #摘要
            source = {
                'not_exceed': 0,
                'percentage': 0.2,
                'title': '',
                'content': (st_line.strip())
            }
            SENTIMENT_URL = 'http://api.bosonnlp.com/summary/analysis'
            resp = requests.post(
                SENTIMENT_URL,
                headers=headers,
                data=json.dumps(source).encode('utf-8'))
            resp.raise_for_status()
            #格式化摘要
            b = resp.text.replace('\\n','').strip('"')
            #变量赋值
            SUMMARY = b
            #写入文件
            f = open(inforst+file_name, 'w')
            all_content = all_content +aa+'SUMMARY:'+b+'\n'
            f.write(aa+'SUMMARY:'+b)
            f.close()
    #写入Excel
    row1 = sheet1.row(index)
    row1.write(0, TITLE,style)
    row1.write(1, POSITIVE*1,style)
    row1.write(2, NEGATIVE*1,style)
    row1.write(3, SUMMARY,style)
#最终结果写入一个文件
ff = open(inforst+'all_content.txt', 'w')
ff.write(all_content)
ff.close()
#保存Excel
book.save(inforst+'result.xls')
book.save(TemporaryFile())




在九月初BosonNLP全面开放了分词和词性标注引擎以后,很多尤其是从事数据处理和自然语言研究的朋友在试用后很好奇,玻森如何能够做到目前的高准确率?希望这篇文章能够帮助大家理解玻森分词背后的实现原理。

众所周知,中文并不像英文那样词与词之间用空格隔开,因此,在一般情况下,中文分词与词性标注往往是中文自然语言处理的第一步。一个好的分词系统是有效进行中文相关数据分析和产品开发的重要保证。

玻森采用的结构化预测模型是传统线性条件随机场(Linear-chain CRF)的一个变种。在过去及几年的分词研究中,虽然以字符为单位进行编码,从而预测分词与词性标注的文献占到了主流。这类模型虽然实现较容易,但比较难捕捉到高阶预测变量之间的关系。比如传统进行词性标注问题上使用Tri-gram特征能够得到较高准确率的结果,但一阶甚至高阶的字符CRF都难以建立这样的关联。所以玻森在字符编码以外加入了词语的信息使这种高阶作用同样能被捕捉

分词与词性标注中,新词识别组合切分歧义是两个核心挑战。玻森在这方面做了不少的优化,包括对特殊字符的处理,对比较有规律的构词方式的特征捕捉等。例如,近些年比较流行采用半监督的方式,通过使用在大规模无标注数据上的统计数据来改善有监督学习中的标注结果,也在我们的分词实现上有所应用。比如通过使用accressory variety作为特征,能够比较有效发现不同领域的新词,提升泛化能力。

我们都知道上下文信息是解决组合切分歧义的重要手段。而作为一个面向实际商用环境的算法,除了在准确率上的要求之外,还需要注意模型算法的时间复杂度需要足够高效。例如,相比于普通的Linear-chain CRF,Skip-chain CRF因为加入了更多的上下文信息,能够在准确率上达到更好的效果,但因为其它在训练和解码过程,不论是精确算法还是近似算法,都难以达到我们对速度的要求,所以并没有在我们最终实现中采用。一个比较有趣的分词改进是我们捕捉了中文中常见的固定搭配词对信息。譬如,如 “得出某个结论”、 “回答某个提问”等。如果前面出现 “得出” ,后面出现 “结论” ,那么“得出”和“结论”作为一个词语出现的可能性就会很大,与这种相冲突的分词方案的可能性就会很小。这类固定搭配也可以被建模,用于解决部分分词错误的问题。

怎样确定两个词是否是固定的搭配呢?我们通过计算两个词间的归一化逐点互信息(NPMI)来确定两个词的搭配关系。逐点互信息(PMI),经常用在自然语言处理中,用于衡量两个事件的紧密程度。归一化逐点互信息(NPMI)是逐点互信息的归一化形式,将逐点互信息的值归一化到-1到1之间。如果两个词在一定距离范围内共同出现,则认为这两个词共现。筛选出NPMI高的两个词作为固定搭配,然后将这组固定搭配作为一个组合特征添加到分词程序中。如“回答”和“问题”是一组固定的搭配,如果在标注“回答”的时候,就会找后面一段距离范围内是否有“问题”,如果存在那么该特征被激活。

归一化逐点互信息(npmi)的计算公式

逐点互信息(pmi)的计算公式

可以看出,如果我们提取固定搭配不限制距离,会使后面偶然出现某个词的概率增大,降低该统计的稳定性。在具体实现中,我们限定了成为固定搭配的词对在原文中的距离必须小于一个常数。具体来看,可以采用倒排索引,通过词找到其所在的位置,进而判断其位置是否在可接受的区间。这个简单的实现有个比较大的问题,即在特定构造的文本中,判断两个词是否为固定搭配有可能需要遍历位置数组,每次查询就有O(n)的时间复杂度了,并且可以使用二分查找进一步降低复杂度为O(logn)。

其实这个词对检索问题有一个更高效的算法实现。我们采用滑动窗口的方法进行统计:在枚举词的同时维护一张词表,保存在当前位置前后一段距离中出现的可能成词的字符序列;当枚举词的位置向后移动时,窗口也随之移动。这样在遍历到 “回答” 的时候,就可以通过查表确定后面是否有 “问题” 了,同样在遇到后面的 “问题” 也可以通过查表确定前面是否有 “回答”。当枚举下一个词的时候,词表也相应地进行调整。采用哈希表的方式查询词表,这样计算一个固定搭配型时间复杂度就可以是O(1)了。
通过引入上述的上下文的信息,分词与词性标注的准确率有近1%的提升,而对算法的时间复杂度没有改变。我们也在不断迭代升级以保证引擎能够越来越准确,改善其通用性和易用性。


https://segmentfault.com/a/1190000003891573
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值