Как искать слова в тексте?
Программа ищет в тексте слова. Существительные и прилагательные.
Делает она это так: берет слово, сравнивает со всей таблицей существительных и со всей тблицей прилагательных.
И так все слова.
Каждое слово прогоняет по таблицам.
Получается очень долго, на больших объемах текста программа виснет.
А это только поиск пар существительное + прилагательное в мужском роде. А сюда же надо добавить женский, средний, множественное число. А как добавлять, если виснет на одном мужском.
кто-нибудь знает, как это можно сделать иначе?
(звиняйте, не знаю, как вставить код в формате кода РНР, и возможно ли это)
<?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
// это расстояние и есть пара слов которая должна
// попасть в базу после проверки на то что ранее не добавляли
// может помечать что автоматическое добавление
}
}
?>
Aagira 3 года назад #
Не переписать ли тебе всю программу так, чтобы в базе данных были записаны только морфемы, а программа бы составляла из них слова? Но это, наверно, придется уже переписывать все.
Принцип такой. В БД отдельно — основы слов, окончания прилагательных, суффиксы, глагольные окончания и пр.
Программа выбирает основу и то, чего ей надо получить. Например, основа красн-, дальше если прилагательное, то подбирает либо -ый, либо -ая, либо -ое, либо в падеже окончание. Или если глагол «краснеть», то к основе прибавляется суффикс -е- (означающий приобретение некоего свойства) и глагольное окончание (-ть). А там можно было бы и постфикс и префикс добавить, и много чего… Короче, исходить из словообразовательного принципа, а не словарного.
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
Но как это сделать?
Тупо перебирать — если первая А, ищи первую А, если Б…
не то.
Ищи в таблице слово, где символ номер 1 такой же как символ номер 1 в тексте? Так вроде в тексте пронумерованы несколько иначе… или так…
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
если первая А, ищи слова на А
или как-то иначе, обобщенно, ищи слова, где первая буква совпадает… как это на РНР… не врубаюсь, что добавить в программу
(блин, щека и челюсть болит невыносимо, невралгия, — зимой была из-за дубака на фабрике, сейчас из-за вакцины и тупо на нервной почве уже меня эта фабрика сраная доканает)
Вот тут, что ли, добавить какой-нибудь 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;
}
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
Мария Фомальгаут 3 года назад #
Другим… а каким?
Aagira 3 года назад #
Не помню даже, в связи с чем я это делала и делала ли.
Мария Фомальгаут 3 года назад #
Aagira 3 года назад #
<>
Ну или просто между тегами <_code_><_/code_> (убрав подчеркивания между угловыми скобками и содержимым тега).
Мария Фомальгаут 3 года назад #
XblTb 3 года назад #
Сделать не одну таблицу слов (сущ., прил.), а несколько по первой букве слова.
Тогда смотрим первую букву слова из текста и ищем слово в уже маленькой табличке.
Мария Фомальгаут 3 года назад #
(как же не хочется делать до фига таблиц… но другого выхода пока не вижу...)
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
А нет, вру, еще есть таблицы на существительные по падежам. Да и на прилагательные по падежам делать придется.
Aagira 3 года назад #
Мария Фомальгаут 3 года назад #
Aagira 3 года назад #
На крайний случай, если там кроме слов ничего нет, то хватило бы и столбцов по буквам.