Criando um mecanismo de pesquisa baseado em arquivo de texto simples

Eu preciso criar um mecanismo de pesquisa baseado em arquivo de texto simples o mais cedo possível (usando o PHP)! Basicamente, tem que ler arquivos em um diretório, remover parada e palavras inúteis, indexar cada palavra útil remanescente com quantas vezes ele aparece em cada documento.

Eu acho que o pseudo código para isso é:

  para cada arquivo no diretório:
     ler nos conteúdos
     compare para parar as palavras,
     adicione cada palavra restante à matriz,
     conte quantas vezes essa palavra aparece no documento,
     adicione esse número à matriz,
     adicione o id / nome do arquivo à matriz, 

também precisa contar a quantidade total de palavras (depois de uma remoção inútil, eu acho) no arquivo inteiro, o que eu posso adivinhar pode ser feito depois, desde que possamos obter o ID do arquivo dessa matriz e depois contar as palavras dentro … ?

Alguém pode ajudar, talvez forneça uma estrutura barebones? Eu acho que o bit principal que eu preciso de ajuda é obter o número de vezes que cada palavra aparece no documento e adicionando-o à matriz de índice …

obrigado

$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; } 

Dê uma olhada no str_word_count . Ele conta as palavras, mas também pode extraí-las para uma matriz (cada valor na matriz sendo uma palavra). Você pode depois processar esta matriz para remover palavras de parada, ocorrências de contagem, etc.

Bem, obter cada arquivo no diretório deve ser simples usando glob
Em seguida, ler os arquivos pode ser feito com 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 '
'; print_r($index); echo '

';

Quando testei o código acima, é isso que eu recebi.

 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 ) ) 

Eu acho que resolvi a sua pergunta: D Adicione isso ao após o script acima e você pode classificar a contagem, começando em zero com $sorted e do mais alto com $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 '

Ascending

'; print_r($sorted); echo '

'; echo '

Descending

'; print_r($sorted_desc); echo '

';

Aqui está uma estrutura básica:

  1. Crie uma matriz de $index
  2. Use scandir (ou glob , se você precisa apenas obter arquivos de um determinado tipo) para obter os arquivos no diretório.
  3. Para cada arquivo:
    1. Obter conteúdo com file_get_contents
    2. Use str_word_count para obter array $word_stream do stream de palavras
    3. Crie uma matriz $word_array para manter contagens de palavras
    4. Para cada palavra em $word_stream :
      1. Se estiver em uma matriz $ignored_words , salte-o
      2. Se ainda não estiver em $word_array como uma chave, adicione $word_array[$word] = 1
      3. Se já estiver em $word_array , incremente $word_array[$word]++
    5. Obtenha a sum de $word_array com array_sum , ou a sum de palavras únicas com count ; você pode adicioná-los a $word_array com as teclas "_unique" e "_count" (que não serão palavras), se você quiser
    6. Adicione o nome do arquivo como uma chave à matriz $index , com o valor $word_array