PHP Stop Word List

Estou tocando com palavras de parada dentro do meu código. Tenho uma matriz cheia de palavras que eu gostaria de verificar e uma série de palavras que eu quero verificar.

No momento em que eu estou fazendo o loop da matriz um de cada vez e removendo a palavra se for em_array vs a lista de palavras de parada, mas eu me pergunto se há uma maneira melhor de fazê-lo, olhei para array_diff e, no entanto, se eu tem várias palavras de parada na primeira matriz, array_diff aparece apenas para remover a primeira ocorrência.

O foco é sobre velocidade e uso de memory, mas velocidade mais.

Editar –

A primeira matriz é palavras singulares, com base em comentários de blog (geralmente são bastante longos), a segunda matriz é palavras singulares de palavras de parada. Desculpe por não deixar isso claro

obrigado

    Usando str_replace …

    Uma abordagem simples é usar str_replace ou str_ireplace , o que pode levar uma série de “agulhas” (coisas para procurar), substituições correspondentes e uma série de “palheiros” (coisas para operar).

    $haystacks=array( "The quick brown fox", "jumps over the ", "lazy dog" ); $needles=array( "the", "lazy", "quick" ); $result=str_ireplace($needles, "", $haystacks); var_dump($result); 

    Isso produz

     array(3) { [0]=> string(11) " brown fox" [1]=> string(12) "jumps over " [2]=> string(4) " dog" } 

    Como um lado a lado, uma maneira rápida de limpar os espaços de trânsito que isso deixa seria usar array_map para chamar a guarnição para cada elemento

     $result=array_map("trim", $result); 

    A desvantagem de usar str_replace é que ele irá replace as correspondências encontradas nas palavras, em vez de apenas palavras inteiras. Para resolver isso, podemos usar expressões regulares …

    Use preg_replace

    Uma abordagem usando preg_replace parece muito semelhante à acima, mas as agulhas são expressões regulares, e nós verificamos se há um “limite de palavras” no início e no final da partida usando \ b

     $haystacks=array( "For we shall use fortran to", "fortify the general theme", "of this torrent of nonsense" ); $needles=array( '/\bfor\b/i', '/\bthe\b/i', '/\bto\b/i', '/\bof\b/i' ); $result=preg_replace($needles, "", $haystacks); 

    Se você já possui dois arrays classificados, você pode usar esse algoritmo para remover cada elemento da matriz A que também esteja na matriz B (em termos matemáticos: A \ B):

     for ($i=0, $n=count($a), $j=0, $m=count($b); $i< $n && $j<$m; ) { $diff = strcmp($a[$i], $b[$j]); if ($diff == 0) { unset($a[$i]); $i++; } if ($diff < 0) { $i++; } if ($diff > 0) { $j++; } } 

    Isso só requer passos de O ( n ).

    Outra abordagem seria usar as palavras da matriz B como chaves para um índice (usando array_flip ), iterar os valores de A e ver se eles são uma chave no índice usando array_key_exists :

     $index = array_flip($b); foreach ($a as $key => $val) { if (array_key_exists($val, $b)) { unset($a[$key]); } } 

    Novamente, isso é O ( n ), pois evita pesquisar cada valor em B para cada valor em A que seria O ( n 2 ).

    array_diff () deve funcionar.

     $sentence = "the quick brown fox jumps the fence and runs"; $array = explode(" ", $sentence); $stopwords = array("the","and","an","of"); print_r(array_diff($array,$stopwords)); 

    Resultado

     Array ( [1] => quick [2] => brown [3] => fox [4] => jumps [6] => fence [8] => runs ) 

    Eu testei neste site: http://sandbox.onlinephpfunctions.com/

    e sobre o uso de in_array

    http://au.php.net/manual/en/function.in-array.php

    A function aceita uma agulha que é uma matriz.

    bool in_array (mixed $ needle, array $ haystack [, bool $ strict])

    alternativamente, você pode percorrer suas palavras de parada uma a uma e encontrar todas as partidas