Как программно реализовать семантическую сеть?

Признаюсь сразу это д/з такое в универе. Но я задался этим вопросом более серьёзно, чем от нас требуют. Среди однокурсников полное недопонимание чего от нас хотят, и сдают они измененные копии одной работы.
Суть вопроса - построить простую семантическую сеть из нескольких элементов и написать прогу, которая путем опроса приведёт тебя к определенному ответу. При этом все данные необходимо где-то хранить так, чтобы можно было изменить их не трогая код самой программы.
Очень странными для меня было недоумение преподавателя от моего вопроса "можно ли данные хранить в БД?", на что ответ был - "нет, для семантической сети нужна База Знаний, а это не БД". Я смирился с этим бредом и написал на php+MySQL за 10 мин приложение.
Мой вопрос сообществу. Что такое семантическая сеть? Её реально построить в реляционной БД? Покажите примеры реализации, пожалуйста)
P.S. Приму любые связки технологий, ЯП, концепций и т.д.
  • Вопрос задан
  • 3839 просмотров
Пригласить эксперта
Ответы на вопрос 2
tsarevfs
@tsarevfs
C++ developer
Либо преподаватель не может читать не по методичке, либо вам предложили использовать какой-то готовый инструмент / алгоритм. В принципе реализовать графовую структуру на реляционной БД не составляет проблем. Но возможно это будет не оптимальным решением, и более специализированное хранилище подойдет лучше.
На уровне учебной задачи БД скорее всего будет работать не хуже самописного решения.
Ответ написан
@Gabriel_vs
I'm a Scientist in Data Analysis / programmar.
База знаний это набор фактов. Фактом может быть утверждение: Москва является столицей России. Факты могут иметь формат RDF триплета:

_:Москва _:являетсяСтолицей _:Россия

Данные/триплеты могут быть связные, например:

_:Россия _:располагаетсяНаМатерике _:Евразия

и получается уже маленькая База Знаний:

_:Москва _:являетсяСтолицей _:Россия
_:Россия _:располагаетсяНаМатерике _:Евразия

Такие триплеты имеют формат графа. Чем больше триплетов, тем больше База Знаний. Откуда брать такие триплеты или как моделировать это уже другой вопрос. Можно извлечь из других Баз Знаний (dbpedia, freebase, etc). Можно самостоятельно извлекать именованные сущности из не структурированных данных (например СМИ, форумы), но это не тривиальная задача, однако выполнимая.

Хранить это можно как в текстовых файлах в виде представленных выше триплетах, так и в NoSQL базах данных.

Семантическая сеть оперирует фактами/триплетами. Найти ответ на вопрос в ней можно следующим образом:

question = (my_apartment, has, what)
knowledge = (
        (I, own, my_apartment),
        (my_apartment, has, my_computer),
        (my_apartment, has, my_bed),
        (my_apartment, is_in, Philadelphia)
    )
for each statement in knowledge {
    if ((statement.subject == question.subject
            or question.subject == what) {
          and (statement.predicate == question.predicate
            or question.predicate == what)
          and (statement.object == question.object
            or question.object == what))
        call FoundAnswer(statement)
    }
}

Output:
    Answer: my_apartment has my_computer
    Answer: my_apartment has my_bed
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы