Как выполнить привязку объекта к локальному графу знаний?

Я создаю свою собственную базу знаний с нуля, используя статьи в Интернете.

Я пытаюсь сопоставить сущности из моих очищенных троек SPO (субъект и, возможно, объект) в мою собственную запись сущностей, состоящую из зарегистрированных на бирже компаний, которые я скопировал с какого-то другого веб-сайта.

Я исследовал большинство библиотек, и этот метод ориентирован на сопоставление сущностей с большими базами знаний, такими как Википедия, YAGO и т. д., но я не совсем уверен, как применить эти методы к моей собственной базе знаний.

В настоящее время я нашел пакет NEL Python, который утверждает, что может это сделать, но я не совсем понимаю документацию, и он сосредоточен только на дампе данных Википедии.

Существуют ли какие-либо методы или библиотеки, которые позволяют мне это делать?


person Alex Ramses    schedule 27.08.2018    source источник
comment
Можете ли вы описать содержание вашего графа знаний?   -  person amirouche    schedule 06.05.2019
comment
Я строю граф знаний, в котором хранится информация о перечисленных компаниях. Их часто нет в Википедии, если только они не являются суперкрупной компанией.   -  person Alex Ramses    schedule 25.05.2019
comment
Я не могу найти пакет NIL Python, не могли бы вы предоставить ссылку?   -  person amirouche    schedule 26.05.2019
comment
Я соберу то, что решит вашу проблему. Тем не менее, большая проблема здесь в том, что вы хотите извлечь тройку из текста, это сложная часть. Остальную базу данных, а также сканирование/скрапинг можно считать шаблонным.   -  person amirouche    schedule 26.05.2019
comment
Я считаю, что сделал опечатку в своем сообщении, пакет должен быть NEL, который можно найти здесь: nel.readthedocs.io/en/latest   -  person Alex Ramses    schedule 02.06.2019


Ответы (1)


Я предполагаю, что у вас есть что-то похожее на базу знаний викиданных, которая представляет собой гигантский список понятий с псевдонимами.

Более или менее это можно представить следующим образом:

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])

Это может быть улучшено, чтобы связать список, который соответствует понятию, с его идентификатором понятия, и найти способ проверки правописания всего (согласно базе знаний).

person amirouche    schedule 30.09.2019
comment
Спасибо. Это полезно, но не совсем подходит для таких случаев, как аббревиатура, которая часто встречается в статьях. Кроме того, не могли бы вы уточнить в части настройки индекса, который сопоставляет концепцию одного слова с идентификатором? - person Alex Ramses; 08.10.2019
comment
@AlexRamses дайте мне пример аббревиатуры, которая не обрабатывается вышеуказанным алгоритмом. Имейте в виду, что а) алгоритм работает совместно с knowledgebase б) это простая версия алгоритма. - person amirouche; 21.10.2019
comment
Например: input = 'ny is the big apple'.split() как ny – общепринятое сокращение для Нью-Йорка. - person Alex Ramses; 21.10.2019
comment
ny обрабатывается так же, как nyc - person amirouche; 10.01.2020