Pull to refresh

Comments 31

В оригинале, кстати, она EDI, просто аббревиатуру так на русский перевели.
Это я к надписи «Suzie» в заголовке программы.
Знаю, сам играл в английской озвучке. Просто сузи произносить удобнее.
Спасибо за статью!
Конечно, с Delphi и распознаванием/синтезированием речи будут проблемы. Разве что использование внешних ресурсов может помочь.
Посмотрите всё-таки в сторону какой-то более разумной обработки фраз, например, добавьте логику(типа не — отрицание следующей части). И, пожалуйста, выложите код, вам это ничего не стоит, а статью бы дополнило.
P.S. parse пишется через s
Хорошо, сейчас выложу, только базы от нехороших слов почищу, а то получится как с IBM Watson. Насчет parse, да, надо бы исправить. Распознавание не обязательно использовать через Delphi-библиотеки, поскольку Сузи будет стоять на отдельной машине, можно просто запускать хоть отдельное приложение для распознавания и воровать у него из текстовых поле распознанный текст через WinAPI.
я хочу добавить к ней распознавание и синтезирование речи (но это занятие долгое, а времени мало — сессия, студенты и им сочувствующие поймут)

Используйте гугловское, хотя бы для начала
Буду копаться с ней на даче летом, там интернетом не очень, так бы я к ней еще бы и Google Knowledge Graph прикрутил бы. Упор делается на полную автономность, да и какая радость от общения, если собеседник отвечает через несколько секунд после запроса.
Проходи не стесняйся=))
Помнится во времена BBS была такая программа как pSys — чат якобы с настоящим оператором BBS. Своего рода тоже псевдособеседник.

Логов с разговорами с ним в сети много, вот например — dunenet.ru/texts/9_100996.html
Простите за возможно тупой вопрос, но что такое BBS?
Bulletin Board System

ru.wikipedia.org/wiki/BBS
lurkmore.to/BBS

Кроме кучи частных и не очень BBS — была еще правительственная сеть стандарта x25 (РОСПАК), к ней был ограниченный бесплатный доступ по модему и куча «дырок» позволявших «юзать» в хвост и гриву :) с целью качать прон и творить другие подростковые штуки
Прон со скоростью < 4кбайт/c? мне кажется это оооочень проблематично. А насчсет pSys чего то он слишком умный для 96го… Хотя он и местами фейлит адово.
:) Ну дык прон тогдашний был 320х200 и 16 цветов, в основном формата GIF.

А pSys очень многих обманывал, угу, каждый 3-ий наверно далеко не сразу соображал с кем он чатится.
С тех пор мало что изменилось.
И сейчас боты в чатах водятся, и не каждый третий сообразит что это бот.
Например сайт стримов sc2tv.
Хорошая штука. Советую глянуть в сторону уже готовых словарей синонимов, а то и тезаурусов. Для английского есть WordNet , мощная база сгруппированных по смыслу словарных облаков.
Также советую подключить Oracle Text. Всё равно, наверное, захотите хранить диалоги пользователей со Сьюзи. Чем тут может быть полезен Text?

Да хотя бы поддержкой словоформ. К тому же , уже есть поддержка нескольких десятков (!) языков.
select * from v$version
/ 
select value from v$nls_parameters 
where  parameter = 'NLS_CHARACTERSET'
/ 
DROP TABLE news
/ 
EXEC CTX_DDL.DROP_PREFERENCE ('my_wordlist')
EXEC CTX_DDL.DROP_PREFERENCE ('global_lexer')
EXEC CTX_DDL.DROP_PREFERENCE ('english_LEXER')
EXEC CTX_DDL.DROP_PREFERENCE ('german_LEXER')
EXEC CTX_DDL.DROP_PREFERENCE ('russian_LEXER')
CREATE TABLE news
  (pkey           NUMBER,
   lang           VARCHAR2 (2),
   short_content  CLOB)
/ 
INSERT ALL
INTO news (pkey, lang, short_content)
  VALUES  (1, 'en', 'I drive a bike.')
INTO news (pkey, lang, short_content)
  VALUES  (2, 'en', 'I drove a bike.')
INTO news (pkey, lang, short_content)
  VALUES  (3, 'en', 'I have driven a bike.')
INTO news (pkey, lang, short_content)
  VALUES  (4, 'en', 'I always drive a car')
INTO news (pkey, lang, short_content)
  VALUES  (5, 'en', 'This is nothing')
INTO news (pkey, lang, short_content)
  VALUES  (6, 'de', 'Ich fahre ein Fahrrad.')
INTO news (pkey, lang, short_content)
  VALUES  (7, 'de', 'Ich fuhr ein Fahrrad.')
INTO news (pkey, lang, short_content)
  VALUES  (8, 'de', 'Ich habe ein Fahrrad gefahren.')
INTO news (pkey, lang, short_content)
  VALUES  (9, 'de', 'Ich habe immer ein Auto fahren.')
INTO news (pkey, lang, short_content)
  VALUES  (10, 'de', 'Es ist nichts.')
INTO news (pkey, lang, short_content)  VALUES  (11, 'ru', 'читал')
INTO news (pkey, lang, short_content)  VALUES  (12, 'ru', 'читаю')
INTO news (pkey, lang, short_content)  VALUES  (13, 'ru', 'читали')
INTO news (pkey, lang, short_content)  VALUES  (14, 'ru', 'читать')
INTO news (pkey, lang, short_content)  VALUES  (15, 'ru', 'читаем')
INTO news (pkey, lang, short_content)  VALUES  (16, 'ru', 'читаешь')  
SELECT * FROM DUAL
/ 
BEGIN
  -- word list:
  ctx_ddl.create_preference ('my_wordlist',   'basic_wordlist');
  ctx_ddl.set_attribute     ('my_wordlist',   'stemmer',            'auto');
  -- english lexer:
  ctx_ddl.create_preference ('english_lexer', 'basic_lexer');
  -- russian lexer:
--  ctx_ddl.create_preference ('russian_lexer', 'basic_lexer');  
  --ctx_ddl.set_attribute('russian_lexer', 'INDEX_STEMS','YES');
  -- german lexer:
  ctx_ddl.create_preference ('german_lexer',  'basic_lexer');
  ctx_ddl.set_attribute     ('german_lexer',  'composite',          'german');
  ctx_ddl.set_attribute     ('german_lexer',  'alternate_spelling', 'german');
  ctx_ddl.set_attribute     ('german_lexer',  'mixed_case',          'no');
  ctx_ddl.set_attribute     ('german_lexer',  'base_letter',         'yes');
  -- multi_lexer:
  ctx_ddl.create_preference ('global_lexer',  'multi_lexer');
  ctx_ddl.add_sub_lexer     ('global_lexer',  'default',             'english_lexer');
  ctx_ddl.add_sub_lexer     ('global_lexer',  'german',              'german_lexer');
  --ctx_ddl.add_sub_lexer     ('global_lexer',  'russian',              'russian_lexer');
END;
/ 
--drop index search_news;
create index search_news 
on news (short_content) 
indextype is ctxsys.context 
parameters 
  ('lexer            global_lexer
    language column  lang
    wordlist         my_wordlist')
/ 
EXEC DBMS_STATS.GATHER_TABLE_STATS (USER, 'NEWS')
COLUMN short_content FORMAT A30
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN'
/ 
set timing on
select * from news 
where  contains (short_content, '$drive') > 0
/ 
select * from news 
where  contains (short_content, '$drove') > 0
/ 
ALTER SESSION SET NLS_LANGUAGE = 'GERMAN'
/ 
select * from news 
where  contains (short_content, '$fahr') > 0
/ 
select * from news 
where  contains (short_content, '$fuhr') > 0
/ 

ALTER SESSION SET NLS_LANGUAGE = 'RUSSIAN'
/ 
select * from news 
where  contains (short_content, '$читать') > 0
/ 
select * from news 
where  contains (short_content, '$читали') > 0
/ 

Фишка тезаурусов Оракла ещё и в том, что там существуют уровни обобщения, и при должном программировании Ваша система сможет сообразить, что собака=млекопитающее=животное, например, при вопросе «ты своё животное покормить не забыла?» :-)
Также было бы интересно, если б «девушка» могла читать новостные ленты и «быть в курсе» трендов ))
Ну, типа, ты ей «Сердюков», а она тебе «Васильева», или «Коррупция».
Здесь могут помочь функции Gist, About, Themes, которые попытаются большой текст ужать до нескольких ключевых предложений.
Кстати, что насчёт опечаток? При текущем подходе, если слово набрано с опечаткой, диалога вообще не будет полноценного. Можно писать свой fuzzy matcher, например использовав дистанцию Левенштейна, можно использовать оракловую конструкцию textquery progression:

                                       
create table mybooks (title varchar2(20), author varchar2(20));

insert into mybooks values ('Consider the Lillies', 'Ian Crichton Smith');
insert into mybooks values ('Sphere',               'Michael Crichton');
insert into mybooks values ('Stupid White Men',     'Michael Moore');
insert into mybooks values ('Lonely Day',           'Michaela Criton');
insert into mybooks values ('How to Teach Poetry',  'Michaela Morgan');

create index auth_idx on mybooks (author) indextype is ctxsys.context;

SELECT score(1), title, author FROM mybooks WHERE CONTAINS (author, '
<query>
   <textquery>
     <progression>
       <seq>michael crichton</seq>
       <seq>?michael ?crichton</seq>
       <seq>michael OR crichton</seq>
       <seq>?michael OR ?crichton</seq>
     </progression>
   </textquery>
</query>', 1) > 0 ORDER BY score(1) DESC;

                                    

The output of this query is:

                                       
 SCORE(1) TITLE          AUTHOR
---------- -------------------- --------------------
        76 Sphere               Michael Crichton
        51 Lonely Day           Michaela Criton
        26 Stupid White Men     Michael Moore
        26 Consider the Lillies Ian Crichton Smith
         1 How to Teach Poetry  Michaela Morgan

Ну, это вот навскидку. Так-то тема интересная :-)
Спасибо большое, завтра изучу, сейчас уже мозги не варят.
Насчет опечаток, опять же, после подключения к голосовлму распознаванию можно уже не волноваться насчет опечаток, там может только слово целиком неверно распознаться, а от этого эже не спасешься. А вообще проблема опечаток решается добавлением нечеткого сравнения на стадии замены на синонимы. Насчет тезаруса с разными уровнями конкретизации да, мой подход в этом плане очень слаб, нет никакой эвристики и зависимости от контекста. А Oracle Text обязательно гляну, вы меня чертовски заинтересовали.
А, то есть основной упор будет на голосовую часть. Тогда есть смысл встроить распознавание голосов разных пользователей.
Товарищ сейчас занимается этой темой, для диплома, есть несколько неплохих статей.
Тут как раз используется Дельфи
Ну и парочка матлабовых:
Писать распознавание с нуля у меня мои познания в вышмате не потянут, 1 курс все таки еще. Вопрос, а Вы знаете готовые оффлайновые русскоязычные программы(или библиотеки) для распознавания речи?
Но лучше всего воспользоваться Sphinx

Вот тут есть гайд — habrahabr.ru/post/167479/

Там пункт «Русский язык в Pocketsphinx»
Спасибо за информацию, буду разбираться.
Нет. Это часть СУБД Oracle.
Забыл совсем. Как вы формировали правила наподобие *как*state*={&state} в faq.txt, вручную?
Хорошо бы добавить модуль обучения, который будет делать частотный анализ живых текстов и автоматически извлекать подобные правила…
Только вот где брать такие тексты в формате вопрос-ответ. Какой-нить мессенджер или форум бы взять да проанализировать только относительно короткие пАры…
Хм, а ведь есть mail.ru ответы и тому подобные сервисы…
Ну и в идеале хочется, чтобы виртуальный собеседник в процессе беседы уточнял контекст и общался с «живым» на одном языке: с деятелем культуры — высоким стилем, с учёным — на сухом точном языке фактов, с юной блондинкой — со смайликами и всякими женскими штучками, с гопником — на фене )
Да, сам, вручную, ну, впринципе, если забить словарь фраз и синонимов и погонять его по чатам, то можно научить. А насчет стиля общения — да, в принципе, тоже не проблема, просто подключать разные словари фраз. У меня в планах есть идея создавать для каждого отдельного юзера ini-файл со всеми его предпочтениями и тд.
I am Commander Shepard and this is my favourite assistant on Habrahabr!
Плюс за EDI и минус за то, что картинка с ней размером всего 415 x 717 весит 662 КБ.
Прошу прощения, не подумал, сейчас и правда поменьше сделаю.
Sign up to leave a comment.

Articles

Change theme settings