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

Тема в разделе "PHP", создана пользователем асс, 6 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo, t3s
  1. асс

    асс

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


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


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

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

    буду очень благодарен тому кто подскажет.
    Потом если сделаю поделюсь скриптом.
     
  2. e64f

    e64f Постоялец

    Регистр.:
    2 ноя 2008
    Сообщения:
    95
    Симпатии:
    6
    Мне кажется что 100 000 слов если их проиндексировать не так много.

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

    pavel012007

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

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

    PHP:
    $s "шел иван по дороге  и  жевал бублики.";
    echo 
    $s;

    echo 
    "<hr>\n";

    $words preg_split("/([^[:alnum:]\.,?!\-%])+/s"$s);
    // в результате $s разбито на слова, возможно в конце 
    // некоторых слов содержатся знаки препинания "?!.," 
    // они нужны чтоб восттановить структуру предложения после 
    // синонимизации

    // для отладки:
    for($i 0$i count($words); $i++) { 
    echo 
    "'".$words[$i]."' ";
    }

    // цикл по все словам предложения
    for($i 0$i count($words); $i++) { 
      
    $lch $words[$i][strlen($words[$i])-1]; // последний символ i-го слова
      
    if (strpos("?!.,"$lch) === false) {
        
    $w $words[$i];
      }
      else { 
        
    $w str_replace($lch""$words[$i]); // уничтожаем знак препинания
      
    }
      
    // в таблице субд:
      // найти по $w запись, прочитать из неё синоним $syn
      // заменить в $words все $w на $syn, добавив при необходимости в
      // конце $syn знаки препинания исходного предложения
    }

    // для отладки: синонимизированное предложение
    for($i 0$i count($words); $i++) { 
    echo 
    "'".$words[$i]."' ";
    }
     
  4. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    721
    Симпатии:
    214

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

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

    PapaJoe

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

    e64f Постоялец

    Регистр.:
    2 ноя 2008
    Сообщения:
    95
    Симпатии:
    6
    Самое главное чтобы поле которое вы пишете в where было проиндексировано.

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

    поле word в таблице table_words должно быть проиндексировано.
     
  7. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    721
    Симпатии:
    214


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

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


    Реально сделать поиск совпадений с замоной из текстового файла размером 6 и более мб ?
     
  8. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    614
    Симпатии:
    291
    сгенерил список слов и синонимов этим скриптом:
    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
     
  9. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    721
    Симпатии:
    214

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

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

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

    тоесть слово должно меняться полностью а не его часть.
    Или может я Вас не так понял?
     
  10. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    614
    Симпатии:
    291
    Да, именно это я и имел ввиду.
     
Статус темы:
Закрыта.

Поделиться этой страницей