hanlp2.1命名实体识别结果未知的疑问

很抱歉打扰您,我是小白,最近才开始学习hanlp,对命名实体识别结果中实体的start 和end有些疑问。
我的代码是这样的:

-- coding:utf-8 --

import hanlp
import requests
def hanlp_test(texts):
HanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 世界最大中文语料库
r=HanLP(texts)
#’(‘阎锡山’, ‘PERSON’, 22, 23)
#print(r[“ner/msra”])
for sen_split in r[“ner/msra”]:
for word_ner in sen_split:
if word_ner[1]==“PERSON”:
print(word_ner)

text=r"第二战区东路第十八集团军(八路军)和第二十七、四十军于12月10日开始攻击,一度收复山西黎城、潞城、涉县;南路第四、五、十四集团军与日军第三十七师团在中条山地区激战月余,克闻喜、绛县、翼城附近日军据点多处;西、北两路由于第二战区司令长官阎锡山指挥主力投入反共作战,冬季攻势计划落空。第八战区于12月18日以第三十五、八十一军、骑兵第六军等部发动进攻,遭日军反扑,次年4月初击退日军,收复临河、五原等地。冀察、鲁苏战区部队分别破坏平汉铁路北段及津浦、胶济铁路,袭击日军据点。
hanlp_test(text.split(","))

我的结果是这样的:
(‘阎锡山’, ‘PERSON’, 22, 23)

我的疑问如下:
在nlp说明文档中解释ner的结果是(实体,实体名称,start,end)
start是否表示实体在句子中的起始位置,end是否表示在句子中的结尾位置?如果是的话,为什么end-start不等于实体的长度呢?而且start的数字也与实体所在的位置有差别?是由于中文的编码导致的吗?

2.1是token level offset

请再允许我追问一下,请问如果想要得到实体在文本中的位置而不是偏移量要怎么操作呢?或者说偏移量可以转换成文本中的位置吗?要怎么转换呢?(我目前想到的好像就只有匹配的笨办法了)

下一步token在text中的位置可以通过HanLP['tok/fine'].config.output_spans = True激活,详见:

非常感谢您在百忙之中能够回复我这个问题!!!真的帮助了我很多,值此中秋佳节,祝您工作顺利,阖家团圆

1 Like