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
字母映射。
我需要在英文文本中查找俄语名称和姓氏。我试过 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
字母映射。