我一直在使用deeppavlov的命名实体识别模型,但是它以以下格式返回数据:[[[tokens],[ner_tags]]]
示例:
原始文本-John Doe at Burger King on Thursday
返回:
[[['john', 'doe', 'at', 'burger', 'king', 'on', 'thursday'],
['B-PERSON, 'I-PERSON', 'O', B-ORG, I-ORG, 'O', 'B-DATE]]]
所需:
[['john doe', 'PERSON'], ['burger king', ORG], [thursday, DATE]]
“ B-”前缀表示实体的开始,而“ I-”前缀表示实体的“内部”。如何操作列表以提供所需的输出
答案 0 :(得分:0)
您可以使用zip
方法。
rs = [[['john', 'doe', 'at', 'burger', 'king', 'on', 'thursday'],
['B-PERSON, 'I-PERSON', 'O', B-ORG, I-ORG, 'O', 'B-DATE]]]
words, kinds = rs[0]
classes = [[word, kind] for word, kind in zip(words, kinds) if kind != 'O']
答案 1 :(得分:0)
使用itertools.groupby
:
from itertools import groupby
res = []
for k, g in groupby(zip(*result[0]), key=lambda x:x[1].split('-')[-1]):
if k != 'O':
res.append([' '.join(x[0] for x in g), k])
res
输出:
[['john doe', 'PERSON'], ['burger king', 'ORG'], ['thursday', 'DATE']]
您可以制作此单线纸:
[[' '.join(x[0] for x in g), k] for k, g in groupby(zip(*result[0]), key=lambda x:x[1].split('-')[-1]) if k != 'O']