2010-03-22 5 views
2

Comment puis-je extraire les mots communs entre deux ou plusieurs paragraphes dans php5? Je suppose que cela pourrait fonctionner pour résumer chaque texte pour créer une liste de mots hautement classés , puis les comparer.Extraction des mots communs entre deux paragraphes?

+0

Pouvez-vous donner un exemple d'entrée et de sortie prévue? – Gumbo

Répondre

5

Je suppose que la façon la plus simple serait de:

  • Fendez chaque paragraphe dans un tableau de mots, en utilisant soit explode ou preg_split
    • le premier pourrait être un peu plus rapide
    • le second pourrait fournir un peu plus d'options
  • peut-être, faire un filtrage sur la liste des mots:
    • chaque mot
        propre
      • suppression des caractères spéciaux, comme les lettres accentuées
      • tout de conversion pour réduire/majuscules, pour aider les comparaisons que vous allez faire plus tard
    • remove trop mots communs
    • supprimer trop court mots
    • array_filter, ici, pourrait probablement aider
  • puis, obtenir la liste des mots qui sont dans les deux tableaux, en utilisant quelque chose comme array_intersect
+2

c'est une excellente méthode, pour le filtrage, une approche plus précise (mais plus complexe) consiste à réduire le poids des mots en fonction de leurs fréquences dans un grand corpus. par exemple le mot 'the' a une haute fréquence donc son classement sera grandement réduit. les mots ayant le rang le plus élevé sont alors plus représentatifs. – Mathieu

+0

@mathroc: true; et, avec un peu de peaufinage, cela pourrait aussi permettre d'injecter un poids important pour certains mots spécifiques. –

+0

Une autre torsion pourrait être d'utiliser http://tartarus.org/~martin/PorterStemmer/ dans le cadre de ceci. – goat

4

Il existe probablement un moyen plus rapide, mais vous pouvez omettre la ponctuation comme!? -./\ @ # $%^& *, puis exploser les deux paragraphes dans un tableau, puis essayez array_intersect() sur les deux tableaux. Tout ce qui se trouve dans le tableau 1 dans le tableau 2 devrait revenir en arrière.

http://php.net/manual/en/function.array-intersect.php

Théoriquement, vous devriez recevoir en retour un tableau de mots correspondant. De là, le classement est à vous et comment vous avez choisi de le faire.

+1

+1 Battez-moi à ma réponse, même si j'aurais pu utiliser 'str_replace' pour gérer la ponctuation. – Isaac

-1
  1. Fendez chaque paragraphe sur les espaces
  2. Sélectionnez un jeton du paragraphe A; si c'est dans le paragraphe B, placez-le dans un tableau 'matches'.
  3. Répétez l'étape 2 jusqu'à ce qu'il n'y en a plus dans le paragraphe A.
+1

Cela semble être une réponse étrange d'avoir recueilli un downvote sans commentaire. Rien de manifestement incorrect au sujet de la théorie. – Beska

+0

Je ne l'ai pas déprécié, mais je pense que c'est parce que le faire de cette façon semble si maladroit. Cela fonctionnerait, mais l'utilisation de fonctions de tableau est plus logique. En outre, rien n'a été mentionné à propos de la ponctuation, ce qui causera un problème si elle n'est pas supprimée. –

2

Quelque chose comme ceci pourrait fonctionner ...

<?php 
    $paragraph = "hello this is some sample text. Sample text is usually used to test a program. For example, this sample text will be used to test the script below."; 
    $words = array(); 
    preg_match_all('/\w+/', $paragraph, $matches); 
    foreach($matches[0] as $w){ 
    $w = strtolower($w); 
    if(!array_key_exists($w, $words)){ 
     $words[$w] = 0; 
    } 
    $words[$w]++; 
    } 
    asort($words); 
    echo print_r($words, true); 

    /* Output 
    Array (
     [hello] => 1 
     [will] => 1 
     [example] => 1 
     [a] => 1 
     [program] => 1 
     [usually] => 1 
     [Sample] => 1 
     [script] => 1 
     [below] => 1 
     [some] => 1 
     [the] => 1 
     [be] => 1 
     [for] => 1 
     [to] => 2 
     [is] => 2 
     [sample] => 2 
     [test] => 2 
     [used] => 2 
     [this] => 2 
     [text] => 3 
) */ 

?> 
2
<?php 
/** 
* Gets all the words as an array for a given text blob 
* 
* @param string $paragraph The pragraph in question 
* @return string[] Words found 
*/ 
function getWords($paragraph) { 
    //only lowercase 
    $paragraph = strtolower($paragraph); 
    //replace all non alpha num characters with spaces (this way periods won't screw 
    //with our words) 
    $paragraph = preg_replace("/[^a-z]/", " ", $paragraph); 
    $paragraph = explode(" ", $paragraph); 
    //get rid of empty words 
    $paragraph = array_flip($paragraph); 
    unset($paragraph[""]); 
    $paragraph = array_flip($paragraph); 
    return $paragraph; 
} 

$paragraph1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sit amet ante 
nisl. Morbi tempor varius semper. Suspendisse vel nisi dui. Sed tristique consectetur imperdiet. 
Morbi nulla diam, lobortis non eleifend eget, ullamcorper nec tortor. Duis quis lectus felis. 
In vulputate varius luctus. Maecenas gravida laoreet massa quis faucibus. Duis dictum, dui sit 
amet pharetra laoreet, tortor nisi mattis tortor, et ornare purus dolor vitae ligula. Sed id 
orci ut dolor fermentum imperdiet. Nulla non justo urna, in suscipit nunc. Donec ut nibh risus, 
ut tempus mi. Proin fringilla pretium urna sed faucibus. Proin et porttitor sem. Nulla eros 
arcu, sodales et aliquam in, pharetra et mauris. Duis placerat blandit justo at tincidunt. 
Etiam eu rutrum arcu."; 

$paragraph2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet leo id 
arcu feugiat tempus quis a risus. Proin non nisi augue. Cras ultricies dignissim augue vel gravida. 
Vivamus sed orci sed leo sollicitudin aliquet non at dui. Nulla facilisi. Suspendisse nunc nibh, 
sollicitudin vitae tincidunt eget, aliquet vitae magna. Aliquam vehicula cursus ante, vitae rhoncus 
orci egestas et. Fusce condimentum metus at metus auctor pellentesque. Suspendisse potenti. Morbi 
blandit, leo sed eleifend pretium, augue dui interdum eros, vel faucibus felis dolor id elit. Nam 
condimentum, odio at mattis consequat, sem eros molestie risus, a tempus dolor arcu sit amet justo."; 

$common = array_intersect(getWords($paragraph1), getWords($paragraph2)); 
sort($common); 
var_dump($common); 
?> 
Questions connexes