Как искать слова в тексте?

Программа ищет в тексте слова. Существительные и прилагательные. 

Делает она это так: берет слово, сравнивает со всей таблицей существительных и со всей тблицей прилагательных.

И так все слова.

Каждое слово прогоняет по таблицам.

Получается очень долго, на больших объемах текста программа виснет.

А это только поиск пар существительное + прилагательное в мужском роде. А сюда же надо добавить женский, средний, множественное число. А как добавлять, если виснет на одном мужском. 

кто-нибудь знает, как это можно сделать иначе?

(звиняйте, не знаю, как вставить код в формате кода РНР, и возможно ли это)

<?php
require('db.php');
?>

<?php
$data = $_POST;
?>

 

<html>
<body>

<form id="find_words_from_DB" action='find_words_from_DB.php' method="POST" style="height: 200px;">
<fieldset id="inputs">
<input name="adress" placeholder="Адрес поиска" required type="text" value= "http://sujet.cc61800-drupal.tw1.ru/Reader.php">
</fieldset>
<fieldset>
<input type="submit" id="submit" name="do_find" value="Поиск">
</fieldset>

</form>
</body>
</html>

 

<?php
// функция копирования контента с сайта
function file_to_str($st_search)
{
$syte_data = file_get_contents("$st_search");
// $syte_data = iconv( "cp1251","UTF-8", $syte_data); //cp1251
$syte_data = $syte_data.'.'; // добавляем на всякий пожарный при поиске если не будет конца предложения
return $syte_data;
}

function select_words_to_arr_from_DB($link, $table_name, $id_name, $col_name)
{
$sql = "SELECT ".$id_name.",".$col_name." FROM ".$table_name." ORDER BY ".$col_name.";";
$res = mysqli_query($link, $sql);
$data = mysqli_fetch_all($res, MYSQLI_ASSOC);
//var_dump($data);
//while ($row = $res->fetch_array())
// $result[] = $row[0];
return $data;
}

// Функция добавления пары слов сущ, прил в БД
function insert_to_BD($link, $sush, $sush_ind, $pril, $pril_ind)
{
// необходимо перед добавлением проверить нет ли такой же пары в БД

$sql = "INSERT INTO `Hero_prilag` (`sush_name`, `Index_hero1`, `pril_name`, `Index_prilag1`) VALUES ('".$sush."','".$sush_ind."','".$pril."', '".$pril_ind."');";
// echo $sql;
$res = mysqli_query($link, $sql);
// echo "OK";
}

function search_ch_rechi($string)
{
$C_S = 0;
$C_P = 0;
foreach ($string as $i)
{
if ($i === 'P')
{$C_P++;}
if ($i === 'S')
{$C_S++;}
}
if ($C_S * $C_P == 1)
echo "SUSH_PRIL".$C_S." ".$C_P."<br>";

return $C_S * $C_P; // для проверки на не нулевое количество P и S
}

function select_all_strings($text)
{
// разделители предложений
$prep = ".,!:?;<>=-";

// находим предложения
$i = 0;
$len_text = strlen($text);
$strings = array();

while ($i<$len_text)
{
$next_string = "";
while (strpos($prep, $text[$i]) === false)
{
$next_string = $next_string.$text[$i];
$i++;
if ($i>=$len_text) break;
}

if ($next_string != "") array_push($strings, $next_string);
$i++;
}

return $strings;
}

function select_words_in_strings($array_of_strings)
{
$len_arr = count($array_of_strings);
// echo $len_arr;

// алфавит из которого состоят наши слова
$alfavit = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";

$out_arr = array();
// создаем 2мерный массив
for ($i=0; $i<$len_arr; $i++)
{
$p = array();
array_push($out_arr, $p);
}

$i = 0;
while ($i<=$len_arr)
{
$next_word = "";

$len_string = strlen($array_of_strings[$i]);

//log //echo $array_of_strings[$i]."123<br>";
$j = 0;
while ($j <= $len_string)
{
//log //echo $next_word."123<br>";
if ($next_word != "")
array_push($out_arr[$i], $next_word);
$next_word = "";

if (!empty($array_of_strings[$i][$j]))
while (strpos($alfavit, $array_of_strings[$i][$j]))
{
$next_word = $next_word.$array_of_strings[$i][$j];
$j++;
//log //echo $next_word."aaa<br>";
if ($j >= $len_string)
{
array_push($out_arr[$i], $next_word);
break;
}
}
$j++;
}
$i++;
}
return $out_arr;
}


if (isset($data['do_find']) )// если кнопка нажата
{
$syte_data = file_to_str($data['adress']);
// ""; $data['adress']//параметр функции название файла или сайта,
//"test.txt" //в котором нужно найти (если нужно, то еще пропишите путь к файлу)
//log //echo $syte_data;

// получение массива слов из БД
//log //echo count(select_words_to_arr_from_DB($link, "Proba_prilag", "Проба_прилаг"));



$sush_from_DB = select_words_to_arr_from_DB($link, "Hero", "Index_man", "Герой");
$pril_from_DB = select_words_to_arr_from_DB($link, "Prilagatelnye", "Index_pril", "Прилагательное");
// $pril1_from_DB = select_words_to_arr_from_DB($link, "Prilagatelnye_F", "Index_pril_F", "Прилагательное_ф");
// $pril2_from_DB = select_words_to_arr_from_DB($link, "Prilagatelnye_Mn", "Index_pril_Mn", "Прилагательное3");
// $pril3_from_DB = select_words_to_arr_from_DB($link, "Prilagatelnye_N", "Index_pril_N","Прилагательное2");


//log //echo "<BR>";var_dump($pril_from_DB);

// получение всех частей предложений
// получение всех строк с сайта в массив
$all_strings = select_all_strings($syte_data);
//log //
//echo "<BR>ALL STRINGS<BR>";
//var_dump($all_strings);

// получение всех слов с сайта в массив
$arr_of_words = select_words_in_strings($all_strings);
//log //
//echo "<BR>ARR OF WORDS<BR>";
//var_dump($arr_of_words);

// тут попытка сравнить со словами из $sush_from_DB

echo "<BR><BR><BR><BR>";

// цикл перебора всех слов
for ($i=0; $i<count($arr_of_words); $i++)
{
$pril = "";
$pril_ind = -1;
$sush = "";
$sush_ind = -1;
$razbor = array();

// поиск прилагательных пока только мужского рода
// надо проверять еще другие роды (3 таблицы)
for ($j=0; $j<count($arr_of_words[$i]); $j++)
{
$flag = 0;

foreach ($pril_from_DB as $s)
{
//var_dump( $s);
// mb_strtolower - перевод слова к нижнему регистру
if (mb_strtolower($arr_of_words[$i][$j])===$s['Прилагательное'])
{
//echo "I find pril ".$s." at ".$i." ".$j.
//" in the ".$all_strings[$i]."<br>";
$pril = $s['Прилагательное'];
$pril_ind = $s['Index_pril'];
$flag = 1;
}
//echo $s."\n";
}
//echo $arr_of_words[$i][$j]."\n";


if ($flag == 1)
$razbor[$j] = 'P';
}

// цикл поиска существительных
for ($j=0; $j<count($arr_of_words[$i]); $j++)
{
$flag = 0;
foreach ($sush_from_DB as $s)
{
if (mb_strtolower($arr_of_words[$i][$j])===$s['Герой'])
{
//echo "I find sush ".$s." at ".$i." ".$j.
//" in the ".$all_strings[$i]."<br>";
$sush = $s['Герой'];
$sush_ind = $s['Index_man'];
$flag = 1;
}
//echo $s."\n";
}

if ($flag == 1)
array_push($razbor, 'S');
else
array_push($razbor, '0');
}


//log echo "RAZBOR ";//
//var_dump ($razbor);

// если в массиве есть и P и S
//if (search_ch_rechi($razbor)!=0)
{

}

if (search_ch_rechi($razbor) != 0)
{
var_dump ($arr_of_words[$i]);
//for ($q = 0; $q<count($arr_of_words[$i]); $q++)
echo $arr_of_words[$i][$q];
echo $sush." < - > ".$pril;
echo "<br>";
/// попытка добавить строку в БД
//insert_to_BD($link, "QWERTY");
/// попытка добавить строку в БД
insert_to_BD($link, $sush, $sush_ind, $pril, $pril_ind);
}

// поиск минимального расстония между P и S
// это расстояние и есть пара слов которая должна
// попасть в базу после проверки на то что ранее не добавляли
// может помечать что автоматическое добавление

}
}
?>

19:48
224




21:53
Мысль такая… дикая.
Не переписать ли тебе всю программу так, чтобы в базе данных были записаны только морфемы, а программа бы составляла из них слова? Но это, наверно, придется уже переписывать все.

Принцип такой. В БД отдельно — основы слов, окончания прилагательных, суффиксы, глагольные окончания и пр.

Программа выбирает основу и то, чего ей надо получить. Например, основа красн-, дальше если прилагательное, то подбирает либо -ый, либо -ая, либо -ое, либо в падеже окончание. Или если глагол «краснеть», то к основе прибавляется суффикс -е- (означающий приобретение некоего свойства) и глагольное окончание (-ть). А там можно было бы и постфикс и префикс добавить, и много чего… Короче, исходить из словообразовательного принципа, а не словарного.
00:01
Если по конкретно этой задаче надо, то есть мысля. Попробуй найти какой-нибудь WYSIWYG-редактор с проверкой правописания (только чтоб синтаксис и пунктуация тоже входили). Такой, где подчеркиваются не только слова, но и, например, неполные (по мнению редактора) предложения. Код такого редактора, правда, будет, скорее всего, с применением явы, но принцип там нарыть будет можно. Если, конечно, такие редакторы есть. Лучше было бы поискать, как это осуществляется в ворде и подобных сложных программах.
У меня еще мысль, может быть возможно как-то по буквам искать. Например, видит слово красный, начинает с первобй буквы, перебирает уже не всю базу данных, а только слова на К, следующая Р — значит, из того, что осталось, перебирает слова, где вторая Р… Даже если сделать ограничение на две первые буквы, уже пойдет быстрее.
Но как это сделать?
Тупо перебирать — если первая А, ищи первую А, если Б…
не то.
Ищи в таблице слово, где символ номер 1 такой же как символ номер 1 в тексте? Так вроде в тексте пронумерованы несколько иначе… или так…
12:23
Ну это мы обсуждали уже. Это мое предложение было. Но как ворд и ему подобные находят связи между словами? Мне самой уже интересно.
Только я не помню, как ты предложила решить этот вопрос, конкретно как перебирать слова.
12:30
Вот так и предложила: первая буква, вторая…
Да, но как именно:
если первая А, ищи слова на А
или как-то иначе, обобщенно, ищи слова, где первая буква совпадает… как это на РНР… не врубаюсь, что добавить в программу
(блин, щека и челюсть болит невыносимо, невралгия, — зимой была из-за дубака на фабрике, сейчас из-за вакцины и тупо на нервной почве уже меня эта фабрика сраная доканает)
Вот тут, что ли, добавить какой-нибудь WHERE…
function select_words_to_arr_from_DB($link, $table_name, $id_name, $col_name)
{
$sql = «SELECT ».$id_name.",".$col_name." FROM ".$table_name." ORDER BY ".$col_name.";";
$res = mysqli_query($link, $sql);
$data = mysqli_fetch_all($res, MYSQLI_ASSOC);
//var_dump($data);
//while ($row = $res->fetch_array())
// $result[] = $row[0];
return $data;
}
12:47
Это надо в скайпе рыть, я вроде ссылки кидала там на решение аналогичных проблем.
Рою, рою скайп, что-то вообще не вижу… пока только как под кота подложили свинью, под свинью пхп, под пхп кота…

как-то так: WHERE name LIKE ' а%' — пробел, потом вместо а — что угодно, что стоит в тексте, потом %

2х2 18:29
погоди. я другим методом делала.


Другим… а каким?
13:43 (отредактировано)
Где-то дальше во флуде, наверное…
Не помню даже, в связи с чем я это делала и делала ли.
Вот-вот, мне кажется, этого там нет…
13:48 (отредактировано)
Насчет вставки кода в текст. Кнопка кода выглядит обычно так:

<>

Ну или просто между тегами <_code_><_/code_> (убрав подчеркивания между угловыми скобками и содержимым тега).
спасибо, буду знать.
12:42
Как вариант.
Сделать не одну таблицу слов (сущ., прил.), а несколько по первой букве слова.
Тогда смотрим первую букву слова из текста и ищем слово в уже маленькой табличке.
Спасибо, хороший вариант.
(как же не хочется делать до фига таблиц… но другого выхода пока не вижу...)
13:40
А сколько таблиц сейчас?
13:43 (отредактировано)
На существительные одна. На прилагательные три — мужской род, женский, средний, множественное число.
А нет, вру, еще есть таблицы на существительные по падежам. Да и на прилагательные по падежам делать придется.
14:05
Я про всю базу.
Несколько десятков
14:08 (отредактировано)
Вообще не вижу смысла. БД не из «маленьких табличек» все равно состоит. Разбиение на таблицы — чисто визуально, а в целом там общий текст.
На крайний случай, если там кроме слов ничего нет, то хватило бы и столбцов по буквам.

Загрузка...












Все представленные на сайте материалы принадлежат их авторам.

За содержание материалов администрация ответственности не несет.


Рейтинг@Mail.ru