Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти корень слова 
:(
    Опции темы
Akella
Дата 12.1.2005, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



как найти корень слова?
Можно использовать пару словарей: 1-й это превиксов (пре, при и т.д.), 2-й суффиксов (ин, ен и т.д.), ну можно третий окончаний (ой, ай, ешь, ешь) и т.д.
А можно составлять ручками словарь корней.
Какие будут предложения?

Желательно, хоть кусочки примеров.

Это сообщение отредактировал(а) dsergey - 12.1.2005, 13:07
PM MAIL   Вверх
<Spawn>
Дата 12.1.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



dsergeyИМХО, нужно испоьзовать префиксы и суфиксы для вырезания корня, так как их будет значительно меньше чем корней(если я еще правильно помню русски, ой давно это было...)
Добавлено @ 13:20
Цитата
Желательно, хоть кусочки примеров.


Приведи пример слова, содержащего все составные элементы, так как я боюсь ошибиться, воспоминания какие то туманныеsmile) ...


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Akella
Дата 12.1.2005, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



при тяж ен ие
PM MAIL   Вверх
Rennigth
Дата 12.1.2005, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



100% алгоритм все равно скорее всего не составишь, в Великом Русском языке столько всяких исключений из правил... smile хотя идея прикольная.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
<Spawn>
Дата 12.1.2005, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Вот начало для твоей затеиsmile

Забиваешь массив преффиксов и суффиксов всеми существующими и начинаешь теститьsmile Скорее всего, будут исключения, но и для них можно будет что нить придумать, когда найдешьsmile

Код

uses ..., StrUtils, Math;

var
 Form1: TForm1;
 {Пустой элемент в массиве не уберай - он для упрощения кода извлечения корня}
 PreffixTable: array[0..3] of string = ('', 'пре', 'при', 'с');
 SuffixTable: array[0..1] of string = ('ен', 'ин');

implementation

{$R *.dfm}

{Самописная функция нахождения позиции, для поиска с любого конца строки}
function AnyDirectionalPos(const SubStr, Value: string; Offset: integer = 1): integer;
var
 Counter, OffsetCount, OldCounter,
 SubStrCounter, SubStrLen,
 StrLen, MoveDirection: integer;
 IsEqual: Boolean;
begin
 Result := 0;
 OldCounter := 0;
 SubStrCounter := 0;
 OffsetCount := 0;
 IsEqual := False;
 StrLen := Length(Value);
 SubStrLen := Length(SubStr);
 if Offset = 0 then
   Offset := 1;
 {Направление перемещения}
 MoveDirection :=  Sign(Offset);
 {Счетчик}
 Counter := IfThen(MoveDirection = - 1, Length(Value), 1);
 while (Counter >= 1) and (Counter <= StrLen) do
 begin
   if Value[Counter] = SubStr[1] then
   try
     OldCounter := Counter;
     SubStrCounter := 2;
     Inc(Counter);
     IsEqual := True;
     {Ищем подстроку}
     while (Counter <= StrLen) and (SubStrCounter <= SubStrLen) do
     begin
       if Value[Counter] <> SubStr[SubStrCounter] then
       begin
         IsEqual := False;
         Break;
       end;
       Inc(Counter);
       Inc(SubStrCounter);
     end;
     if IsEqual and (SubStrCounter > SubStrLen) then
     begin
       Inc(OffsetCount);
       {Наша ли это подстрока?}
       if OffsetCount = Abs(Offset) then
       begin
         Result := OldCounter;
         Break;
       end;
     end;
   finally
     Counter := OldCounter;
   end;
   Inc(Counter, MoveDirection);
 end;
end;

{Извлечение корня}
function ExtractRoot(const Word: string): string;
var
 PreffixIndex, SuffixPos,
 Counter, PreffixEnd: integer;
begin
 Result := '';
 PreffixIndex := 0;
 SuffixPos := 0;
 for Counter := 1 to High(PreffixTable) do
   if AnsiStartsText(PreffixTable[Counter], Word) then
   begin
     PreffixIndex := Counter;
     Break;
   end;
 for Counter := 0 to High(SuffixTable) do
 begin
   SuffixPos := AnyDirectionalPos(SuffixTable[Counter], LowerCase(Word), -1);
   if SuffixPos <> 0 then
     Break;
 end;
 PreffixEnd := Length(PreffixTable[PreffixIndex]) + 1;
 Result := Copy(Word, PreffixEnd, SuffixPos - PreffixEnd);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 ShowMessage(ExtractRoot('Притяжение'));
end;


Это сообщение отредактировал(а) <Spawn> - 12.1.2005, 14:39


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.