Создание простой поисковой системы на основе текстового файла

Мне нужно создать простую текстовую поисковую систему как можно скорее (используя PHP)! В основном он должен читать файлы в каталоге, удалять стоп и бесполезные слова, индексировать каждое оставшееся полезное слово, сколько раз оно появляется в каждом документе.

Я предполагаю, что псевдокод для этого:

  для каждого файла в каталоге:
     читать содержимое,
     сравнить с остановкой слов,
     добавьте каждое оставшееся слово в массив,
     сколько раз это слово появляется в документе,
     добавьте это число в массив,
     добавьте id / name файла в массив, 

также необходимо подсчитать общее количество слов (после бесполезного удаления, я думаю) во всем файле, что может быть сделано позже, если я могу получить идентификатор файла из этого массива, а затем подсчитать слова внутри …. ?

Может ли кто-нибудь помочь, возможно, предоставить структуру barebone? Я думаю, что основной бит, в котором мне нужна помощь, – это количество раз, когда каждое слово появляется в документе и добавляет его в массив индексов …

благодаря

$words=array(); foreach (glob('*') as $file) { $contents=file_get_contents($file); $words[$file]=array(); preg_match_all('/\S+/',$contents,$matches,PREG_SET_ORDER); foreach ($matches as $match) { if (!isset($words[$file][$match[0])) $words[$file][$match[0]]=0; $words[$file][$match[0]]++; } foreach ($useless as $value) if (isset($words[$file][$value])) unset($words[$file][$value]); $count=count($words[$file]); var_dump($words[$file]); echo 'Number of words: '.$count; } 

Посмотрите на str_word_count . Он подсчитывает слова, но также может извлекать их в массив (каждое значение в массиве является словом). Затем вы можете обработать этот массив, чтобы удалить стоп-слова, количество экземпляров и т. Д.

Ну, каждый файл в каталоге должен быть простым, используя glob
Затем чтение файлов может быть выполнено с помощью file_get_contents

 /** * This is how you will add extra rows * * $index[] = array( * 'filename' => 'airlines.txt', * 'word' => 'JFK', * 'count' => 3, * 'all_words_count' => 42 * ); */ $index = array(); $words = array('jfk', 'car'); foreach( $words as $word ) { // All files with a .txt extension // Alternate way would be "/path/to/dir/*" foreach (glob("test_files/*.txt") as $filename) { // Includes the file based on the include_path $content = file_get_contents($filename, true); $count = 0; $totalCount = str_word_count($content); if( preg_match_all('/' . $word . '/i', $content, $matches) ) { $count = count($matches[0]); } // And another item to the list $index[] = array( 'filename' => $filename, 'word' => $word, 'count' => $count, 'all_words_count' => $totalCount ); } } // Debug and look at the index array, // make sure it looks the way you want it. echo '<pre>'; print_r($index); echo '</pre>'; 

Когда я тестировал вышеуказанный код, это то, что я получил.

 Array ( [0] => Array ( [filename] => test_files/airlines.txt [word] => jfk [count] => 2 [all_words_count] => 38 ) [1] => Array ( [filename] => test_files/rentals.txt [word] => jfk [count] => 0 [all_words_count] => 47 ) [2] => Array ( [filename] => test_files/airlines.txt [word] => car [count] => 0 [all_words_count] => 38 ) [3] => Array ( [filename] => test_files/rentals.txt [word] => car [count] => 3 [all_words_count] => 47 ) ) 

Думаю, я решил ваш вопрос: D Добавьте это к следующему сценарию, и вы сможете сортировать счетчик, начиная с нуля с $sorted и от самого высокого с $sorted_desc

 function sorter($a, $b) { if( $a['count'] == $b['count'] ) return 0; return ($a['count'] < $b['count']) ? -1 : 1; } // Clone the original list $sorted = $index; // Run a custom sort function uasort($sorted, 'sorter'); // Reverse the array to find the highest first $sorted_desc = array_reverse($sorted); // Debug and look at the index array, // make sure it looks the way you want it. echo '<h1>Ascending</h1><pre>'; print_r($sorted); echo '</pre>'; echo '<h1>Descending</h1><pre>'; print_r($sorted_desc); echo '</pre>'; 

Вот базовая структура:

  1. Создать массив $index
  2. Используйте scandir (или glob , если вам нужно только получить файлы определенного типа), чтобы получить файлы в каталоге.
  3. Для каждого файла:
    1. Получить содержимое с помощью file_get_contents
    2. Используйте str_word_count для получения массива $word_stream потока слов
    3. Создайте массив $word_array для хранения слов
    4. Для каждого слова в $word_stream :
      1. Если он находится в массиве $ignored_words , пропустите его
      2. Если он еще не находится в $word_array в качестве ключа, добавьте $word_array[$word] = 1
      3. Если он уже находится в $word_array , приращение $word_array[$word]++
    5. Получите сумму $word_array с array_sum или сумму уникальных слов со count ; вы можете добавить их в $word_array с ключами "_unique" и "_count" (которые не будут словами), если вам нравится
    6. Добавьте имя файла как ключ к массиву $index , со значением $word_array