Domanda

Ho circa 100 megabyte di testo, senza alcun markup, diviso in circa 10.000 voci. Vorrei generare automaticamente un elenco di "tag". Il problema è che ci sono gruppi di parole (cioè frasi) che hanno senso solo quando sono raggruppati insieme.

Se conto solo le parole, ottengo un gran numero di parole davvero comuni (is, the, for, in, am, etc.). Ho contato le parole e il numero di altre parole che sono prima e dopo, ma ora non riesco davvero a capire cosa fare dopo Sono presenti le informazioni relative alle frasi di 2 e 3 parole, ma come posso estrarre questi dati?

È stato utile?

Soluzione

Prima di tutto, prova a conservare le informazioni su " confini " che compare nel testo di input.
(se tali informazioni non sono state perse prontamente, la tua domanda implica che forse la tokenizzazione è stata prontamente eseguita)
Durante il processo di tokenizzazione (analisi delle parole, in questo caso), cerca modelli che possano definire limiti di espressione (come la punteggiatura, in particolare i periodi e anche la separazione LF / CR multipla, utilizzali. Anche parole come "il", spesso può essere usato come limiti. Tali limiti di espressione sono tipicamente "negativi", nel senso che separano due istanze token che sono sicuri che non siano incluse nella stessa espressione. Alcuni limiti positivi sono le virgolette, in particolare le doppie virgolette. Questo tipo di informazioni può essere utile per filtrare alcuni degli n-grammi (vedi paragrafo successivo). Anche sequenze di parole come " ad esempio " o " al posto di " ; o "bisogno di" poter essere utilizzato anche come limiti di espressione (ma l'utilizzo di tali informazioni è un limite all'utilizzo di "priori" di cui parlerò più avanti).

Senza utilizzare dati esterni (diversi dal testo di input), puoi avere un relativo successo eseguendo le statistiche su digram e trigrammi del testo (sequenza di 2 e 3 parole consecutive). Quindi [la maggior parte] delle sequenze con un numero significativo (*) di istanze sarà probabilmente il tipo di "espressione / frasi" che stai cercando.
Questo metodo un po 'rozzo produrrà alcuni falsi positivi, ma nel complesso può essere praticabile. Dopo aver filtrato gli n-grammi noti per attraversare i "confini" come accennato nel primo paragrafo, può aiutare in modo significativo perché in termini naturali la fine della frase e l'inizio della frase tendono a attingere da un sottoinsieme limitato dello spazio del messaggio e quindi producono combinazioni di token che possono apparire statisticamente ben rappresentate, ma che in genere non lo sono semanticamente correlato.

Metodi migliori (possibilmente più costosi, in termini di elaborazione e di progettazione / investimenti), faranno uso di "priors" extra pertinente al dominio e / o alle lingue nazionali del testo inserito.

  • Contrassegno POS (parte del discorso) è abbastanza utile, in diversi modi (fornisce ulteriori limiti di espressione più oggettivi, e anche classi di parole "noise", ad esempio tutti gli articoli, anche se usati nel contesto di entità sono tipicamente di piccole nuvole di tag in modo tale che il OP vuole produrre.
  • Dizionari, lessici e simili possono anche essere molto utili. In particolare, questi che identificano le "entità". (ovvero istanze in WordNet lingo) e le loro forme alternative. Le entità sono molto importanti per le nuvole di tag (sebbene non siano l'unica classe di parole trovate in esse), e identificandole, è anche possibile normalizzarle (le molte espressioni diverse che possono essere usate per dire, "Senatore T . Kennedy "), quindi elimina i duplicati, ma aumenta anche la frequenza delle entità sottostanti.
  • se il corpus è strutturato come una raccolta di documenti, può essere utile utilizzare vari trucchi relativi a TF (frequenza di termine) e IDF (frequenza di documento inversa)

[Mi dispiace, devo andare, per ora (inoltre vorrei maggiori dettagli dai tuoi obiettivi specifici ecc.). Proverò a fornire maggiori dettagli e punti più avanti]

[A proposito, voglio collegare qui Jonathan Feinberg e Dervin Thunk risposte da questo post, in quanto forniscono eccellenti indicazioni, in termini di metodi e strumenti per il tipo di attività da svolgere. In particolare, NTLK e Python-at-large forniscono un eccellente framework per sperimentare]

Altri suggerimenti

Comincerei con un capitolo meraviglioso, di Peter Norvig , nel libro di O'Reilly Beautiful Data . Fornisce i dati ngram necessari, insieme al bellissimo codice Python (che può risolvere i tuoi problemi così come sono, o con qualche modifica) sul suo sito web personale .

Sembra che tu stia cercando estrazione di collocazione . Manning e Sch & # 252; tze dedicano un capitolo all'argomento, spiegando e valutando le" formule proposte "menzionate nell'articolo di Wikipedia che ho collegato.

Non posso inserire l'intero capitolo in questa risposta; si spera che alcuni dei i loro link aiuteranno. ( NSP sembra particolarmente appropriato.) nltk ha un modulo di collocazioni , non menzionato da Manning e Sch & # 252; tze da il loro libro lo precede.

Le altre risposte pubblicate finora riguardano l'elaborazione del linguaggio statistico e n-grammi più in generale; le collocazioni sono un argomento secondario specifico.

Crea una matrice per le parole. Quindi se ci sono due parole consecutive, aggiungine una alla cella appropriata.

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

Questo ti darà valori per due parole consecutive. Puoi fare anche questa parola tre parole. Attenzione, richiede memoria O (n ^ 3).

Puoi anche usare un heap per archiviare i dati come:

heap['for example']++;
heap['example you']++;

Un modo sarebbe quello di costruirti un automa. molto probabilmente un automa finito non deterministico (NFA). NFA

Un altro modo più semplice sarebbe quello di creare un file che contenga le parole e / o i gruppi di parole che si desidera ignorare, trovare, confrontare, ecc. e salvarli in memoria all'avvio del programma, quindi è possibile confrontare il file che stai analizzando con i gruppi di parole / parole contenuti nel file.

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