L'algorithme Nagao est utilisé pour compter la fréquence de chaque sous-string, puis sur la base de ces statistiques de fréquence, de la fréquence du mot, du nombre de voisins de chaque chaîne, de l'entropie gauche et droite et les informations interactives (condensation interne) de chaque chaîne.
Explication du nom:
Algorithme Nagao: un texte statistique rapide de tous les algorithmes de fréquence sous-string dans le texte. L'algorithme détaillé peut être visible http://www.doc88.com/p-664123446503.html
Fréquence des mots: le nombre de fois où la chaîne apparaît dans le document. Plus le nombre de fois, plus il est important.
Nombre de voisins à gauche et à droite: le nombre de caractères différents à gauche et à droite de la chaîne dans le document. Plus il y a de voisins à gauche et à droite, plus la probabilité de la chaîne de mots est élevée.
Entropie gauche et droite: le nombre de caractères à gauche et à droite de la chaîne dans le document distribue le nombre de caractères en différents caractères. Semblable aux indicateurs ci-dessus, il existe certaines différences.
Informations interactives: chaque fois qu'une chaîne est divisée en deux parties, la moitié gauche de la chaîne et la moitié droite de la chaîne, calculent la probabilité qu'elle apparaisse en même temps, à l'exception de la probabilité de leur indépendance respective et enfin de prendre la probabilité minimale dans toute la division. Plus cette valeur est grande, plus la condensation de la chaîne est élevée, plus elle est probable.
Le processus spécifique de l'algorithme:
1. Lisez le fichier d'entrée un par un, selon les caractères non chinois ([^ / u4e00- / u9fa5] +) et arrête les mots "? Et ne le dites pas après vous."
Divisez en une chaîne, le code est le suivant:
String [] phrases = line.split ("[^ / u4e00- / u9fa5] + | [" + MOTS DE MOTS + "]);
Les mots d'arrêt peuvent être modifiés.
2. Obtenez les brochettes gauche et droite de toutes les cordes coupées, ajoutez respectivement les ptables gauche et droite
3. Triez le pTable et calculez lTable. LTABLE enregistre que dans le pTable trié, les sous-marins suivants ont le même nombre du même caractère avec le même personnage
4. Traversant PTABLE et LTABLE, vous pouvez obtenir les mots fréquents de tous les sous-string, voisins
5. Selon la fréquence de la chaîne de mots, les voisins gauche et droit, la fréquence des mots, le nombre de voisins, l'entropie gauche et droite et les informations interactives de la chaîne de sortie
1. Nagaoalgorithm.java
package com.algo.word; ArrayList; Classe publique Nagaoalgorithm {private int n; Liste privée <String> Leftptable; Très bon? Eh bien, c'est mieux que ce n'est pas bon. );} // Expression inversée String privé Reverse (phrase de chaîne) {StringBuilder ReversePhrase = new StringBuilder (); ); Length (), S2.Length ()); i ++) {if (s1.charat (i) == S2.Charat (i)) COPREFIXLENGT ++; // Compte de ligne divisé à une chaîne de caractères non chinoise consécutive [] phrases = line.split ("[^ / u4e00- / u9fa5] + | [" + MOTS STOP + "" "); pour (chaîne e: phrases) {pour (int i = 0; i <phrase.length (); i ++) Rightptable.add (phrase.SubString (i)); ++) Leftptable .add (reverse int i = 1; i <droitetable.size (); i ++) .size ()]; PTABLE trié et compté à gauche et à droite "); t Résultat statistique: TF, Distribution de voisin private void countfneighbor () () {// get tf et le voisin droit pour (int pindex = 0; pindex <droite.size () ; = phrase.SubString (0, longueur); hbor.incrementtf (); .Length; Lindex ++) {Rightlta ble [Lindex]> = longueur) {tfneighbor Charat (longueur));} else Break;} wordtfneighbor.put (word, tfneighbor);}} // get gauche voisin pour (int pindex = 0; pindex <fontptable.size (); pindex ++) {String phrase = Leftptable.get (Pindex); longueur)); tfneighbor tfneighbor = wordtfneighbor.get (word); .Length; Lindex ++) {if (LeftlTable [lindex]> = longueur) {String Cophras = Leftpta ble.get (lindex); ;} Else Break;}} System.out.println ("Info: [Nagao Algorithm Étape 3]]: ayant compté TF et voisin");} // selon WordTfneighbor, compter Mi of Word Private Double CountMi (String Word) {if (word.length () <= 1) return 0; ; LeftPart) .getTf () / WordNumber; Enregistrer TF, (gauche et droite) Numéro de voisin, Entropie du voisin, Informations mutuelles private void String Out, String stopList, string [] thrushold) {try {// Read Stop Words Set <strong> stopwords = new hashset <string> ( ); , Mi BufferedWriter bw = new BufferedWriter (new FileWriter (Owriter (owriter (o ut); for (map .ntry <string, tfneighbor> entrée: wordtfneighbor.entryset ()) {if (entry.getKey (). Length () <). = 1 || )); .Parseint (threshold [3]) {) {) {) {) {) {) {) {) {) {StringBuilder sb = new StringBuilder (); ","). "). Append (mi) .appnd (" / n "); bw.write (sb.toString ());}}} bw.close ();} catch (ioException e) {throw new RuntimeException (e); } System.out.println ("Info: [Nagao Algorithm Étape 4]: Haveing Enregistré dans le fichier"); o (String [] Entrées, String Out, String stopList) {nagaoalgorithm nagao = new nagaoalgorithm (); Étape 1: Ajouter des phrases à la ligne de chaîne PTable; nagao.addtopTable (line);} br.close ();} catch (ioException e) {throw new RuntimeException ();}}}} tln ("info: [[[[[[[Nagao Algorithm étape 1]: Avoir le fait d'avoir été: Ajouté toutes les sous-structures gauche et droite à pTable "); // étape 2: trier pTable et compter lTable nagao.countltapable (); // Step3: cou nt tf et voisin nagao.counttfneighbor (); // étape4: sauvegarder tf voisinfo et Mi nagao.savetfneighborinfomi (out, stopList, "20,3,3,5" .split (","); uts, string out, string stopList, int n, file de chaîne) {nagaoalgorithm nagao = new nagaoalgorithm (); .setn (n); ; )! "); // Étape 2: Trier pTable et compter lTable ao.CountlTable (); // Step3: Count tf et voisin Nagao.Counttfneighbor (); // Step4: Save Tf voisinfo et mi nagao.savetfneighborinfomi (out, stoplist, mil nagao.savetfneighborinfomi (Out, stoplist, mil nagao.savetfneighborinfomi (Out, stopList, Threshold);} e void setn (int n) {n = n;} public static void main (String [] args) {String [] ins = {"e: //test/ganfen.txt"}; , "e: //test/out.txt", "e: // test /// stopList.txt");}}
2. Tfneighbor.java
package com.algo.word; {LeftNeighbor = new hashmap <charactor, entier> (); + LeftNeighbor.getOrdefault (Word, 0)); {//RightNeighbor.put (Word, 1 + Rightneighbor.GetonterFault (Word, 0)); } // incrément tf public void incmenttf () {tf ++;} public int getleftleneighbornUmber () {return LeftNeighbor.size (); = 0; INT SUM = 0; Public Double GetRightNeighborEntropy () {Double Entropy = 0; int sum = 0; ) Return 0; return math.log (sum) -entropy / sum;} public int getTTf () {return tf;}}
3. Main.java
package com.algo.word; classe publique Main {public static void main (String [] args) {// Si 3 arguments, le premier argument est la fraction Split avec ',', comme Belw: // Word, la fréquence de terme, le numéro de voisin gauche, le numéro de voisin droit, l'entropie du voisin gauche, l'entropie du voisin droit, l'inf ormation mutuelle // Le troisième argument est la liste des mots d'arrêt if (args.length == 3) Nagaoalgorithm.Applynagao (args [0] .split (","), args [1], args [2]); , La valeur par défaut est "20,3,3,5" // output tf> 20 && (gauche | droite) numéro de voisin> 3 && mi> 5 else if (args.length == 5) .split (","), args [1], args [2], Integer.parseint (args [3]), args [4]);}}}
Ce qui précède est tout le contenu de cet article.