O algoritmo Nagao é usado para contar a frequência de cada subscorrer e, em seguida, com base nessas estatísticas de frequência, na frequência da palavra, no número de vizinhos de cada sequência, na entropia esquerda e direita e nas informações interativas (condensação interna) de cada string.
Explicação substantiva:
Algoritmo de Nagao: um texto estatístico rápido de todos os algoritmos de frequência de subsenhas no texto. O algoritmo detalhado pode ser visível http://www.doc88.com/p-664123446503.html
Frequência de palavras: o número de vezes que a string aparece no documento. Quanto mais o número de vezes, mais importante.
Número de vizinhos à esquerda e à direita: o número de caracteres diferentes à esquerda e à direita da string no documento. Quanto mais vizinhos à esquerda e direita, maior a probabilidade da palavra string.
Entropia esquerda e direita: o número de caracteres à esquerda e à direita da string no documento distribui o número de caracteres em diferentes caracteres. Semelhante aos indicadores acima, existem certas diferenças.
Informações interativas: cada vez que uma string é dividida em duas partes, a metade esquerda da corda e a metade direita da string, calcule a probabilidade de que ela apareça ao mesmo tempo, exceto pela probabilidade de sua respectiva independência e, finalmente, tomar a probabilidade mínima em toda a divisão. Quanto maior esse valor, maior a condensação da corda, maior a probabilidade de que seja.
O processo específico de algoritmo:
1. Leia o arquivo de entrada um por um, de acordo com caracteres não chineses ([^/u4e00-/u9fa5]+) e pare as palavras "? E não diz isso depois que você for."
Divida em uma string, o código é o seguinte:
String [] phrases = line.split ("[^/u4e00-/u9fa5]+| ["+stopwords+"]);
As palavras de parada podem ser modificadas.
2. Obtenha os espetos esquerdo e direito de todas as cordas cortadas, adicione ptables esquerda e direita, respectivamente
3. Classifique o PTABLE e calcule a ltable. LTABLE registra que, no PTABLE classificado, os próximos sub -skewers têm o mesmo número do mesmo personagem com o mesmo personagem
4. Travessing PTable e Ltable, você pode obter as palavras frequentes de todos os sub -cordões, vizinhos
5. De acordo com a frequência da cadeia da palavra, os vizinhos esquerdo e direito, a palavra frequência, o número de vizinhos, a entropia esquerda e direita e informações interativas da sequência de saída
1. Nagaoalgorithm.Java
pacote com.algo.word; Arraylist; Classe pública Nagaoalgorithm {private Int N; Muito bom? );} // frase reversa private string reverse (frase string) {stringbuilder reversefrase = new stringbuilder (); ); comprimento (), S2.Length (); // Conta de linha dividida para nenhuma string de caracteres chinesa consecutiva [] phrasees = line.split ("[^/u4e00-/u9fa5]+| ["+stops+"" "); para (string e: frases) {para (int (int) i = 0; ++) esquerda .Add (reversefrase. int i = 1; .size ()]; PTable e contagem classificados ltable esquerda e direita "); t resultado estatístico: tf, distribuição de vizinho private vazio countfneighbor () () {// obtenha tf e vizinho direito para (int pindex = 0; pindex <rightptable.size () ; = frase.substring (0, comprimento); .Length; Charat (comprimento));} else quebre;} wordtfneighbor.put (word, tfneighbor);}} // Obtenha o vizinho deixado para (int pindex = 0; pindex <leftPtable.size (); pindex ++) {string phrase = leftptable.get (pindex); comprimento); .Length; ;} Else Break;}} system.out.println ("info: [algoritmo nagao Etapa 3]]: tendo contado TF e vizinho");} // De acordo com o wordtfneighbor, conde mi da palavra privada dupla contagem (palavra string) {if (word.length () <= 1) retornar 0; ; LeftPart) .gettf ()/wordNumber; Salvar TF, (esquerda e direita) Número do vizinho, entropia do vizinho, informação mútua String private void out, string stoplist, string [] limite) {try {// Leia o conjunto de arquivos de palavras de parada <strong> stopwords = new Hashset <string> ( ); , mi bufferwriter bw = new bufferwriter (new FileWriter (Owriter (Owriter (o ut); para (map .nntry <string, tfneighbor> entrada: wordtfneighbor.entryset ()) {if (entrada.getKey (). 1 ||. ); .parseint (limiar [3]) {) {) {) {) {) {) {) {) {) {stringbuilder sb = new stringbuilder (); ","). "). Append (mi) .Appnd ("/n "); bw.Write (sb.toString ());}}} bw.close ();} catch (ioexception e) {lança a nova runimeTeException (e); } System.out.println ("Info: [Algoritmo Nagao Etapa 4]: Salvo para arquivar"); Etapa 1: adicione frases à linha de string ptable; nagao.addtoptable (line);} br.close ();} catch (ioexception e) {tiro novo runtimeException ();}}}} tln ("info: [[[[[[[[[[nagao algoritmo etapa 1]: tendo Adicionado todas as substringas esquerda e direita ao PTABLE "); // Etapa 2: Classifique Ptable e Conte Nagao.CountLtapable (); // Etapa3: Cou nt tf e vizinho nagao.counttfneighbor (); // step4: salvar tf vizinho e vizinhança e Mi Nagao.Savetfneighborinfomi (Out, Stoplist, "20,3,5" .Split (","); UTS, String Out, String StopList, Int N, String File) {Nagaoalgorithm Nagao = NOVA NAGAOALGORITHM (); .setn (n); Retorno; )! "); // Etapa 2: Classifique e contendo a ltable ao.CountLTable (); // Etapa 3: contagem tf e vizinho nagao.counttfneighbor (); // etapa4: salve o vizinho vizinho e mi nagao.savetfneighborinfomi (Out, stoplist, Limite);} 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
pacote com.algo.word; {leftNeighbor = novo hashmap <Charactor, Integer> (); + LeftNeighbor.getorDefault (Word, 0)); {//rightneighbor.put (Word, 1 + Rightneighbor.getOnterFault (Word, 0)); } // incremento tf public void incrementtf () {tf ++;} public int getLeftleneighbornumber () {return leftneighbor.size (); = 0; Public Double GetRightNeighborentropy () {Double Entropy = 0; ) Retornar 0;
3. Main.Java
pacote com.algo.word; Divida com '',, como Belw: // Word, Frequência a termo, número do vizinho esquerdo, número do vizinho direito, entropia do vizinho esquerdo, entropia do vizinho direito, infração mútua // O terceiro argumento é a lista de palavras de parada se (args.length == 3) nagaoalgorithm.applynagao (args [0] .split (","), args [1], args [2]); , O padrão é "20,3,3,5" // saída tf> 20 && (esquerda | direita) Número do vizinho> 3 && mi> 5 else if (args.length == 5) .split (","), args [1], args [2], inteiro.parseint (args [3]), args [4]);}}}
O acima é todo o conteúdo deste artigo. Espero que todos possam gostar.