利用百度的词法分析区分数据

1.目标

我以区分名人数据与非名人数据为例。何为名人数据、非名人数据 ?

名人数据:介绍某位名人的一段(一句)话,例如:Raj Babbar,演员,主要作品有《迷宫下的罪恶2》、《天命玩家》、《Bodyguard》等。
非名人数据:不是介绍某位名人的一段(一句)话,例如:德国ABASAG一向致力於促进“企业资源规划系统”(ERP)在中国的发展。


2.词法分析运用

2.1新建AipNlp

AipNlp是自然语言处理的Python SDK客户端,为使用自然语言处理的开发人员提供了一系列的交互方法。

参考如下代码新建一个AipNlp:

from aip import AipNlp

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipNlp(APP_ID, API_KEY, SECRET_KEY)

在上面代码中,常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

注意:如您以前是百度云的老用户,其中API_KEY对应百度云的“Access Key ID”,SECRET_KEY对应百度云的“Access Key Secret”。

2.2配置AipNlp

如果用户需要配置AipNlp的网络请求参数(一般不需要配置),可以在构造AipNlp之后调用接口设置参数,目前只支持以下参数:

接口说明
setConnectionTimeoutInMillis建立连接的超时时间(单位:毫秒)
setSocketTimeoutInMillis通过打开的连接传输数据的超时时间(单位:毫秒)

2.3接口说明

词法分析接口向用户提供分词、词性标注、专名识别三大功能;能够识别出文本串中的基本词汇(分词),对这些词汇进行重组、标注组合后词汇的词性,并进一步识别出命名实体。

text = "百度是一家高科技公司"

""" 调用词法分析 """
client.lexer(text);

词法分析 请求参数详情

参数名称是否必选类型说明
textstring待分析文本(目前仅支持GBK编码),长度不超过65536字节

词法分析 返回数据参数详情

参数名称类型必需详细说明
textstring原始单条请求文本
itemsarray(object)词汇数组,每个元素对应结果中的一个词
+itemstring词汇的字符串
+nestring命名实体类型,命名实体识别算法使用。词性标注算法中,此项为空串
+posstring词性,词性标注算法使用。命名实体识别算法中,此项为空串
+byte_offsetint在text中的字节级offset(使用GBK编码)
+byte_lengthint字节级length(使用GBK编码)
+uristring链指到知识库的URI,只对命名实体有效。对于非命名实体和链接不到知识库的命名实体,此项为空串
+formalstring词汇的标准化表达,主要针对时间、数字单位,没有归一化表达的,此项为空串
+basic_wordsarray(string)基本词成分
+loc_detailsarray(object)地址成分,非必需,仅对地址型命名实体有效,没有地址成分的,此项为空数组。
++typestring成分类型,如省、市、区、县
++byte_offsetint在item中的字节级offset(使用GBK编码)
++byte_lengthint字节级length(使用GBK编码)

词法分析 返回示例

{
  "status":0,
  "version":"ver_1_0_1",
  "results":[
    {
      "retcode":0,
      "text":"百度是一家高科技公司",
      "items":[
         {
           "byte_length":4,
           "byte_offset":0,
           "formal":"",
           "item":"百度",
           "ne":"ORG",
           "pos":"",
           "uri":"",
           "loc_details":[ ],
           "basic_words":["百度"]
         },
         {
           "byte_length":2,
           "byte_offset":4,
           "formal":"",
           "item":"是",
           "ne":"",
           "pos":"v",
           "uri":"",
           "loc_details":[ ],
           "basic_words":["是"]
         },
         {
           "byte_length":4,
           "byte_offset":6,
           "formal":"",
           "item":"一家",
           "ne":"",
           "pos":"m",
           "uri":"",
           "loc_details":[ ],
           "basic_words":["一","家"]
         },
         {
           "byte_length":6,
           "byte_offset":10,
           "formal":"",
           "item":"高科技",
           "ne":"",
           "pos":"n",
           "uri":"",
           "loc_details":[ ],
           "basic_words":["高","科技"]
         },
         {
           "byte_length":4,
           "byte_offset":16,
           "formal":"",
           "item":"公司",
           "ne":"",
           "pos":"n",
           "uri":"",
           "loc_details":[ ],
           "basic_words":["公司"]
         }
      ]
    }
  ]
}

词性缩略说明

词性含义词性含义词性含义词性含义
n普通名词f方位名词s处所名词t时间名词
nr人名ns地名nt机构团体名nw作品名
nz其他专名v普通动词vd动副词vn名动词
a形容词ad副形词an名形词d副词
m数量词q量词r代词p介词
c连词u助词xc其他虚词w标点符号

专名识别缩略词含义

缩略词含义缩略词含义缩略词含义缩略词含义
PER人名LOC地名ORG机构名TIME时间

3.具体代码实现

百度提供的词法分析会将句子进行分词,并进行标识。例如《迷宫下的罪恶2》、《天命玩家》会被标识为作品名,Raj Babbar会标识为人名。通过分析名人数据可知,名人数据中一般包含有人名、地名、作品名、出人日期,我把这些词汇作为称为名人数据的特征数据,当然名人数据中不光有特征数据还有像演员、主要、作品、有这样的非特征数据。我依据名人数据特征数据在总数据(即整句)的占比来判定是否为名人数据。

首先创建一个AipNlp

from aip import AipNlp

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipNlp(APP_ID, API_KEY, SECRET_KEY)

然后创建俩个计数器,分别用来计量特征数据与非特征数据的个数

# 定义一个计数器,统计所有的单元数
counter_all=0
# 定义一个计数器,统计所有的单元数
counter_need=0

加载我们需要区分的数据

text = 'Raj Babbar,演员,主要作品有《迷宫下的罪恶2》、《天命玩家》、《Bodyguard》' 

jsonData = client.lexer(text)

统计特征数据与非特征数据的个数,这部分代码参照百度的词法分析规则进行编写的,[‘items’][‘ne’][‘PER’,’LOC’,’ORG’,’TIME’][‘pos’][‘nw’,’nr’,’t’,’m’]等都是代名词需要参照上面词法分析规则。

for each in jsonData['items']:
    if each['ne'] in ['PER','LOC','ORG','TIME']:
        counter_need+=1
    elif each['pos'] in ['nw','nr','t','m']:
        counter_need+=1

    if each['pos'] in ['w']:
        pass
    else:
        counter_all+=1

最后打印名人特征数据占比,结果为

print('名人特征数据占比为:'+str(counter_need/counter_all))
>>>名人特征数据占比为:0.375

名人数据的特征数据占比在0.15以上基本就可以确认为名人数据了,名人数据与非名人数据的实际分界线还要参照具体的语料库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K同学啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值