Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 移除NER处的B和I标签_Python_Python 3.x_Machine Learning_Nlp_Ner - Fatal编程技术网

Python 移除NER处的B和I标签

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]:

我有新闻文章,我想用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]:
        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
列表中实体的标记。在实体标记上的循环中,当新实体启动时,将处理该列表(即,在标记之间放置空格并存储在函数返回的列表中)。这意味着最后一个实体不会添加到列表中,必须添加到循环之后。