SpaCy NER 的 2 个字符串有什么区别?

What is the difference between 2 strings for SpaCy NER?

我需要在英文文本中查找俄语名称和姓氏。我试过 SpaCy NER,但它只匹配英文名称(例如,John Brandon),而不匹配俄文名称(如 Vitaliy Ivanov)。

我使用音译 python 库将英文文本翻译成俄语,然后应用俄语 Spacy nlp 模型通过 NER 获取名称。

但是我得到的字符串 'Ivanov Vitaliy' 和音译得到的相同字符串的结果不同。

代码如下:

from transliterate import translit, get_available_language_codes #pip install transliterate
from transliterate.discover import autodiscover
autodiscover()

from transliterate.base import TranslitLanguagePack, registry

class ExampleLanguagePack(TranslitLanguagePack):
    language_code = "example"
    language_name = "Example"
    mapping = (
             u'abvgdeziyklmnprstufhABVGDEZIYKLMNPRSTUFH', 
             u'абвгдезийклмнпрстуфхАБВГДЕЗИЙКЛМНПРСТУФХ',
             )
             
    pre_processor_mapping = {
             u"kh": u"x",
             u'ye': u'е',
             u'yo': u'ё',
             u'zh': u'ж', 
             u'ts': u'ц',
             u'ch': u'ч',
             u'sh': u'ш',
             u'shch': u'щ',
             u'sch': u'щ',
             #u'y': u'ы',
             u'e': u'э',
             u'kh': u'х',
             u'yu': u'ю',
             u'iu':u'ю',
             u'ya': u'я',
             u'ia': u'я',
             }     

registry.register(ExampleLanguagePack)
print(get_available_language_codes())

ru_trans=translit('Ivanov Vitaliy','example')
print (ru_trans)

name_ru=nlp_ru(ru_trans) 
#use NER to extract names
 
person=[entity.text for entity in name_ru.ents if entity.label_=="PER"] 
print(person)

得到 ['Виталий']

另一种情况:

name_ru=nlp_ru('Иванов Виталий')

#name_ru=nlp_ru(ru_trans) 
#use NER to extract names
 
person=[entity.text for entity in name_ru.ents if entity.label_=="PER"] 
print(person)

结果是['Иванов Виталий']

我检查了translit后得到的对象类型:

type(ru_trans) 

海峡

这两个字符串中字母的ASCII码相同

在这两个字符串上得到不同 NER 结果的原因可能是什么?

您忘记定义 o 字母映射。

修复如下:

mapping = (
    'abvgdeziyklmnoprstufhABVGDEZIYKLMNOPRSTUFH', 
    'абвгдезийклмнопрстуфхАБВГДЕЗИЙКЛМНОПРСТУФХ',
)

注意我添加了大写和小写 o 字母映射。