Как выполнить связывание сущностей с графом локальных знаний?
Я создаю свою собственную базу знаний с нуля, используя статьи онлайн.
Я пытаюсь сопоставить сущности из моих очищенных троек SPO (Предмет и, возможно, Объект) с моей собственной записью сущностей, которые состоят из перечисленных компаний, которые я удалил с какого-то другого веб-сайта.
Я исследовал большинство библиотек, и метод ориентирован на сопоставление сущностей с большими базами знаний, такими как Википедия, YAGO и т. Д., Но я не совсем уверен, как применить эти методы к моей собственной базе знаний.
В настоящее время я обнаружил пакет NIL Python, который утверждает, что способен сделать это, но я не совсем понимаю документацию, и он сосредоточен только на дампе данных Википедии.
Есть ли какие-либо методы или библиотеки, которые позволяют мне это делать?
0 ответов
Я предполагаю, что у вас есть что-то похожее на базу знаний викиданных, которая представляет собой гигантский список понятий с псевдонимами.
Более или менее это можно представить следующим образом:
C1 new york
C1 nyc
C1 big apple
Теперь свяжите отрезки предложения с указанным выше КБ, для отдельных слов это просто, вам просто нужно настроить индекс, который отображает концепцию одного слова на идентификатор.
Сложная часть - связать несколько словесных концепций или фразовых концепций, таких как "нью-йорк" или "большое яблоко".
Для этого я использую алгоритм, который разбивает предложение на все возможные части. Я называю это "промежутками". Затем попробуйте сопоставить отдельный отрезок или группу слов с концепцией из базы данных (одно слово или несколько слов).
Например, вот пример всех интервалов для простого предложения. Это список, в котором хранятся списки строк:
[['new'], ['york'], ['is'], ['the'], ['big'], ['apple']]
[['new'], ['york'], ['is'], ['the'], ['big', 'apple']]
[['new'], ['york'], ['is'], ['the', 'big'], ['apple']]
[['new'], ['york'], ['is'], ['the', 'big', 'apple']]
[['new'], ['york'], ['is', 'the'], ['big'], ['apple']]
[['new'], ['york'], ['is', 'the'], ['big', 'apple']]
[['new'], ['york'], ['is', 'the', 'big'], ['apple']]
[['new'], ['york'], ['is', 'the', 'big', 'apple']]
[['new'], ['york', 'is'], ['the'], ['big'], ['apple']]
[['new'], ['york', 'is'], ['the'], ['big', 'apple']]
[['new'], ['york', 'is'], ['the', 'big'], ['apple']]
[['new'], ['york', 'is'], ['the', 'big', 'apple']]
[['new'], ['york', 'is', 'the'], ['big'], ['apple']]
[['new'], ['york', 'is', 'the'], ['big', 'apple']]
[['new'], ['york', 'is', 'the', 'big'], ['apple']]
[['new'], ['york', 'is', 'the', 'big', 'apple']]
[['new', 'york'], ['is'], ['the'], ['big'], ['apple']]
[['new', 'york'], ['is'], ['the'], ['big', 'apple']]
[['new', 'york'], ['is'], ['the', 'big'], ['apple']]
[['new', 'york'], ['is'], ['the', 'big', 'apple']]
[['new', 'york'], ['is', 'the'], ['big'], ['apple']]
[['new', 'york'], ['is', 'the'], ['big', 'apple']]
[['new', 'york'], ['is', 'the', 'big'], ['apple']]
[['new', 'york'], ['is', 'the', 'big', 'apple']]
[['new', 'york', 'is'], ['the'], ['big'], ['apple']]
[['new', 'york', 'is'], ['the'], ['big', 'apple']]
[['new', 'york', 'is'], ['the', 'big'], ['apple']]
[['new', 'york', 'is'], ['the', 'big', 'apple']]
[['new', 'york', 'is', 'the'], ['big'], ['apple']]
[['new', 'york', 'is', 'the'], ['big', 'apple']]
[['new', 'york', 'is', 'the', 'big'], ['apple']]
[['new', 'york', 'is', 'the', 'big', 'apple']]
Каждый подсписок может отображаться или не соответствовать концепции. Чтобы найти лучшее сопоставление, вы можете оценить каждую из приведенных выше строк на основе количества подходящих концепций.
Вот два из приведенного выше списка диапазонов, которые имеют лучший результат согласно образцу базы знаний:
2 ~ [['new', 'york'], ['is'], ['the'], ['big', 'apple']]
2 ~ [['new', 'york'], ['is', 'the'], ['big', 'apple']]
Итак, он решил, что "Нью-Йорк" - это концепция, и "большое яблоко" - это тоже концепция.
Вот полный код:
input = 'new york is the big apple'.split()
def spans(lst):
if len(lst) == 0:
yield None
for index in range(1, len(lst)):
for span in spans(lst[index:]):
if span is not None:
yield [lst[0:index]] + span
yield [lst]
knowledgebase = [
['new', 'york'],
['big', 'apple'],
]
out = []
scores = []
for span in spans(input):
score = 0
for candidate in span:
for uid, entity in enumerate(knowledgebase):
if candidate == entity:
score += 1
out.append(span)
scores.append(score)
leaderboard = sorted(zip(out, scores), key=lambda x: x[1])
for winner in leaderboard:
print(winner[1], ' ~ ', winner[0])
Это может быть улучшено, чтобы связать список, который соответствует концепции, с ее идентификатором концепции, и найти способ проверки орфографии во всем (согласно базе знаний).