Python 移除NER处的B和I标签
我有新闻文章,我想用deepavlov来做那篇文章。实体使用生物标记方案。此处“B”表示实体的开头,“I”表示“内部”,并用于除第一个之外的所有组成实体的单词,“O”表示没有实体。NER代码如下所示:Python 移除NER处的B和I标签,python,python-3.x,machine-learning,nlp,ner,Python,Python 3.x,Machine Learning,Nlp,Ner,我有新闻文章,我想用deepavlov来做那篇文章。实体使用生物标记方案。此处“B”表示实体的开头,“I”表示“内部”,并用于除第一个之外的所有组成实体的单词,“O”表示没有实体。NER代码如下所示: def listOfTuples(list1, list2): return list(map(lambda x, y:(x,y), list1, list2)) ner_result = [] for x in split: for y in split[0]:
def listOfTuples(list1, list2):
return list(map(lambda x, y:(x,y), list1, list2))
ner_result = []
for x in split:
for y in split[0]:
news_ner = ner_model([str(y)])
teks = news_ner[0][0]
tag = news_ner[1][0]
ner_result.extend(listOfTuples(teks, tag))
print([i for i in ner_result if i[1] != 'O'])
嗯,结果是这样的
[('KOMPAScom', 'B-ORG'), ('Kompascom', 'I-ORG'), ('IFCN', 'B-ORG'), ('-', 'I-ORG'), ('International', 'I-ORG'), ('Fact', 'I-ORG'), ('-', 'I-ORG'), ('Checking', 'I-ORG'), ('Network', 'I-ORG'), ('Kompascom', 'B-ORG'), ('49', 'B-CARDINAL'), ('IFCN', 'B-ORG'), ('Kompascom', 'B-ORG'), ('Redaksi', 'B-ORG'), ('Kompascom', 'I-ORG'), ('Wisnu', 'B-PERSON'), ('Nugroho', 'I-PERSON'), ('Jakarta', 'B-GPE'), ('Rabu', 'B-DATE'), ('17', 'I-DATE'), ('/', 'I-DATE'), ('10', 'I-DATE'), ('/', 'I-DATE'), ('2018', 'I-DATE'), ('KOMPAScom', 'B-ORG'), ('Redaksi', 'B-ORG'), ('Kompascom', 'I-ORG'), ('Wisnu', 'B-PERSON'), ('Nugroho', 'I-PERSON'), ('Kompascom', 'B-ORG'), ('Bentara', 'I-ORG'), ('Budaya', 'I-ORG'), ('Jakarta', 'I-ORG'), ('Palmerah', 'I-ORG')]
[('KOMPAScom Kompascom', 'ORG'), ('IFCN - International Fact - Checking Network', 'ORG'), ('Kompascom', 'ORG'), ('49', 'CARDINAL'), ('IFCN', 'ORG'), ('Kompascom', 'ORG'), ('Redaksi Kompascom', 'ORG'), ('Wisnu Nugroho', 'PERSON'), ('Jakarta', 'GPE'), ('Rabu 17/10/2018', 'DATE'), ('KOMPAScom', 'ORG'), ('Redaksi Kompascom', 'ORG'), ('Wisnu Nugroho', 'PERSON'), ('Kompascom Bentara Budaya Jakarta Palmerah', 'ORG')]
我想删除B和I的标记,然后合并标记B和I中的文本,因此输出如下
[('KOMPAScom', 'B-ORG'), ('Kompascom', 'I-ORG'), ('IFCN', 'B-ORG'), ('-', 'I-ORG'), ('International', 'I-ORG'), ('Fact', 'I-ORG'), ('-', 'I-ORG'), ('Checking', 'I-ORG'), ('Network', 'I-ORG'), ('Kompascom', 'B-ORG'), ('49', 'B-CARDINAL'), ('IFCN', 'B-ORG'), ('Kompascom', 'B-ORG'), ('Redaksi', 'B-ORG'), ('Kompascom', 'I-ORG'), ('Wisnu', 'B-PERSON'), ('Nugroho', 'I-PERSON'), ('Jakarta', 'B-GPE'), ('Rabu', 'B-DATE'), ('17', 'I-DATE'), ('/', 'I-DATE'), ('10', 'I-DATE'), ('/', 'I-DATE'), ('2018', 'I-DATE'), ('KOMPAScom', 'B-ORG'), ('Redaksi', 'B-ORG'), ('Kompascom', 'I-ORG'), ('Wisnu', 'B-PERSON'), ('Nugroho', 'I-PERSON'), ('Kompascom', 'B-ORG'), ('Bentara', 'I-ORG'), ('Budaya', 'I-ORG'), ('Jakarta', 'I-ORG'), ('Palmerah', 'I-ORG')]
[('KOMPAScom Kompascom', 'ORG'), ('IFCN - International Fact - Checking Network', 'ORG'), ('Kompascom', 'ORG'), ('49', 'CARDINAL'), ('IFCN', 'ORG'), ('Kompascom', 'ORG'), ('Redaksi Kompascom', 'ORG'), ('Wisnu Nugroho', 'PERSON'), ('Jakarta', 'GPE'), ('Rabu 17/10/2018', 'DATE'), ('KOMPAScom', 'ORG'), ('Redaksi Kompascom', 'ORG'), ('Wisnu Nugroho', 'PERSON'), ('Kompascom Bentara Budaya Jakarta Palmerah', 'ORG')]
您有什么想法吗?您可以简单地迭代标记的文本并加入属于同一实体的标记。它的优雅程度并不惊人,但却很管用。大概是这样的:
def listOfTuples(list1, list2):
return list(map(lambda x, y:(x,y), list1, list2))
ner_result = []
for x in split:
for y in split[0]:
news_ner = ner_model([str(y)])
teks = news_ner[0][0]
tag = news_ner[1][0]
ner_result.extend(listOfTuples(teks, tag))
print([i for i in ner_result if i[1] != 'O'])
def折叠(ner_结果):
#列出结果
折叠的_结果=[]
#属于最新实体的令牌缓冲区
当前_实体_令牌=[]
当前实体=无
#迭代标记的标记
对于令牌,在ner_结果中标记:
如果标记==“O”:
持续
#如果一个完整的跨度开始。。。
如果标记.startswith(“B-”):
# ... 如果缓冲区中有上一个实体,则将其存储在结果列表中
如果当前_实体不是无:
折叠的_result.append(
(“”.join(当前\u实体\u令牌),当前\u实体)
当前实体=标记[2:]
#到目前为止,新实体只有一个令牌
当前\u实体\u令牌=[令牌]
#如果实体继续。。。
elif标记==“I-”+当前实体:
#只需添加令牌缓冲区
当前\u实体\u令牌。追加(令牌)
其他:
raise VALUERROR(“标记顺序无效”)
#最后一个实体仍在缓冲区中,因此将其添加到结果中
# ... 但前提是有实体存在
如果当前_实体不是无:
折叠的_result.append(
(“”.join(当前\u实体\u令牌),当前\u实体)
返回结果
`如果当前实体不是None:collapsed\u result.append(“”.join(当前实体\u tokens),current\u entity))返回collapsed\u result`是否要解释这些代码?它会记住属于当前实体\u tokens
列表中实体的标记。在实体标记上的循环中,当新实体启动时,将处理该列表(即,在标记之间放置空格并存储在函数返回的列表中)。这意味着最后一个实体不会添加到列表中,必须添加到循环之后。