Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм для работы с большой базой, 20 000 синонимов - парсинг текста 
:(
    Опции темы
JSawyer
  Дата 28.12.2010, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.10.2010

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



Имеется большая (20 тысяч слов/фраз) база синонимов.

Нужно в заданном тексте делать замену слов/фраз на аналогичные синонимы.

Формат синонимов:
Код

is in a position to|is able to 
if this is the case|if so|if that is so
i will be able to|i can|i will
have a tendency to be|tend to be
happen|occur|take place
improvement|enchancment
и т.д.


Для примера текст:
Код
hm, i can do it!

преобразуется в:
Код
hm, {i will be able to|i can|i will} do it!


На тестовом количестве синонимов всё работает отлично:
Код

<?php

$textbody = "brief analyzing my mind and will not hurt infrequently softer fa";

$synonyms = array( 'take me back to the fact|job my memory|ring a bell in me|strike a cord in me ',
                   'you should not have any|you shouldn\'t have any|you should have no',
                   'will not do any harm|will not hurt|won\'t hurt' );
    
foreach( $synonyms as $syn ) {
    
    $words = explode('|', $syn );

    foreach ($words as $word) {
        preg_match("/[\s|\W]{0,1}".$word."[\W|_]/i", $textbody, $matches, PREG_OFFSET_CAPTURE);

        if ( isset($matches[0][1]) ) {
            if ($matches[0][1] == 0) $plus = 0;
            else $plus = 1;
        
            $part1 = substr($textbody, 0, $matches[0][1] + $plus);
            $part2 = substr($textbody, $matches[0][1] + $plus, strlen($word));
            $part3 = substr($textbody, $matches[0][1] + $plus + strlen($word));

            $textbody = $part1.md5($syn).$part3;break;
        }
    }
    $textbody = str_replace( md5($syn), '{'.$syn.'}', $textbody );
}

echo $textbody;

?>


Но уже на тысяче синонимов скрипт работает непростительно долго.
Пробывал загружать синонимы как из текстового файла (CSV), так и из БД (mysql) - результаты примерно одинаково плачевные.

Как решить проблему?

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



какого максимального размера может быть строка, в которой нужно совершить поиск?
в смысле, будет ли это строка или многострочный текст?

Это сообщение отредактировал(а) patap - 28.12.2010, 13:35


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
JSawyer
Дата 29.12.2010, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 15.10.2010

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



patap, исходный текст может быть большим. сами группы синонимов могут быть и словами и фразами
PM MAIL   Вверх
bigturtle
Дата 2.1.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 27.1.2009

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



Насколько, понял вы берете базу синонимов и по очереди проверяете, но появление...
Попробуйте, разбить текст на лексемы и проверять вхождения слова в базу, а потом двух слов в базу, а потом трех и уже с ними работайте.
PM MAIL   Вверх
phpsc
Дата 6.1.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 22.11.2010

Репутация: нет
Всего: 0



быть может стоит построить двоичное дерево поиска?
--------------------
Социальная сеть
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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