Я предполагаю, что у вас есть что-то похожее на базу знаний викиданных, которая представляет собой гигантский список понятий с псевдонимами.
Более или менее это можно представить следующим образом:
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