Python 使用IOB格式通过NLTK获取结果

Python 使用IOB格式通过NLTK获取结果,python,nlp,nltk,stanford-nlp,ner,Python,Nlp,Nltk,Stanford Nlp,Ner,我使用nltk作为Stanford NER Tagger的接口。我有一个问题,是否有任何选项可以使用NLTK将NER结果获取为IOB格式?我读过这篇文章,但它是针对java用户的 NLTK版本:3.4 Java版本:jdk1.8.0_211/bin 斯坦福大学NER模型:english.conll.4class.distsim.crf.ser.gz 输入:我的名字是唐纳德·特朗普 预期输出:我的/O姓名/O是/O唐纳德/B人特朗普/I人TL;博士 初见 编写一个简单的循环并遍历NER输出: de

我使用nltk作为Stanford NER Tagger的接口。我有一个问题,是否有任何选项可以使用NLTK将NER结果获取为IOB格式?我读过这篇文章,但它是针对java用户的

NLTK版本:3.4

Java版本:jdk1.8.0_211/bin

斯坦福大学NER模型:english.conll.4class.distsim.crf.ser.gz

输入:我的名字是唐纳德·特朗普

预期输出:我的/O姓名/O是/O唐纳德/B人特朗普/I人

TL;博士 初见

编写一个简单的循环并遍历NER输出:

def stanford_to_bio(tagged_sent):
    prev_tag = "O"
    bio_tagged_output = []
    current_ner = []
    for word, tag in tagged_sent:
        if tag == 'O':
            bio_tagged_output += current_ner
            bio_tagged_output.append((word, tag))
            current_ner = []
            prev_tag = 'O'
        else:
            if prev_tag == 'O':
                current_ner.append((word, 'B-'+tag))
                prev_tag = 'B'
            else:
                current_ner.append((word, 'I-'+tag))
                prev_tag = 'I'
    if current_ner:
        bio_tagged_output += current_ner
    return bio_tagged_output

tagged_sent = [('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'STATE_OR_PROVINCE')]
stanford_to_bio(tagged_sent)
[out]:

[('Rami', 'B-PERSON'),
 ('Eid', 'I-PERSON'),
 ('is', 'O'),
 ('studying', 'O'),
 ('at', 'O'),
 ('Stony', 'B-ORGANIZATION'),
 ('Brook', 'I-ORGANIZATION'),
 ('University', 'I-ORGANIZATION'),
 ('in', 'O'),
 ('NY', 'B-STATE_OR_PROVINCE')]

请看,主要的问题是如何通过输出获得IOB格式?请参阅答案的NER标记部分。。。阅读答案
ner\u tagger=CoreNLPParser(url=)http://localhost:9000“,tagtype='ner')
,我已经看到了,它只返回相同的标记PERSON作为人名,但我希望它以IOB格式返回:Donald Trump->Donald/B-PERSON Trump/I-PERSON欢迎使用SO。下次试着花点力气解释一下你试过什么。否则,人们将不会对此作出反应(因此=)