我以区分名人数据与非名人数据为例。何为名人数据、非名人数据 ?
名人数据:介绍某位名人的一段(一句)话,例如:Raj Babbar,演员,主要作品有《迷宫下的罪恶2》、《天命玩家》、《Bodyguard》等。 非名人数据:不是介绍某位名人的一段(一句)话,例如:德国ABASAG一向致力於促进“企业资源规划系统”(ERP)在中国的发展。
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”。
如果用户需要配置AipNlp的网络请求参数(一般不需要配置),可以在构造AipNlp之后调用接口设置参数,目前只支持以下参数:
接口 | 说明 |
---|---|
setConnectionTimeoutInMillis | 建立连接的超时时间(单位:毫秒) |
setSocketTimeoutInMillis | 通过打开的连接传输数据的超时时间(单位:毫秒) |
词法分析接口向用户提供分词、词性标注、专名识别三大功能;能够识别出文本串中的基本词汇(分词),对这些词汇进行重组、标注组合后词汇的词性,并进一步识别出命名实体。
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 | 时间 |
百度提供的词法分析会将句子进行分词,并进行标识。例如《迷宫下的罪恶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以上基本就可以确认为名人数据了,名人数据与非名人数据的实际分界线还要参照具体的语料库。