создать космическую базу знаний для похожих существительных
Все примеры связывания сущностей в документации spacy основаны на именованных сущностях. Можно ли создать знающего так, чтобы оно связывало определенные существительные с определенными существительными?
Например, "самолет" на "самолет" и "самолет" в случае опечатки? Так что я могу заранее определить возможные альтернативные термины, которые можно использовать для слова "самолет". Есть конкретные примеры?
Я пробовал это с помощью базы знаний:
vocab = nlp.vocab
kb = KnowledgeBase(vocab=vocab, entity_vector_length=64)
kb.add_entity(entity="Aeroplane", freq=32, entity_vector=vector1)
как описано здесь: https://spacy.io/api/kb
но я не знаю, что использовать в качестве
entity_vector
, который должен быть предварительно обученным вектором сущности.
Другой пример, который я видел в документации, был следующим:
nlp = spacy.load('en_core_web_sm')
kb = KnowledgeBase(vocab=nlp.vocab, entity_vector_length=3)
# adding entities
kb.add_entity(entity="Q1004791", freq=6, entity_vector=[0, 3, 5])
kb.add_entity(entity="Q42", freq=342, entity_vector=[1, 9, -3])
kb.add_entity(entity="Q5301561", freq=12, entity_vector=[-2, 4, 2])
# adding aliases
kb.add_alias(alias="Douglas", entities=["Q1004791", "Q42", "Q5301561"], probabilities=[0.6, 0.1, 0.2])
kb.add_alias(alias="Douglas Adams", entities=["Q42"], probabilities=[0.9])
Разве мы не можем использовать что-либо, кроме вики-идентификаторов? и как мне получить эти длины векторов?
1 ответ
Позвольте мне ответить на ваши вопросы:
Все примеры связывания сущностей в документации spacy основаны на именованных сущностях. Можно ли создать знающего так, чтобы оно связывало определенные существительные с определенными существительными?
Вероятно, вы можете использовать алгоритм EL для связывания неименованных объектов с некоторой настройкой. Теоретически базовая модель машинного обучения действительно смотрит на сходство предложений и не так сильно использует тот факт, что слова / фразы являются именованными сущностями или нет.
Внутреннее устройство spaCy в настоящее время предполагает, что вы запускаете алгоритм EL для результатов NER. Это означает, что он будет пытаться только связать
Span
объекты, хранящиеся в
doc.ents
. В качестве обходного пути вы можете убедиться, что слова, которые вы пытаетесь связать, зарегистрированы как именованные объекты в doc.ents
. Вы можете обучить собственный алгоритм NER, который распознает ваши конкретные термины, или запустить стратегию сопоставления на основе правил и установить
doc.ents
с результатами этого.
Разве мы не можем использовать что-либо, кроме вики-идентификаторов?
Конечно - вы можете использовать все, что захотите, если идентификаторы являются уникальными строками. Допустим, вы представляете концепт "самолет" с помощью уникальной строки "САМОЛЕТ".
но я не знаю, что использовать в качестве entity_vector, который должен быть предварительно обученным вектором объекта.
Вектор сущности - это встроенное представление вашей концепции, и оно будет сравниваться с вложением предложения, в котором встречается псевдоним, чтобы определить, совпадают ли они семантически.
Здесь есть еще документация: https://spacy.io/usage/training#kb
Проще всего, если вы убедитесь, что у вас есть модель с предварительно обученными векторами, обычно
_md
и
_lg
модели.
Затем вам нужно какое-то описание сущностей в вашей базе данных. Для Викиданных мы использовали описание объекта, например "Самолет с двигателем" из https://www.wikidata.org/wiki/Q197. Вы также можете взять первое предложение статьи в Википедии или что угодно еще. Пока он предоставляет некоторый контекст вашей концепции.
Позвольте мне прояснить все вышеперечисленное на примере кода:
nlp = spacy.load(model)
vectors_dim = nlp.vocab.vectors.shape[1]
kb = KnowledgeBase(vocab=nlp.vocab, entity_vector_length=vectors_dim)
airplane_description = "An airplane or aeroplane (informally plane) is a powered, fixed-wing aircraft that is propelled forward by thrust from a jet engine, propeller or rocket engine."
airplane_vector = nlp(airplane_description).vector
plane_description = "In mathematics, a plane is a flat, two-dimensional surface that extends infinitely far."
plane_vector = nlp(plane_description).vector
# TODO: Deduce meaningful "freq" values from a corpus: see how often the concept "PLANE" occurs and how often the concept "AIRPLANE" occurs
kb.add_entity(entity="AIRPLANE", freq=666, entity_vector=airplane_vector)
kb.add_entity(entity="PLANE", freq=333, entity_vector=plane_vector)
# TODO: Deduce the prior probabilities from a corpus. Here we assume that the word "plane" most often refers to AIRPLANE (70% of the cases), and infrequently to PLANE (20% of cases)
kb.add_alias(alias="airplane", entities=["AIRPLANE"], probabilities=[0.99])
kb.add_alias(alias="aeroplane", entities=["AIRPLANE"], probabilities=[0.97])
kb.add_alias(alias="plane", entities=["AIRPLANE", "PLANE"], probabilities=[0.7, 0.2])
Итак, теоретически, если у вас есть слово "плоскость" в математическом контексте, алгоритм должен понять, что оно соответствует (встроенному) описанию концепции САМОЛЕТА лучше, чем концепция САМОЛЕТА.
Надеюсь, что это поможет - я буду рад обсудить дальнейшее в комментариях!