Поиск из файла
Здравствуйте! Опять проблемы с поиском. С поиском заданных слов в файле разобралась в разных вариациях. Но никак не могу сообразить как сделать наоборот:
Есть текстовый файл в нем строки-словосочетания, есть заданное предложение, как сделать поиск совпадений не в файле, а из файла, именно в таком порядке, связанно это с тем, что заданное предложение может быть длинным, а словосочетания на порядок короче, поэтому вариант поиска предложения в файле не подходит. А поиск в предложении на наличие словосочетаний, то что нужно. Как перебрать массив строк файла на предмет совпадения вхождений в предложении? |
Sonya,
есть готовые решения для этого, ищите в сети, подключайте и используйте. А вообще, что вы уперлись в файлы, есть БД, а в них есть полнотекстовый поиск, логику которого можно задавать. |
С БД только начала разбираться. А готовых решений не нашла, поэтому и написала на форуме.
|
Значит не можете конкретизировать свой поисковый запрос.
Если: предложение - "А Б вгде Ж З" словосочетания - "А Б", "Ж З" то обходом в цикле массива словосочетаний ищем их в предложении. Если: предложение - "А Ж вгде З Б" словосочетания - "А Б", "Ж З" и тоже нужно найти, то тоже самое, но с добавлением логики поиска И/ИЛИ Видимо у вас структуры управляющие/хранимые не очень удачно построены, что требуются такие затратные операции. |
Никак не получается
|
Покажите пример того что искать и в чем искать.
|
$search = 'поиск слов'; $lines = file('text.txt'); foreach($lines as $num_line => $line_value) { if(strpos($line_value, $search) !== FALSE) echo "$num_line $line_value<br>"; } Так я ищу словосочетание в текстовом файле text.txt. Содержание текстового файла: поиск слов поиск предложений поиск слова поисковик поиск словечек поиск словосочетаний поиски словечек Естественно, все находит, но никак не могу сделать, чтобы процесс был обратным, чтобы из файла искал при том, чтобы выводил и номера строк совпадений. |
Цитата:
Если поиск, это есть точное сопоставление строк $search и $line_value, то не strpos($line_value, $search), а array_keys() с параметром поиска, цикл при этом не нужен. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
"поиск словосочетаний" при $search = "поиск слов". |
Цитата:
|
Заведомо зная, что так не правильно, но тем не менее:
$search = 'поиск слов'; $lines = file('text.txt'); mb_internal_encoding("UTF-8"); foreach($lines as $num_line => $line_value) { if(mb_stripos($search, $line_value) !== FALSE) echo "$num_line $line_value<br>"; } Конечно же не получилось, но как тогда? |
C trim($line_value) получилось.
|
Цитата:
В таком случае почитать это https://habrahabr.ru/post/115394/ |
Да, но приведенный мною изначально код, находит это и без этого. А так для поиска склонений, я использую это:
class Lingua_Stem_Ru { private $VERSION = "0.02"; private $unset_predlog = true; private $Stem_Caching = 0; private $Stem_Cache = array(); private $VOWEL = '/аеиоуыэюя/u'; private $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=[ая])(в|вши|вшись)))$/u'; private $REFLEXIVE = '/(с[яь])$/u'; private $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/u'; private $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)))$/u'; private $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$/u'; private $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/u'; private $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/u'; private $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[аеиоуыэюя].*(?<=о)сть?$/u'; private $PREDLOG = '/(^|\s)(и|для|в|на|под|из|с|по)(\s|$)/u'; private function s(&$s, $re, $to) { $orig = $s; $s = preg_replace($re, $to, $s); return $orig !== $s; } private function m($s, $re) { return preg_match($re, $s); } public function stem_string($words) { $word=explode(' ',$words); for ($i=0;$i<count($word);$i++) { if ($this->unset_predlog === TRUE) $word[$i] = preg_replace($this->PREDLOG, '', $word[$i]); $word[$i]=$this->stem_word($word[$i]); if(empty($word[$i])) unset($word[$i]); } return implode(' ',$word); //if you need return array change on -> return $word; } private function stem_word($word) { mb_regex_encoding( 'UTF-8' ); mb_internal_encoding( 'UTF-8' ); $word = mb_strtolower($word); $word= str_ireplace('ё', 'е', $word); # Check against cache of stemmed words if ($this->Stem_Caching && isset($this->Stem_Cache[$word])) { return $this->Stem_Cache[$word]; } $stem = $word; do { if (!preg_match($this->RVRE, $word, $p)) break; $start = $p[1]; $RV = $p[2]; if (!$RV) break; # Step 1 if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) { $this->s($RV, $this->REFLEXIVE, ''); if ($this->s($RV, $this->ADJECTIVE, '')) { $this->s($RV, $this->PARTICIPLE, ''); } else { if (!$this->s($RV, $this->VERB, '')) $this->s($RV, $this->NOUN, ''); } } # Step 2 $this->s($RV, '/и$/', ''); # Step 3 if ($this->m($RV, $this->DERIVATIONAL)) $this->s($RV, '/ость?$/', ''); # Step 4 if (!$this->s($RV, '/ь$/', '')) { $this->s($RV, '/ейше?/', ''); $this->s($RV, '/нн$/', 'н'); } $stem = $start.$RV; } while(false); if ($this->Stem_Caching) $this->Stem_Cache[$word] = $stem; return $stem; } private function stem_caching($parm_ref) { $caching_level = @$parm_ref['-level']; if ($caching_level) { if (!$this->m($caching_level, '/^[012]$/')) { die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value"); } $this->Stem_Caching = $caching_level; } return $this->Stem_Caching; } public function clear_stem_cache() { $this->Stem_Cache = array(); } } $stemmer=new Lingua_Stem_Ru(); $words=$stemmer->stem_string($words); |
Цитата:
|
Да, для той задачи где я использовала этот код, нужен был именно корень.
Здесь же я его привела, как пример, того что искать и в чем искать. Огромное спасибо Вам за урок. |
Цитата:
|
Если я ищу словосочетание "поиск слов" приведенный в примере, то он найдет в словосочетании "поиск словесных выражений", т.к. корень "слов", также как и в "поиск слова", и "поиск слово".
|
Цитата:
Работает? И слава богу. |
Да, спасибо, работает!
Может мы о разных кодах говорим? Но с самого начало я указывала именно, что $search = 'поиск слов'; |
Цитата:
Насчет строго, надо чтобы находил и "поиск слова", и "поиск словечек", и "поиск словосочетаний" при $search = "поиск слов". А еще говорилось о том, что операция подразумевает и обратное, тогда поиск слова нельзя найти. От этого видимо недопонимание и путаница. |
Наверное, все-таки Вы не так меня поняли, или я неправильно объяснила (что скорее всего). Код был приведен для примера (хотя он и рабочий), из которого я пыталась сделать обратный процесс. Но он никак не связан с той задачей, которую я пыталась решить. Просто от этого кода я отталкивалась.
То, что я писала: "Насчет строго, надо чтобы находил и "поиск слова", и "поиск словечек", и "поиск словосочетаний" при $search = "поиск слов"." - это к тому коду, и к той задачи, которая уже решена, но поскольку Вы написали, что это можно решить по другому, используя array_keys(), то в этом контексте и пошел разговор о том коде. |
Часовой пояс GMT +3, время: 09:59. |