利用百度的词法分析区分数据
发布日期:2021-07-01 04:21:29 浏览次数:18 分类:技术文章

本文共 4315 字,大约阅读时间需要 14 分钟。

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);

词法分析 请求参数详情

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

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

参数名称 类型 必需 详细说明
text string 原始单条请求文本
items array(object) 词汇数组,每个元素对应结果中的一个词
+item string 词汇的字符串
+ne string 命名实体类型,命名实体识别算法使用。词性标注算法中,此项为空串
+pos string 词性,词性标注算法使用。命名实体识别算法中,此项为空串
+byte_offset int 在text中的字节级offset(使用GBK编码)
+byte_length int 字节级length(使用GBK编码)
+uri string 链指到知识库的URI,只对命名实体有效。对于非命名实体和链接不到知识库的命名实体,此项为空串
+formal string 词汇的标准化表达,主要针对时间、数字单位,没有归一化表达的,此项为空串
+basic_words array(string) 基本词成分
+loc_details array(object) 地址成分,非必需,仅对地址型命名实体有效,没有地址成分的,此项为空数组。
++type string 成分类型,如省、市、区、县
++byte_offset int 在item中的字节级offset(使用GBK编码)
++byte_length int 字节级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以上基本就可以确认为名人数据了,名人数据与非名人数据的实际分界线还要参照具体的语料库。

转载地址:https://mtyjkh.blog.csdn.net/article/details/82055127 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:数据划分
下一篇:知识点讲解八:Python中的尾递归

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月10日 21时20分27秒