Domanda

Voglio implementare alcune applicazioni con n-grammi (preferibilmente in PHP).


Quale tipo di n-grammi è più adeguato per la maggior parte degli scopi? Un livello di parole o un livello di caratteri n-grammo? Come hai potuto implementare un tokenizer n-gram in PHP?


Per prima cosa, vorrei sapere cosa sono esattamente gli N-grammi. È corretto? È così che capisco n-grammi:

Frase: " I live in NY. "

bigrams a livello di parola (2 per n): " # I ', " I live " ;, " live in " ;, " in NY " ;,' NY # '

bigrams a livello di carattere (2 per n): " # I " ;, " I # " ;, " # l " ;, " li " ;, " iv " ;, " ve " ;, " e # " , " # i " ;, " in " ;, " n # " ;, " # N " ;, " NY " ;, " Y # "

Quando si dispone di questo array di n-gram-parts, si rilasciano quelli duplicati e si aggiunge un contatore per ogni parte che fornisce la frequenza:

bigrams a livello di parola: [1, 1, 1, 1, 1]

bigrams a livello di personaggio: [2, 1, 1, ...]

È corretto?


Inoltre, vorrei saperne di più su cosa puoi fare con n-grammi:

  • Come posso identificare la lingua di un testo usando n-grammi?
  • È possibile eseguire la traduzione automatica usando n-grammi anche se non si dispone di un corpus bilingue?
  • Come posso creare un filtro antispam (spam, ham)? Combina n-grammi con un filtro bayesiano?
  • Come posso individuare l'argomento? Ad esempio: è un testo sul basket o sui cani? Il mio approccio (esegui quanto segue con un articolo di Wikipedia per "cani" e "basket"): costruisci i vettori n-grammo per entrambi i documenti, li normalizzi, calcoli la distanza Manhattan / Euclidea, più il risultato è vicino a 1 più alto è la somiglianza

Cosa ne pensi dei miei approcci applicativi, in particolare l'ultimo?


Spero che tu mi possa aiutare. Grazie in anticipo!

È stato utile?

Soluzione

I n-grammi di parole saranno generalmente più utili per la maggior parte delle applicazioni di analisi del testo che menzioni, con la possibile eccezione del rilevamento del linguaggio, in cui qualcosa come i trigrammi dei caratteri potrebbe dare risultati migliori. In effetti, creeresti un vettore n-grammo per un corpus di testo in ogni lingua che ti interessa rilevare e quindi confronti le frequenze dei trigrammi in ciascun corpus con i trigrammi nel documento che stai classificando. Ad esempio, il trigramma the probabilmente appare molto più frequentemente in inglese che in tedesco e fornirebbe un certo livello di correlazione statistica. Una volta che hai i tuoi documenti in formato n-gram, puoi scegliere tra molti algoritmi per ulteriori analisi, filtri di Baysian, N-Neighbor più vicino, Support Vector Machines, ecc.

Delle applicazioni che menzioni, la traduzione automatica è probabilmente la più inverosimile, poiché i soli n-grammi non ti porteranno molto lontano. La conversione di un file di input in una rappresentazione n-gram è solo un modo per mettere i dati in un formato per un'ulteriore analisi delle funzionalità, ma poiché perdi molte informazioni contestuali, potrebbe non essere utile per la traduzione.

Una cosa a cui fare attenzione è che non è sufficiente creare un vettore [1,1,1,2,1] per un documento e un vettore [2,1,2,4] per un altro documento , se le dimensioni non corrispondono. Cioè, la prima voce nel vettore non può essere the in un documento e è in un altro o gli algoritmi non funzioneranno. Ti ritroverai con vettori come [0,0,0,0,1,1,0,0,2,0,0,1] poiché la maggior parte dei documenti non conterrà la maggior parte dei n-grammi a cui sei interessato. "delle funzioni è essenziale e richiede che tu decida" in anticipo "quali diagrammi includerai nella tua analisi. Spesso, questo è implementato come un algoritmo a due passaggi, per decidere innanzitutto il significato statistico di vari n-grammi per decidere cosa mantenere. "Selezione funzionalità" di Google per ulteriori informazioni.

N-grammi basati su Word più Support Vector Machines in un modo eccellente per eseguire lo spotting degli argomenti, ma è necessario un ampio corpus di testo pre-classificato in 'on topic' e 'off topic' per addestrare il classificatore. Troverai un gran numero di articoli di ricerca che spiegano vari approcci a questo problema su un sito come citeseerx . Non consiglierei l'approccio della distanza euclidea a questo problema, poiché non pondera i singoli n-grammi in base alla significatività statistica, quindi due documenti che includono entrambi the , a , è e di sarebbe considerato una corrispondenza migliore di due documenti che includevano entrambi Baysian . Rimuovere parole d'ordine dai tuoi n-grammi di interesse migliorerebbe un po 'questo.

Altri suggerimenti

Hai ragione sulla definizione di n-grammi.

È possibile utilizzare n-grammi a livello di parola per le applicazioni di tipo di ricerca. Il livello dei caratteri n-grammi può essere utilizzato di più per l'analisi del testo stesso. Ad esempio, per identificare la lingua di un testo, utilizzerei le frequenze delle lettere rispetto alle frequenze stabilite della lingua. Cioè, il testo dovrebbe corrispondere approssimativamente alla frequenza di occorrenza delle lettere in quella lingua.

Un tokenizer n-gram per le parole in PHP può essere fatto usando strtok:

http://us2.php.net/manual/en/function .strtok.php

Per i personaggi usa split:

http://us2.php.net/manual/en /function.str-split.php

Quindi puoi semplicemente dividere l'array come desideri per qualsiasi numero di n-grammi.

I filtri bayesiani devono essere addestrati per l'uso come filtri antispam, che possono essere utilizzati in combinazione con n-grammi. Tuttavia, è necessario dargli un sacco di input per poter imparare.

Il tuo ultimo approccio sembra decente per quanto riguarda l'apprendimento del contesto di una pagina ... questo è comunque abbastanza difficile da fare, ma n-grammi sembra un buon punto di partenza per farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top