Мне нужно создать простую текстовую поисковую систему как можно скорее (используя 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>';
Вот базовая структура:
$index
scandir
(или glob
, если вам нужно только получить файлы определенного типа), чтобы получить файлы в каталоге. file_get_contents
str_word_count
для получения массива $word_stream
потока слов $word_array
для хранения слов $word_stream
:
$ignored_words
, пропустите его $word_array
в качестве ключа, добавьте $word_array[$word] = 1
$word_array
, приращение $word_array[$word]++
$word_array
с array_sum
или сумму уникальных слов со count
; вы можете добавить их в $word_array
с ключами "_unique"
и "_count"
(которые не будут словами), если вам нравится $index
, со значением $word_array