Замена слова в тесте на синоним.

Статус
В этой теме нельзя размещать новые ответы.

асс

Мой дом здесь!
Регистрация
13 Окт 2006
Сообщения
762
Реакции
230
Всех приветствую.
Подскажите пожалуйста как произвести замену на синонимы
У меня в базе есть 100 тысяч слов синонимов
например иван:ванька


и есть текст
к примеру
шел иван по дороге и жевал бублики.


как заменить слово иван на ванька?

Я знаю что текст надо разбить на массивы разбить по пробелам.
затем перебрать каждое слово текста с словом из базы и совпадения заменить.
Но как быть если база весит много.
Ведь памяти не хватит.
Может можно в базе искать сразу нужное слово как то?

буду очень благодарен тому кто подскажет.
Потом если сделаю поделюсь скриптом.
 
Мне кажется что 100 000 слов если их проиндексировать не так много.

Если все таки думаете что будет тормозить, предлагаю разбить весь словарь на несколько таблиц, по первой букве. Например все слова на букву А в одной таблице, буквы Б в другой и т.д. Узнаете на какую букву начинается искомое слово, и в соответствующей таблице ищете.
 
Всех приветствую.
Подскажите пожалуйста как произвести замену на синонимы
У меня в базе есть 100 тысяч слов синонимов
например иван:ванька
и есть текст к примеру "шел иван по дороге и жевал бублики."
...

Лучше для слова поместить в таблицу СУБД. Причем без "перестановок", т.е. чтоб если в таблице есть "иван:ванька", то чтоб в ней уже не было "обратного", т.е. "ванька:иван".

Вот код разбивки предложения на слова с сохранением структуры предложения, без кода обращения к СУБД:
 
Мне кажется что 100 000 слов если их проиндексировать не так много.

Если все таки думаете что будет тормозить, предлагаю разбить весь словарь на несколько таблиц, по первой букве. Например все слова на букву А в одной таблице, буквы Б в другой и т.д. Узнаете на какую букву начинается искомое слово, и в соответствующей таблице ищете.


Здесь важно составить правильный запрос и я думаю что даже миллион строк не будет пределом.
У меня один скрипт набирает базу до 2 миллионов.

сдесь нужно составить верный запрос, но вот как я незнаю:)
 
ТС, так все-таки используется БД или нет?
если нет, то можно попробывать такой код:
PHP:
<?php
$s = "шел иван по дороге  и  жевал бублики.";// строка, в которой нужно произвести замену
$slova=array("иван","мария");// тут все слова, к которым будут синонимы
$sinon=array("ванька","машка");// тут синонимы. Важно, чтобы каждому слову соответствовал синоним
// т.е. одинаковое количество элементов в массивах $slova и $sinon
$ns=str_replace($slova,$sinon,$s); // новая строка
echo $ns;
?>
 
Здесь важно составить правильный запрос и я думаю что даже миллион строк не будет пределом.
У меня один скрипт набирает базу до 2 миллионов.

сдесь нужно составить верный запрос, но вот как я незнаю:)

Самое главное чтобы поле которое вы пишете в where было проиндексировано.

select word, synonim from table_words where word = 'иван';

поле word в таблице table_words должно быть проиндексировано.
 
ТС, так все-таки используется БД или нет?
если нет, то можно попробывать такой код:
PHP:
<?php
$s = "шел иван по дороге  и  жевал бублики.";// строка, в которой нужно произвести замену
$slova=array("иван","мария");// тут все слова, к которым будут синонимы
$sinon=array("ванька","машка");// тут синонимы. Важно, чтобы каждому слову соответствовал синоним
// т.е. одинаковое количество элементов в массивах $slova и $sinon
$ns=str_replace($slova,$sinon,$s); // новая строка
echo $ns;
?>



у меня есть скрипт который работает без базы но там 200 кб.
Он нормально работает. А вот если я подключаю к нему базу синонимой на 6 мб. То он умирает так как ему надо памяти 200 и больше мб.

По этому мне кажеться что если будет sql база
то легче будет вынуть нужное из таблицы.
Хотя возможно и ошибаюсь.


Реально сделать поиск совпадений с замоной из текстового файла размером 6 и более мб ?
 
сгенерил список слов и синонимов этим скриптом:
PHP:
<?php
$in=fopen("slov.txt","w");
$out=fopen("sinon.txt","w");
for($q=0;$q<1000000;$q++){
fwrite($in,$q." ");
fwrite($out,$q."qwerty ");
}
?>
т.е. 1 млн синонимов(~12 мб).

прогнал через этот скрипт
PHP:
<?php
$text="1 ushel 2 ne prishel 999 netu ";
$in=file_get_contents("slov.txt");
$in=explode(" ",$in);
$out=file_get_contents("sinon.txt");
$out=explode(" ",$out);
echo str_replace($in,$out,$text);
?>
Работает норм, но 2 недостатка: 1)выполняется долговато(у меня ~5сек) 2)заменяет первое попавшееся слово, т.е. вместо того, чтобы заменить 999 на 999qwerty, заменит 3 раза 9 на 9qwerty
 
сгенерил список слов и синонимов этим
Работает норм, но 2 недостатка: 1)выполняется долговато(у меня ~5сек) 2)заменяет первое попавшееся слово, т.е. вместо того, чтобы заменить 999 на 999qwerty, заменит 3 раза 9 на 9qwerty


Но выходит что у вас меняет любое совпадение даже не полное.
если будет слово 777вася

он найдет 777 и заменит его на 888.

это ведь немного не верно. нужно чтоб он нашел именно слово 777вася и потом манял его на вася888

тоесть слово должно меняться полностью а не его часть.
Или может я Вас не так понял?
 
Да, именно это я и имел ввиду.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху