создать космическую базу знаний для похожих существительных

Все примеры связывания сущностей в документации 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])

Итак, теоретически, если у вас есть слово "плоскость" в математическом контексте, алгоритм должен понять, что оно соответствует (встроенному) описанию концепции САМОЛЕТА лучше, чем концепция САМОЛЕТА.

Надеюсь, что это поможет - я буду рад обсудить дальнейшее в комментариях!

Другие вопросы по тегам