IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Замена слов по словарю, Простейший переводчик
Незнакомец
сообщение 29.08.2005 10:14
Сообщение #1


Гость






Здравствуйте. Не могли бы подсказать как сделать вот такую штуку: замешательство
в TMemo находится английский текст (например:
Цитата
Hello world

), как сделать так чо бы считывать слова и вставлять их перевод в др мемо из файла-словаря?
В файле слова находятса в таком виде:


..................
hello привет
..................
..................
world мир
...............



И результат получался бы типа такого:
Цитата
привет мир
 К началу страницы 
+ Ответить 
Altair
сообщение 29.08.2005 13:18
Сообщение #2


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


все просто. Надо сначала слова выделить в memo, как это сделать читай в FAQе нашем... далее все очевидно...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 30.08.2005 21:17
Сообщение #3


Гость






Цитата
Надо сначала слова выделить в memo

это, то есть считать их в массив, или я не правильно понял?
 К началу страницы 
+ Ответить 
Malice
сообщение 31.08.2005 9:22
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Н @ 30.08.05 22:17)
это, то есть считать их в массив, или я не правильно понял?


Я бы не стал выделять слова, т.к. потом после замены придется их опять в строку клеить, да и все знаки запятые и проч. потеряются. Проще читать построчно, искать вхождение каждого слова через Pos и сразу заменять.
Правда придется добавить проверку, чтобы не было замен внутри слов, но это прсто smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 31.08.2005 10:39
Сообщение #5


Гость






Цитата
Проще читать построчно, искать вхождение каждого слова через Pos и сразу заменять.
Правда придется добавить проверку, чтобы не было замен внутри слов


А как это сделать, можно пример?
 К началу страницы 
+ Ответить 
volvo
сообщение 31.08.2005 11:02
Сообщение #6


Гость






Вот тебе работающий набросок на FPC, просто добавь построчное чтение из Memo в строку S и измени процедуру Replace_Word так, чтобы она меняла переданное ей слово на соотв. слово из файла-словаря:

procedure replace_word(s: string);
begin
write('(-', s, '-)'); { <--- замени на вывод во второй Memo }
end;

var
s: string = 'this ::is a, text';
next_word: string;
i: byte;

begin
i := 1; next_word := '';
while i <= length(s) do begin
if upcase(s[i]) in ['A'..'Z'] then begin
next_word := next_word + s[i]; inc(i)
end
else begin
if next_word <> '' then replace_word(next_word);
write(s[i]); { <--- замени на вывод во второй Memo }
next_word := ''; inc(i);
end;
end;

if next_word <> '' then replace_word(next_word);

end.

Как видишь, все разделители сохраняются... Кстати, эту программку можно еще оптимизировать ;)
 К началу страницы 
+ Ответить 
Malice
сообщение 31.08.2005 11:19
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Н @ 31.08.05 11:39)
А как это сделать, можно пример?

Как то вот так:
for i:=1 to КолвоСловВсловаре do
for j:=0 to memo1.Lines.Count-1 do begin
p:=1;
while p>0 do begin
sT:=memo1.Lines.Strings[j]; p:=pos(word[i].en,st);
if p>0 then
memo1.Lines.Strings[j]:=copy(st,1,p-1)+word[i].ru+ copy(st,p+length(word[i].en),255);
end; end;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 31.08.2005 13:50
Сообщение #8


Гость






Цитата
построчное чтение из Memo в строку S

блин не получается сделать, и найти не могу как делать ... sad.gif
 К началу страницы 
+ Ответить 
Malice
сообщение 31.08.2005 13:53
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Н @ 31.08.05 14:50)
блин не получается сделать, и найти не могу как делать ... sad.gif


Ну так как у меня:
s:=memo1.Lines.Strings[j];

Строки нумируются с нуля.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 31.08.2005 13:56
Сообщение #10


Гость






For currLine := 0 To Pred(memo1.Lines.Count) Do Begin
s := memo1.Lines.Strings[currLine]
...
End;
 К началу страницы 
+ Ответить 
Н
сообщение 31.08.2005 15:10
Сообщение #11


Гость






volvo, Malice Спасибо... smile.gif
 К началу страницы 
+ Ответить 
Н
сообщение 31.08.2005 15:55
Сообщение #12


Гость






Цитата
Replace_Word так, чтобы она меняла переданное ей слово на соотв. слово из файла-словаря


Я открываю файл для чтения, а как дальше осуществить писк и замену S ?
 К началу страницы 
+ Ответить 
hiv
сообщение 1.09.2005 8:54
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Словарь лучше хранить в виде:
word=слово

Тогда чтение его и использование упрощается:
 var ER :TStrings;
. . .
// загрузка словаря
ER:=TStringList.Create;
ER.LoadFromFile('имя файла словаря');
. . .
// замена найденного английского слова на русское в переменной sw :string;
sw:=ER.Values[sw];
. . .

Вот и все. А как найти в строке все слова можно найти в FAQ.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 1.09.2005 21:46
Сообщение #14


Гость






Цитата
как найти в строке все слова можно найти в FAQ.


Пересмотрел FAQ несколько раз но ничего подобного не нашел sad.gif ...
 К началу страницы 
+ Ответить 
volvo
сообщение 1.09.2005 21:54
Сообщение #15


Гость






В каком FAQ-е искал? В Дельфийском? А в Паскалевском посмотреть не догадался? Синтаксис-то один и тот же smile.gif Вот тут (и в соседних постах) посмотри: FAQ: Строки

Хотя я тебе привел более подходящий для твоего случая алгоритм, сохраняющий все разделители, а функция из FAQ-а все разделители выбрасывает.
 К началу страницы 
+ Ответить 
Н
сообщение 2.09.2005 8:51
Сообщение #16


Гость






Цитата
Хотя я тебе привел более подходящий для твоего случая алгоритм, сохраняющий все разделители, а функция из FAQ-а все разделители выбрасывает.


Я просто хотел доделать твой алгоритм, что бы происходил поиск, слов из считанной строки, в словаре и их замена...
 К началу страницы 
+ Ответить 
hiv
сообщение 5.09.2005 8:17
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Смотри пост 13. Лучше всетаки сделать проверку, что английское слово не найдено, тогда оно остается неизменным в тексте:
var ER :TStrings;
. . .
// загрузка словаря
ER:=TStringList.Create;
ER.LoadFromFile('имя файла словаря');
. . .
// замена найденного английского слова на русское в переменной sw :string;
sw_rus:=ER.Values[sw];
if sw_rus='' then sw_rus:=sw;
. . .
// освобождаем память, занятую словарем
ER.Free;
. . .
PS: Не забудь, что в английском есть сокращения с использованием апострофа, а также он используется в именах собственных в притяжательном склонении.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Н
сообщение 5.09.2005 21:18
Сообщение #18


Гость






Собрал все в одно, вот что получилось:



procedure replace_word(next_word: string);
var next_word_rus: string;
ER :TStrings;

begin
ER:=TStringList.Create;
ER.LoadFromFile('voc.txt');
next_word_rus:=ER.Values[next_word];
if next_word_rus='' then next_word_rus:=next_word;
Memo2.Lines.Add(next_word_rus);
er.free

end;

procedure TForm1.Button1Click(Sender: TObject);

var
s, next_word: string;
i: byte;
currLine: integer;

begin
For currLine := 0 To Pred(memo1.Lines.Count) Do Begin
s := memo1.Lines.Strings[currLine];
i := 1; next_word := '';
while i <= length(s) do begin
if upcase(s[i]) in ['A'..'Z'] then begin
next_word := next_word + s[i]; inc(i)
end
else begin
if next_word <> '' then replace_word(next_word);
Memo2.Lines.Add(s[i]);
next_word := ''; inc(i);
end;
end;

if next_word <> '' then replace_word(next_word);
end; end;



а он выдает такие ошибки:

[Error] 123.pas(41): Undeclared identifier: 'Memo2'
[Error] 123.pas(41): Missing operator or semicolon

что не так?
 К началу страницы 
+ Ответить 
volvo
сообщение 5.09.2005 21:53
Сообщение #19


Гость






Цитата(Н @ 5.09.05 21:18)
а он выдает такие ошибки:

Ну, с этой ошибкой: " [Error] 123.pas(41): Undeclared identifier: 'Memo2' " довольно прозрачно: у тебя просто Memo2 принадлежит классу формы, но вот процедура replace_word - то не является методом этого класса, поэтому для нее Memo2 не существует...

А вот эта: " [Error] 123.pas(41): Missing operator or semicolon " исчезнет сама собой, как только будет исправлена первая, просто сейчас структура программы нарушена, и пока ее не восстановишь - дальше будут "наведенные" ошибки...
 К началу страницы 
+ Ответить 
hiv
сообщение 6.09.2005 8:17
Сообщение #20


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


blink.gif Я не зря ставил многоточия в своем примере! В твоей программе при проверке каждого слова будет каждый раз грузиться файл словаря - это просто не нужно делать! Перенеси чтение словаря до начала перевода всех слов, а его уничтожение (освобождение памяти Free) после всего перевода.


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 8.07.2025 18:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"