Domanda

Senza conseguire una laurea in recupero di informazioni, mi piacerebbe sapere se esistono algoritmi per contare la frequenza con cui le parole ricorrono in un dato corpo di testo.L'obiettivo è ottenere una "sensazione generale" di ciò che le persone dicono attraverso una serie di commenti testuali.Sulla falsariga di Parole.

Cosa vorrei:

  • ignorare articoli, pronomi, ecc. ("a", "an", "il", "lui", "loro" ecc.)
  • preservare i nomi propri
  • ignora la sillabazione, ad eccezione del tipo morbido

Raggiungendo le stelle, queste sarebbero color pesca:

  • gestire la radice e i plurali (es.Mi piace, Mi piace, Mi è piaciuto, Mi piace corrisponde allo stesso risultato)
  • raggruppamento di aggettivi (avverbi, ecc.) con i relativi soggetti ("ottimo servizio" in contrapposizione a "ottimo", "servizio")

Ho provato alcune cose di base usando Wordnet, ma sto solo modificando le cose alla cieca e spero che funzioni per i miei dati specifici.Qualcosa di più generico sarebbe fantastico.

È stato utile?

Soluzione

Non avrai bisogno di uno, ma di diversi algoritmi interessanti, sulla falsariga di quanto segue.

  • ignorare i pronomi viene fatto tramite a stoplist.
  • preservare i nomi propri?Vuoi dire, rilevare entità con nome, tipo Hoover Diga e dire "è una parola" o nomi composti, come programmazione lingua?Ti do un suggerimento:è difficile, ma esistono librerie per entrambi.Cerca NER (riconoscimento delle entità denominate) e suddivisione lessicale. OpenNLP è un Java-Toolkit che fa entrambe le cose.
  • ignorando la sillabazione?Vuoi dire, tipo durante le interruzioni di riga?Utilizza espressioni regolari e verifica la parola risultante tramite la ricerca nel dizionario.
  • gestire plurali/radice:puoi esaminare il Stelo a palla di neve.Funziona bene.
  • "Raggruppare" gli aggettivi con i loro nomi è generalmente un compito di analisi superficiale.Ma se cerchi specificamente aggettivi qualitativi (buono, cattivo, schifoso, straordinario...) potrebbe interessarti analisi del sentimento. LingPipe fa questo e molto altro ancora.

Mi dispiace, so che hai detto che volevi baciarti, ma sfortunatamente le tue richieste non sono così facili da soddisfare.Tuttavia, esistono strumenti per tutto questo e dovresti essere in grado di collegarli insieme senza dover eseguire alcuna attività da solo, se non lo desideri.Se vuoi svolgere un compito da solo, ti suggerisco di dare un'occhiata allo stemming, è il più semplice di tutti.

Se vai con Java, combina Lucene con il OpenNLP kit di strumenti.Otterrai ottimi risultati, poiché Lucene ha già uno stemmer integrato e molti tutorial.Il toolkit OpenNLP d'altra parte è scarsamente documentato, ma non ti servirà molto.Potrebbe anche interessarti NLTK, scritto in Python.

Direi di abbandonare il tuo ultimo requisito, poiché comporta un'analisi superficiale e sicuramente non migliorerà i tuoi risultati.

Ah, comunque.si chiama il termine esatto di quella cosa-termine-frequenza-documento che stavi cercando tf-idf.È praticamente il modo migliore per cercare la frequenza del documento per i termini.Per farlo correttamente, non dovrai usare matrici vettoriali multidimensionali.

...Sì, lo so.Dopo aver seguito un seminario sull'IR, il mio rispetto per Google è diventato ancora maggiore.Tuttavia, dopo aver fatto alcune cose in IR, il mio rispetto per loro è diminuito altrettanto rapidamente.

Altri suggerimenti

Benvenuti nel mondo della PNL ^_^

Tutto ciò di cui hai bisogno è un po’ di conoscenze di base e alcuni strumenti.

Esistono già strumenti che ti diranno se una parola in una frase è un sostantivo, un aggettivo o un verbo.Sono chiamati tagger di parte del discorso.In genere, prendono l'inglese in chiaro come input e restituiscono la parola, la sua forma base e la parte del discorso.Ecco l'output di un popolare tagger parte del discorso UNIX sulla prima frase del tuo post:

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

Come puoi vedere, ha identificato "algoritmi" come la forma plurale (NNS) di "algoritmo" ed "esiste" come una coniugazione (VBZ) di "esistere". Ha anche identificato "A" e "il" come "determinanti (dt)" - un'altra parola per l'articolo.Come puoi vedere, il tagger POS ha anche tokenizzato la punteggiatura.

Per fare tutto tranne l'ultimo punto della tua lista, devi solo far scorrere il testo attraverso un tagger POS, filtrare le categorie che non ti interessano (determinanti, pronomi, ecc.) e contare le frequenze delle forme base di le parole.

Ecco alcuni tagger POS popolari:

TreeTagger (solo binario:Linux, Solaris, OS-X)
GENIA Tagger (C++:compila te stesso)
Tagger POS Stanford (Giava)

Per fare l'ultima cosa della tua lista, hai bisogno di qualcosa di più delle semplici informazioni a livello di parola.Un modo semplice per iniziare è contare sequenze Di parole piuttosto che solo le parole stesse.Questi sono chiamati n-grammi.Un buon punto di partenza è UNIX per poeti.Se sei disposto a investire in un libro sulla PNL, lo consiglierei Fondamenti dell'elaborazione statistica del linguaggio naturale.

Ecco un esempio di come potresti farlo in Python, i concetti sono simili in qualsiasi linguaggio.

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

La prima riga ottiene solo librerie che aiutano con parti del problema, come nella seconda riga, dove urllib2 scarica una copia del "Dizionario del diavolo" di Ambrose Bierce. Le righe successive creano un elenco di tutte le parole nel testo, senza punteggiatura.Quindi crei una tabella hash, che in questo caso è come un elenco di parole univoche associate a un numero.Il ciclo for ripercorre ogni parola nel libro Bierce, se c'è già un record di quella parola nella tabella, ogni nuova occorrenza aggiunge uno al valore associato a quella parola nella tabella;se la parola non è ancora apparsa, viene aggiunta alla tabella, con il valore 1 (che significa un'occorrenza). Per i casi di cui parli, dovresti prestare molta più attenzione ai dettagli, ad esempio utilizzando le maiuscole per aiutare a identificare i nomi propri solo nel mezzo delle frasi, ecc., questo è molto approssimativo ma esprime il concetto.

Per approfondire le questioni relative alla derivazione e alla pluralizzazione, sperimentare, quindi esaminare il lavoro di terze parti, mi sono piaciute parti di NLTK, che è un progetto accademico open source, anch'esso in Python.

Ho scritto un programma completo per fare proprio questo qualche tempo fa.Posso caricare una demo più tardi quando torno a casa.

Ecco il codice (asp.net/c#):Http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

La prima parte della tua domanda non sembra così male.Tutto quello che devi fare in pratica è leggere ogni parola dal file (o stream w/e) e inserirla in un albero di prefissi e ogni volta che ti imbatti in una parola che già esiste incrementi il ​​valore ad essa associato.Naturalmente avresti anche un elenco da ignorare di tutto ciò che vorresti escludere dai tuoi calcoli.

Se usi un albero dei prefissi ti assicuri che per trovare qualsiasi parola vada a O(N) dove N è la lunghezza massima di una parola nel tuo set di dati.Il vantaggio di un albero dei prefissi in questa situazione è che se vuoi cercare plurali e radice puoi controllare in O(M+1) se ciò è possibile per la parola, dove M è la lunghezza della parola senza radice o pluralità (è una parola?eheh).Una volta costruito l'albero dei prefissi, lo rianalizzerei per le radici e simili e lo condenserei in modo che la parola radice sia ciò che contiene i risultati.

Durante la ricerca potresti avere alcune semplici regole in atto per far sì che la corrispondenza ritorni positiva in caso di radice o radice o cosa hai.

La seconda parte sembra estremamente impegnativa.La mia inclinazione ingenua sarebbe quella di tenere risultati separati per i raggruppamenti aggettivo-soggetto.Usa gli stessi principi di cui sopra ma mantienili separati.

Un'altra opzione per l'analisi semantica potrebbe essere quella di modellare ciascuna frase come un albero di relazioni tra soggetto, verbo, ecc. (La frase ha un soggetto e un verbo, il soggetto ha un sostantivo e un aggettivo, ecc.).Una volta suddiviso tutto il testo in questo modo, sembra che sia abbastanza semplice scorrere e ottenere un rapido conteggio dei diversi abbinamenti appropriati che si sono verificati.

Solo qualche divagazione, sono sicuro che ci siano idee migliori, ma adoro pensare a queste cose.

L'algoritmo che hai appena descritto.Un programma che lo fa immediatamente con un grande pulsante che dice "Fallo"...Non lo so.

Ma permettetemi di essere costruttivo.Ti consiglio questo libro Programmazione dell'intelligenza collettiva.I capitoli 3 e 4 contengono esempi molto pragmatici (in realtà, nessuna teoria complessa, solo esempi).

Puoi utilizzare il dizionario Worldnet per ottenere le informazioni di base della parola chiave della domanda come il suo passato del discorso, estrarre il sinonimo, puoi anche fare lo stesso per il tuo documento per crearne l'indice.quindi puoi facilmente abbinare la parola chiave al file indice e classificare il documento.quindi estivizzarlo.

Tutto ciò che hai elencato è gestito bene da spazio.

  1. Ignora alcune parole: usa parole stop
  2. Estrai oggetto: utilizza parte del tag vocale per identificarlo (funziona immediatamente).Dopo che una frase è stata analizzata, trova "ROOT" - il verbo principale della frase.Di navigare nell'albero di analisi troverai un sostantivo che si riferisce a questo verbo.Sarà l'argomento.
  3. Ignora la sillabazione: il loro tokenizzatore gestisce i trattini nella maggior parte dei casi.Può essere facilmente esteso per gestire casi più speciali.

Se l'elenco degli argomenti è predeterminato e non enorme, potresti anche andare oltre:costruire un modello di classificazione che preveda l'argomento.Diciamo che hai 10 soggetti.Raccogli frasi o testi di esempio.Li carichi in un altro prodotto: prodigio.Utilizzando la sua fantastica interfaccia puoi assegnare rapidamente i soggetti ai campioni.Infine, utilizzando i campioni categorizzati, alleni il modello spaziale per prevedere l'oggetto dei testi o delle frasi.

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