За последние 24 часа нас посетили 22277 программистов и 1029 роботов. Сейчас ищут 611 программистов ...

Как по умному доработать синонимайзер, написанный на PHP?

Тема в разделе "PHP для новичков", создана пользователем Medvedoc, 17 мар 2018.

  1. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    Здравствуйте! Нашел в просторах интернета примерный код синонимайзера. Немного доработал его, но несколько проблем осталось.
    Если например в базе синонимов есть слово телефон и слово он, то при синонимизации в слове телефонпоследние две буквы меняются, поскольку окончание он воспринимается видимо как слово. Как это можно обойти?
    И вторая проблема - не знаю как лучше сделать синонимизацию. Если в словаре мало слов, то она нормально проходит. Но если слов становится больше, то синонимизация не работает на всю глубину существующих синонимов на одно слово.

    Проверка проводилась на банальной фразе Мобильный телефон Samsung. Обменяю на новый iphone.

    код синонимайзера:
    PHP:
    1. <?php
    2.     function synonimize($str, $repl_array){
    3.         $keys = array_map(function($key){
    4.             return '#'.$key.'#ui';
    5.         }, $repl_array);
    6.  
    7.         foreach ($keys as $i=>$key) {
    8.             $str = preg_replace_callback($key, function ($match) use ($repl_array, $i) {
    9.                 $syns = explode('|', $repl_array[$i]);
    10.                 array_splice($syns, array_search(mb_strtolower($match[0]), array_map('mb_strtolower', $syns)), 1);
    11.                 return $syns[rand(0, count($syns) - 1)];
    12.             }, $str);
    13.         }
    14.         echo preg_replace_callback('~(?:^|\.\s*)\w~u', function($m) {
    15.             return mb_strtoupper($m[0]);
    16.         }, $str);
    17.     }
    18.    
    19.     $str2 = $prefixes[mt_rand(0,count($prefixes)-1)]; //тут можно просто вставить сам текст
    20.     $repl_array2 = "dictionary.txt"; //база с синонимами
    21.     $repl_array3 = file($repl_array2);
    22.    
    23.     for ($x=0; $x<5;$x++){
    24.         echo synonimize($str2,$repl_array3).'<br>';  
    25.     }
    26. ?>
    код базы:
    Код (Text):
    1. ты|он|сам|такой крутой|деловой|навороченный|блатной cотовый телефон|мобилка|cобильник|aага|nелефон|cотовый|мобильный телефонsamsung|Самсунг|LG|Nokia новый|новенький|обновленный|хороший обменяю|отдам|разменяю|поменяю|дам в размен Iphone|Айфон|IP|Nokia 3210
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Medvedoc ну как бы формат словаря я бы сказал не совсем удачный.. не проще хранить слова попарно и уже от этого плясать?
     
  3. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    А можете пояснить подробнее? Мне просто нужно, чтобы слова менялись синонимами цельно, а не частями
    Сейчас получается так, что если в словаре есть два слова с синонимами

    он|ты|они
    телефон|мобильник|сотовый

    то в слове телефон окончание он воспринимается как слово и меняется на синоним. Мне просто надо обойти эту проблему.
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Medvedoc то есть цельно?
    я имел ввиду типа есть база вида:
    наваждение - сон
    сон - мечта
    мечта - стремление

    и выводить некоторое количество вложеных синонимов.
    вот к примеру можешь глянуть схожую реализацию http://sociation.org/
     
  5. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    Увы - это не совсем то =(((
    Мне придется в таком случае собирать базу синонимов подобным образом. А словарь будет у меня узкопрофильный.
    Может есть вариант как-то решить проблему иначе?
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @Medvedoc ну если дело только в "он" то производи поиск с добавлением разделителя "|он|","он|","|он" или регуляркой, или опять таки менять формат словаря. я бы в качестве словаря рекомендовал юзать бд. так пхп плохо работает с большими файлами
     
  7. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    в том-то и дело, что не только в этом слове дело. Оно происходит всегда с подобными ситуациями.

    Насколько я понял проблема зарыта в этом кусочке кода
    PHP:
    1. $keys = array_map(function($key){
    2.             return '#'.$key.'#ui';
    3.         }, $repl_array);
    Получается через регплейс по регулярке меняется одно значение на другое. В качестве регулрки выступает как раз это кусочек кода. Но никак не пойму почему меняется часть слова, а не слово целиком.