Здравствуй!
Агитационно-пропагандистская деятельность, вопросно-ответная
— система, выпукло-вогнутая линза, журнально-газетное объединение, кожевенно-обувная промышленность, лично- командное первенство, марксистско-ленинское учение, отчетно-выборное собрание, партийно-комсомольский актив, приемно-переводные экзамены, ремонтно-техническая станция, русско-немецко французский словарь, сдельно-премиальная оплата,
сердечно-сосудистая система, торгово-промышленный комплекс, фабрично-заводские комитеты, хозяйственно-организационные мероприятия, шахматно-шашечные соревнования.
2. Северо-западный, орехово-зуевский, дизель-моторный.
3. Бледно-розовый, блекло-желтый, бутылочно-зеленый, голубовато-фиолетовый, золотисто-желтый, изжелта-красный, иссиня-черный, лимонно-желтый, молочно-белый, мутно-зеленый, пепельно-седой, светло-голубой, сиренево-оранжевый, темно- синий, тускло-серый, ярко-красный.
Это всё правило, друг мой. Вам должны были давать его перед тем, как задавать упражнение на дом.
Внедрение системы ответов на вопросы KBQA
Прежде всего, по умолчанию вы узнали, как построить граф знаний, и научились использовать sparql для запроса знаний в базе знаний. Если нет, перейдите по ссылке ниже
Используйте D2RQ для преобразования информации реляционной базы данных в файлы rdf.
Используйте jena для создания базы данных знаний tdb, а затем научитесь запрашивать связанные знания
Исходный код здесь, на GitHub
Структура каталогов проста:
KBQA
/ kbqa В нем четыре файла, а именно
word_tag.py ## В основном используется для сегментации слов
question_temp.py ## Это шаблон вопроса
question2sparql.py ## Это используется, чтобы превратить проблему в оператор sparql
query_main.py ## Очевидно, это последний файл запроса
Другой файл: lsy.nt Это тройка знаний rdf, источник знаний системы ответов на вопросы.
1. Разделите предложение на отдельные слова.
Это работа word_tag.py
Здесь в основном используется stanfordcorenlp, написанный Стэнфордским университетом.
Прежде чем вы сможете использовать этот пакет, вы должны сначала скачать что-нибудь
Официальный сайт Stanford CoreNLP скачать
stanford-corenlp-full-2018-10-05
1. Сначала загрузите красную кнопку, распакуйте ее, а затем поместите в нее пакет jar, загруженный ниже.
2. Используйте инструкции по установке pip install stanfordcorenlp
Что необходимо ввести, так это то, что класс word представляет словарь и имеет два атрибута: token (метка) и pos (часть речи).
nlp.pos_tag (предложение) вернет список, элементы являются кортежами, то есть слово и его часть речи.
Таким образом мы можем сегментировать предложение.
Во-вторых, построение шаблона задачи
Во-первых, исходя из базы знаний, у нас могут возникнуть следующие вопросы
sentence_list = [
"What is the name of littlejun ?",
"What is the age of chacha ?" ,
"What is the username of scc ?" ,
"Whose age is larger than 18 ? " ,
"What is the phone number of chacha ? " ,
"What is the password of littlejun ? "
]
Шаблоны sparql, наконец, состоят из следующих шаблонов
# Шаблон вопроса
prefix_temp ="""
PREFIX ps:<http://solicucu/person/#>
PREFIX us:<http://solicucu/user/#>
PREFIX vocab: <http://solicucu/vocab/>
"""
sparql_select_temp = u"""
{prefix}
select distinct {select} where {{
{expression}
}}
"""
Затем обратите внимание, что нам нужно только завершить заполнение select и expression.
Это связано с вопросом подтверждения, поэтому нам нужно узнать, к какому предложению принадлежит входящий вопрос?
REFO (Regular Expressions for Objects)
На основе регулярного сопоставления на уровне объекта это очень похоже на регулярные выражения в Python.
"ab" is Literal("a") + Literal("b")
"a*" is Star(Literal("a"))
"(ab)+|(bb)*?" is:
a = Literal("a")
b = Literal("b")
regex = Plus(a + b) | Star(b + b, greedy=False)
Как вы можете видеть выше, Literal — это буквальный класс, и эти классы поддерживают некоторые базовые символы: + означает подключение
| означает или,
Знак + в регулярных выражениях Python заменяется на Plus (), что означает один или несколько.
Знак * в регулярных выражениях Python заменяется звездочкой (), что означает 0 или более, и вы можете выбрать, следует ли использовать жадный режим.
Поэтому определение словарного запаса очень важно:
# Определить словарный класс, унаследовать Predicate
class W(Predicate):
#token буквальный символ словаря pos атрибут словаря
def __init__(self,token=".*",pos=".*"):
self.token = re.compile(token + "$")
self.pos = re.compile(pos+"$")
super(W, self).__init__(self.match) # Незаменимый
def match(self,word):
m1 = self.token.match(word.token)
m2 = self.pos.match(word.pos)
return m1 and m2
Определение предиката, это класс, наследующий от Predicate (от refo, определяет другое обычное свойство соответствующего объекта
Функция сопоставления на поверхности для переданного слова должна удовлетворять как знаку, так и части речи.
# Определить некоторые правила, которые эквивалентны определенному шаблону регулярных выражений
class Rule(object):
# Количество совпадающих условий и условий и функция обратного вызова действия
def __init__(self,condition_num,condition=None,action=None):
assert condition and action
self.condition = condition
self.action = action
self.condition_num = condition_num
def apply(self,word_list):
# Поскольку есть много мест, которые могут соответствовать условиям, используйте список совпадений для хранения
matches = []
# Используйте условия для поиска совпадающих слов, yeild используется в finditer, то есть каждый раз, когда будет найден результат, он будет возвращен один раз и продолжит поиск
# Можно понять как значение, возвращаемое finditer, может повторяться
for m in finditer(self.condition,word_list):
i,j = m.span()
matches.extend(word_list[i:j]) # Извлечь совпавший интервал предложения, который может содержать другой словарь
return self.action(matches),self.condition_num
В форме класса правил сначала должны быть два параметра: условие и действие, которые представляют условия, к которым применяется это правило (регулярное выражение объекта) и предпринятые действия (функция обратного вызова).
Обратите внимание, что объект, возвращаемый finditer, является объектом Match, а соответствующий диапазон получается с помощью span ()
Когда предикат определен и определены правила, вы можете написать правила сопоставления.
# Вопросительное местоимение, ключевые слова, кто что
what = (W("what")|W("What"))
whose = (W("whose")|W("Whose"))
of = W("of")
number_entity = W(pos="CD")
# Ключевые слова недвижимости
username = W("username")
name = W("name")
phone = W("phone")
age = W("age")
password = W("password")
attr_noun = (username | name | phone | phone | age | password)
#Имя нарицательное
common_noun = W(pos = pos_common_noun)
Глядя на словарь, определенный выше, что может соответствовать верхнему или нижнему регистру, потому что what = (W («что») | W («Что»))
Таким образом, предикат может быть операцией ИЛИ нескольких предикатов, или существует только один, который соответствует фиксированному слову.
number_entity = W (pos = «CD») Определяет числовой предикат, потому что нам не важно его значение, поэтому лучше указать атрибут как «CD». Что касается того, почему это «CD» «
Дополнительные сведения см. В разделе standfordcorenlp English part-of-speech tagging.
attr_noun: представляет собой существительные атрибутов. В этой базе данных знаний используются основные существительные атрибутов, указанные выше.
Определение правила
rules = [
# What is the name of sb-uname?
# What is the age of sb-uname ?
# What is the username of sb-uname?
# What is the phone number of sb-uname?
# What is the password of sb-name?
Rule(condition_num = 4 ,condition = what + Star(Any(),greedy = False) + attr_noun + Star(Any(),greedy = False) + of + common_noun + Star(Any(),greedy = False),action = QuestionSet.proccess_attr_noun),
# Whose age is larger than 18 ?
Rule(condition_num = 4,condition = whose + attr_noun + Star(Any(),greedy = False) + compare + Star(Any(),greedy = False) + number_entity + Star(Any(),greedy = False),action = QuestionSet.who_age_compare )
]
Здесь всего два правила: первое соответствует вышеуказанным 5 вопросам, второе соответствует вышеуказанным вопросам.
Первый параметр condition_num: это количество слов, на которые мы обращаем внимание в условии. Например, для первого мы надеемся найти соответствие attr_noun (имя, возраст и т. Д.), Common_noun (имя нарицательное), поэтому это 3.
Второй параметр условия:
Здесь вы можете видеть, что это добавление нескольких предикатов, то есть, как упоминалось ранее, это означает соединение, поэтому значение этого условия
Любой шаблон предложения: what / What… имя / возраст / имя пользователя / пароль / телефон… comomn_noun…
, поэтому он соответствует предложению выше
Третий параметр action:
функция обратного вызова, в правиле есть такой атрибут, это функция, которая будет вызываться после вызова apply, если она соответствует
Здесь он указывает на функцию QuestionSet.proccess_attr_noun, которую можно продолжить, чтобы определить, какое это правило.
Извлечь словарный запас, заполнить шаблон
# 1 what is the name of sb-uname ?
def what_name(word_list):
# if(len(word_list)):
# print («Проблема успешного сопоставления»)
# for w in word_list:
# print(w.token,end = " ")
sparql = None
select = "?name"
for w in reversed(word_list):
# Найдите первое нарицательное существительное
if(w.pos == pos_common_noun):
e = " ps:{person} vocab:person_name ?name .".format(person = w.token)
sparql = sparql_select_temp.format(prefix = prefix_temp,
select = select,
expression = e)
break
return sparql
Первый — присвоить значение для выбора, чтобы определить запрашиваемую переменную. Например, вот оно? имя — это запрашиваемая переменная
Наконец, нужно определить переменную выражения, вот она:
ps:{person} vocab:person_name ?name
означает чье-то имя, этот кто-то будет существительным с обратной стороны word_list, поэтому, найдя его, вы можете прервать работу и выйти.
, а затем верните соответствующий оператор sparql
В-третьих, преобразовать предложения в предложения sparql
def get_sparql(sentence):
word_list = word_tag.get_word_list(sentence)
query = None
queries_dict = dict()
for rule in question_temp.rules:
query,num = rule.apply(word_list)
if(query is not None):
queries_dict[num] = query
if len(queries_dict) == 0 :
return None
elif len(queries_dict) == 1:
# Доступен по индексу, только если он преобразован в список
return list(queries_dict.values())[0]
else: # ключ - это имя указанного столбца для упорядочивания кортежа. Имя элемента произвольно, указывает на элемент списка, элемент [0] указывает это значение
sorted_dict = sorted(queries_dict.iteritems(),key=lambda item:item[0],reversed = True)
return sorted_dict[0][1]
Вышеупомянутое должно сопоставить каждое правило с предложением и поместить его в словарь.
Если длина равна 0, то совпадения нет, если длина равна 1, то соответствует только одно предложение, и непосредственно берется 0-е значение, но оно должно быть преобразовано в список, прежде чем его можно будет использовать Доступ к индексу.
Если длина больше 1, отсортируйте словарь по размеру ключа от наибольшего к наименьшему, то есть выбирается тот, у которого наиболее подходящие ключевые слова.
4. Посетите конечную точку и отобразите результаты запроса.
sparql = SPARQLWrapper("http://localhost:3030/db/query")
sparql.setReturnFormat(JSON)
if __name__ == "__main__":
# sentence = "What is the username of scc ?"
while True:
sentence = input("please input the question ? input quit to leaven")
# print("question:",sentence)
if(sentence == "quit"):
break
str_sparql = q2s.get_sparql(sentence)
if(str_sparql is not None):
sparql.setQuery(str_sparql)
results = sparql.query().convert()
head = results["head"]["vars"]
values = results["results"]["bindings"] # Сохраненные результаты
if(len(values)==0):
print("no relevant answer")
else:
print("the answer is :",end = " ")
for v in values: # Для всех значений получить значение через varname
for varname in head:
print(v[varname]["value"])
else:
print("sorry,I can't understand your means")
Здесь следует отметить, что имя переменной, которое мы запрашиваем, существует results [«head»] [«vars»]
Соответствующее значение существует results [«results»] [«bindings»] Результатом является словарь
Вопросно-ответная
система (англ. Question-answering
system)
— это особый тип информационных систем,
являющиеся гибридом поисковых, справочных
и интеллектуальных систем (часто они
рассматриваются как интеллектуальные
поисковые системы). QA-система
должна быть способна принимать вопросы
на естественном языке, то есть это
система с естественно-языковым
интерфейсом. Информация предоставляется
на основе документов из сети Интернет
или из локального хранилища. Современные
разработки QA-систем
позволяют обрабатывать множество
вариантов запросов фактов, списков,
определений, вопросов типа Как, Почему,
гипотетических, сложных и межъязыковых.
-
Узкоспециализированные
QA-системы
работают в конкретных областях (например,
медицина или обслуживание автомобилей).
Построение
таких систем — сравнительно легкая
задача. -
Общие
QA-системы
работают с информацией по всем областям
знаний, таким образом, появляется
возможность вести поиск в смежных
областях.
1.2.1Архитектура
Первые
QA-системы
были разработаны в 1960х годах и являлись
естественно-языковыми оболочками для
экспертных систем, ориентированных на
конкретные области. Современные системы
предназначаются для поиска ответов на
вопросы в предоставляемых документах
с использованием технологий обработки
естественных языков (NLP).
Современные
QA-системы
обычно включают особый модуль —
классификатор вопросов, который
определяет тип вопроса и, соответственно,
ожидаемого ответа. После этого анализа
система постепенно применяет к
предоставленным документам все более
сложные и тонкие методы NLP,
отбрасывая ненужную информацию. Самый
грубый метод — поиск в документах —
предполагает использование системы
поиска информации для отбора частей
текста, потенциально содержащих ответ.
Затем фильтр выделяет фразы, похожие
на ожидаемый ответ (например, на вопрос
«Кто …» фильтр вернет кусочки текста,
содержащие имена людей). И, наконец,
модуль выделения ответов найдет среди
этих фраз правильный ответ.
1.2.2Схема работы
Производительность
вопросно-ответной системы зависит от
качества текстовой базы — если в ней
нет ответов на вопросы, QA-система
мало что сможет найти. Чем больше база
— тем лучше, но только если она содержит
нужную информацию. Большие хранилища
(такие как Интернет) содержат много
избыточной информации. Это ведёт к двум
положительным моментам:
-
Так
как информация представлена в разных
формах, QA-система
быстрее найдет подходящий ответ. Не
придется прибегать к сложным методам
обработки текстов. -
Правильная
информация чаще повторяется, поэтому
ошибки в документах отсеиваются.
2Обеспечение работы иис
-
Математическое
-
Лингвистическое
-
Информационное
-
Семантическое
-
Программное
-
Техническое
-
Технологическое
-
Кадровое
3Классификация задач, решаемых иис
-
Интерпретация
данных. Это одна из традиционных задач
для экспертных систем. Под интерпретацией
понимается процесс определения смысла
данных, результаты которого должны
быть согласованными и корректными.
Обычно предусматривается многовариантный
анализ данных. -
Диагностика.
Под диагностикой понимается процесс
соотношения объекта с некоторым классом
объектов и/или обнаружение неисправности
в некоторой системе. Неисправность —
это отклонение от нормы. Такая трактовка
позволяет с единых теоретических
позиций рассматривать и неисправность
оборудования в технических системах,
и заболевания живых организмов, и
всевозможные природные аномалии. Важной
спецификой является здесь необходимость
понимания функциональной структуры
(«анатомии») диагностирующей системы. -
Мониторинг.
Основная задача мониторинга — непрерывная
интерпретация данных в реальном масштабе
времени и сигнализация о выходе тех
или иных параметров за допустимые
пределы. Главные проблемы — «пропуск»
тревожной ситуации и инверсная задача
«ложного» срабатывания. Сложность этих
проблем в размытости симптомов тревожных
ситуаций и необходимость учёта временного
контекста. -
Проектирование.
Проектирование состоит в подготовке
спецификаций на создание «объектов»
с заранее определёнными свойствами.
Под спецификацией понимается весь
набор необходимых документов—чертёж,
пояснительная записка и т.д. Основные
проблемы здесь — получение чёткого
структурного описания знаний об объекте
и проблема «следа». Для организации
эффективного проектирования и в ещё
большей степени перепроектирования
необходимо формировать не только сами
проектные решения, но и мотивы их
принятия. Таким образом, в задачах
проектирования тесно связываются два
основных процесса, выполняемых в рамках
соответствующей ЭС: процесс вывода
решения и процесс объяснения. -
Прогнозирование.
Прогнозирование позволяет предсказывать
последствия некоторых событий или
явлений на основании анализа имеющихся
данных. Прогнозирующие системы логически
выводят вероятные следствия из заданных
ситуаций. В прогнозирующей системе
обычно используется параметрическая
динамическая модель, в которой значения
параметров «подгоняются» под заданную
ситуацию. Выводимые из этой модели
следствия составляют основу для
прогнозов с вероятностными оценками. -
Планирование.
Под планированием понимается нахождение
планов действий, относящихся к объектам,
способным выполнять некоторые функции.
В таких ЭС используются модели поведения
реальных объектов с тем, чтобы логически
вывести последствия планируемой
деятельности. -
Обучение.
Под обучением понимается использование
компьютера для обучения какой-то
дисциплине или предмету. Системы
обучения диагностируют ошибки при
изучении какой-либо дисциплины с помощью
ЭВМ и подсказывают правильные решения.
Они аккумулируют знания о гипотетическом
«ученике» и его характерных ошибках,
затем в работе они способны диагностировать
слабости в познаниях обучаемых и
находить соответствующие средства для
их ликвидации. Кроме того, они планируют
акт общения с учеником в зависимости
от успехов ученика с целью передачи
знаний.
Нейронные
сети не программируются в привычном
смысле этого слова, они обучаются.
Возможность обучения — одно из главных
преимуществ нейронных сетей перед
традиционными алгоритмами. Технически
обучение заключается в нахождении
коэффициентов связей между нейронами.
В процессе обучения нейронная сеть
способна выявлять сложные зависимости
между входными данными и выходными, а
также выполнять обобщение. Это значит,
что, в случае успешного обучения, сеть
сможет вернуть верный результат на
основании данных, которые отсутствовали
в обучающей выборке.
-
Управление.
Под управлением понимается функция
организованной системы, поддерживающая
определенный режим деятельности. Такого
рода ЭС осуществляют управление
поведением сложных систем в соответствии
с заданными спецификациями. -
Поддержка
принятия решений. Поддержка принятия
решения — это совокупность процедур,
обеспечивающая лицо, принимающее
решения, необходимой информацией и
рекомендациями, облегчающие процесс
принятия решения. Эти ЭС помогают
специалистам выбрать и/или сформировать
нужную альтернативу среди множества
выборов при принятии ответственных
решений.
В
общем случае все системы, основанные
на знаниях, можно подразделить на
системы, решающие задачи анализа, и на
системы, решающие задачи синтеза.
Основное отличие задач анализа от задач
синтеза заключается в том, что если в
задачах анализа множество решений может
быть перечислено и включено в систему,
то в задачах синтеза множество решений
потенциально не ограничено и строится
из решений компонент или под-проблем.
Задачами анализа являются: интерпретация
данных, диагностика, поддержка принятия
решения; к задачам синтеза относятся
проектирование, планирование, управление.
Комбинированные:
обучение, мониторинг, прогнозирование.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #