使用 python 节从文本数据中提取人名

Extracting human names from text data using python stanza

我有一个包含书籍标题页字符串值的数据集(例如,标题页上的所有单词,我的 txt 文件的每一行都是不同的书)。由此我试图检索作者的名字作为出现在标题页上的人名,并将每个名字存储在 csv 文件中的单独行中。当我键入以下代码时,我得到每个条目的“无作者”值,根据输入数据,这是不合理的。有人可以帮我弄清楚出了什么问题吗?谢谢,这几天一直在苦苦思索,没有结果。

import stanza 
import csv
stanza.download('en') 

nlp = stanza.Pipeline('en')

def get_human_names(text,output):
    with open(text, 'r', encoding = "ISO-8859-1") as txt_file:
        Lines=txt_file.readlines()
        person_list=[]
        for line in Lines:
            doc=nlp(str(line))
            for sent in doc.sentences:
                for token in sent.tokens:
                    if {token.ner}=='B-PERSON' or {token.ner}=='E-PERSON':
                        person_list.append({token.text})
                if(len(person_list)==0): ## avoid skipping entries in the output file
                    person_list=["no author"]
            with open(output, 'a') as csv_output:
                writer=csv.writer(csv_output)
                writer.writerow(person_list)

get_human_names('/Users/tancredirapone/Desktop/LoC_Project/titles.txt','/Users/tancredirapone/Desktop/LoC_Project/titles_author_stanza.csv')

万一有人遇到类似问题...这似乎可行,但结果并不完全令人满意(即遗漏了几个名字)。我不知道这是因为我写的代码还是偶尔缺少名字的节,但我怀疑是后者。

import csv
import stanza
stanza.download('en')
nlp=stanza.Pipeline('en')


with open('/Users/tancredirapone/Desktop/LoC_Project/titles.csv', 'r', encoding = "ISO-8859-1") as txt_file:
        reader=csv.reader(txt_file)
        for row in reader:
            person_list=[]
            doc=nlp(str(row))
            for i, sentence in enumerate(doc.sentences):
                for token in sentence.tokens:
                    if "PERSON" in str({token.ner}):
                        person_list.append({token.text})
            if len(person_list)==0:
                person_list=["no author"]
            with open('/Users/tancredirapone/Desktop/LoC_Project/author_names.csv', 'a') as csv_output:
                writer=csv.writer(csv_output)
                writer.writerow(person_list)
            person_list=[]   

一种可能是节可能遗漏了外国名字,但据我所知,不可能创建具有多种语言的管道 (nlp=stanza.Pipeline('en', 'de', 'fr' ...).