Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать распознавание строки?
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
Dimo444ka
Пишу большую прогу, вот кое что в ней не получаеться:
Пользователь вводит предложение и нужно:
Разделить это предложение по словам и перевести их в именительный падеж и отобрать нужные по образцу слова.
Как это сделать???
sax_ol
Цитата(Dimo444ka @ 1:02:2008, 19:49 )
Разделить это предложение по словам

TStringList + DelimitedText + Delimiter
Цитата(Dimo444ka @ 1:02:2008, 19:49 )
перевести их в именительный падеж

это трудновато, и врядли решаемо в общем случае. хотя если пользовать супер навороченные движки ...
Цитата(Dimo444ka @ 1:02:2008, 19:49 )
отобрать нужные по образцу слова

именно в именительном? по другому никак?

а зачем такое ваще?
European
Для: Dimo444ka
Есть вот такая библиотека:
Склонение фамилий, имен и отчеств по падежам Библиотека функций.
Посмотри может подойдет.
Цитата(sax_ol @ 1:02:2008, 20:04 )
это трудновато, и врядли решаемо в общем случае.
*

Решаемо! Надо вооружится только правилами русского языка и вперед. Но задача точно не для начинающих
sax_ol
Цитата(European @ 2:02:2008, 13:20 )
Надо вооружится только правилами русского языка и вперед.

Как известно, в русском языке исключений из правил довольно много, может больше чем самих правил. smile.gif
Да и при чем тут имена, фамилии, отчества? В топике об этом ни слова ...
European
Цитата(sax_ol @ 2:02:2008, 13:37 )
Да и при чем тут имена, фамилии, отчества?
*

Во-первых, если посмотреть описание библиотеки там есть еще и изменение должности и подразделения.
Во-вторых, изменения по падежам в русском выражается изменением окончания, а указанная библиотека как раз это и анализирует.
В-третьих, лучше что-то, чем ничего. Да и условие задачи оставляет широкое поле для размышлений
sax_ol
Для: European
Это все понятно, но дело не в этом.
Во-первых, их еще распознать надо, это фамилия или суть, должность или действо: см топик. - "Пользователь вводит предложение"
Во-вторых, есть еще куча всяких оборотов и времен и еще куча всего, - в то время как пролетал, пролетел, улетел, пролетая ...
В-третьих, поэтому и задал уточняющие вопросы.
smile.gif
European
Цитата(sax_ol @ 2:02:2008, 14:15 )
Это все понятно, но дело не в этом.
*

Ждем топикстартера
sax_ol
Я к тому что, может проще будет, если пойти по пути какой-нибудь релевантности или т.п. Предполагаю(!) такие движки проще найти. Ну и естественно - "Ждем топикстартера".
Dimo444ka
Кароч нужно просто: пользователь к примеру вводит такое предложение:
'Сколько человек в группе №26' и из этого нужно по эталону выделить слова - 'сколько' 'человек' 'группа' '26'. Помоему это нужно просто каждое слово без окончания сравнить с эталоном, но как это написать? (я новичок)
Vadik(R)
Муторное конечно это занятие. Вообще, если при вводе предложения пользователь ограничивается небольшим количеством слов(там, меньше 20, например), то можно и самому составить. Например, если пользователь может использовать в своих предложениях только слова "сколько, человек, группа", то для твоей проги подойдёт, что-то типа такого решения:
Код
Const
  slovar = Array [1..3,1..6] of String=
  (('сколько', '', '', '', '', ''),
   ('человек', 'человека', 'человеку', 'человека', 'человеком', 'человеке'),
   ('группа', 'группы', 'группе', 'группу', 'группой', 'группе'));
Var
  sl : array [1..10] of string;
  st : string;
  i,n : integer;
Function Func(x : string) : string;
var
  i,j : integer;
begin
  func:='';
  for i:=1 to 3 do
  for j:=1 to 6 do
  if x=slovar[i,j] then
  begin
     func:=slovar[i,1];
     Exit
  end
end;
begin
  readln(st);
  while pos(' ',st)>0 Do
  Begin
     Inc(n);
     Sl[n]:=Copy(st,1,Pos(' ',st)-1);
     Delete(st,1,Pos(' ',st));
  End;
  Inc(n);
  Sl[n]:=st;
  For i:=1 To n Do
  If Func(sl[i])<>'' Then WriteLn(Func(st[i]));
  ReadKey
end.

Конечно, этот код я сейчас от руки набросал, но идеядумаю понятна. Однако, это только в том случае, если пользователь может использовать только какой определённый набор слов в своих предложениях.
Потому что, массив на 1000 слов ты печатать замучаешься.
Тебе будет проще придумать устройство, которое поключается к голове училки по русскому языку и использует ресурсы её мозга smile.gif Заодно и нобелевскую получишь smile.gif
zubr
Загнать словарь русского языка в БД. Дальше алгоритм простой - нашел нужное слово в словаре, нашел его именительный падеж.
Дима_Ламо
Хы, самое верное и простое решение... И не надо мучать себя, "изобретением велосипеда"...
sax_ol
Для: Дима_Ламо
ага, только запаришься его делать ...
zubr
Для: sax_ol
Вполне реально найти готовую БД-словарь и перегнать его в свою программно.
sax_ol
Для: zubr
Цитата(Dimo444ka @ 2:02:2008, 15:56 )
'Сколько человек в группе №26' и из этого нужно по эталону выделить слова - 'сколько' 'человек' 'группа' '26'.

Вы это видели?
Мне интересно посмотреть на базу, со всеми этими ... из #6.3
Или вы собираетесь определять что группе = группа, интересно как?
zubr
Для: sax_ol
Не могу точно утверждать (под рукой нет словаря), но насколько я помню, в русском словаре представлены слова во всех падежах. К примеру, в поиске ввели слово "человеком", БД выдает результат: человек, человека, человеком и т. д., причем именительный падеж будет первым. Имея файл (файлы) БД и зная структуры таблиц вполне можно использовать готовое решение, имхо.
European
Цитата(Dimo444ka @ 1:02:2008, 19:49 )
отобрать нужные по образцу слова
*

Можешь рассказать про это подробнее?
Dimo444ka
нуДля: European
найти из набора данных слов нужное
European
Цитата(Dimo444ka @ 4:02:2008, 21:38 )
найти из набора данных слов нужное
*

Ты хочешь конкретной помощи, пытаясь описать проблему общими словами?
Какой размер набора, какие части речи в наборе? Лично я думаю, что решить проблему можно анализом окончаний слов, "близких" к набору
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2008 IPS, Inc.