Domanda

Sto avendo questo problema con l'identificazione limite di parola. Ho rimosso tutto il markup del documento wikipedia, ora voglio ottenere un elenco di enti. (Termini significativi). Ho in programma di prendere bi-grammi, tri-grammi del documento e verificare se esiste nel dizionario (WordNet). C'è un modo migliore per raggiungere questo obiettivo.

Di seguito è riportato il testo di esempio. Voglio identificare le entità (indicato come circondato da virgolette doppie)

Vulcans are a humanoid species in the fictional "Star Trek" universe who evolved on the planet Vulcan and are noted for their attempt to live by reason and logic with no interference from emotion They were the first extraterrestrial species officially to make first contact with Humans and later became one of the founding members of the "United Federation of Planets"

È stato utile?

Soluzione

Credo che ciò che si sta parlando è davvero ancora un argomento di crescente ricerca piuttosto che una semplice questione di applicare algoritmi ben consolidati.

Non posso darvi un semplice "fare questo" risposta, ma qui ci sono alcune indicazioni al largo della parte superiore della mia testa:

  • Credo che usando WordNet potrebbe funzionare (non sicuro dove bigrammi / trigrammi entrano in esso, però), ma si dovrebbe vedere WordNet ricerche come parte di un sistema ibrido, non è l'essere-tutto e la fine di tutto per avvistare entità con nome
  • poi, iniziare applicando alcuni semplici criteri senso comune (sequenze di parole in maiuscolo; cercare di soddisfare frequenti parole funzionali minuscola come 'di' in essi; sequenze costituiti "titolo noto" più parola capitalisd (s) );
  • sguardo per le sequenze di parole che statisticamente non ci si aspetterebbe di apparire uno accanto all'altro per caso come candidati per le entità;
  • si può costruire in ricerca web dinamico? (Il sistema ha visto la sequenza capitalizzato "IBM" e vede se trova per esempio un wikipedia voce con il modello di testo "IBM è ... [organizzazione | azienda | ...]".
  • vedere se qualcosa qui e nella letteratura "estrazione di informazioni" in generale ti dà alcune idee: http://www-nlpir.nist.gov/related_projects/muc/proceedings/muc_7_toc.html

La verità è che quando si guarda a ciò che la letteratura ci sia là fuori, non sembra come la gente sta usando terribilmente sofisticati algoritmi ben consolidata. Quindi penso che ci sia un sacco di spazio per guardare i dati, l'esplorazione e vedere cosa si può trovare con ... Buona fortuna!

Altri suggerimenti

Se ho capito bene, si sta cercando di estrarre sottostringhe delimitati da virgolette doppie ( ") Si potrebbe utilizzare cattura gruppi nelle espressioni regolari:.

    String text = "Vulcans are a humanoid species in the fictional \"Star Trek\"" +
        " universe who evolved on the planet Vulcan and are noted for their " +
        "attempt to live by reason and logic with no interference from emotion" +
        " They were the first extraterrestrial species officially to make first" +
        " contact with Humans and later became one of the founding members of the" +
        " \"United Federation of Planets\"";
    String[] entities = new String[10];                 // An array to hold matched substrings
    Pattern pattern = Pattern.compile("[\"](.*?)[\"]"); // The regex pattern to use
    Matcher matcher = pattern.matcher(text);            // The matcher - our text - to run the regex on
    int startFrom   = text.indexOf('"');                // The index position of the first " character
    int endAt       = text.lastIndexOf('"');            // The index position of the last " character
    int count       = 0;                                // An index for the array of matches
    while (startFrom <= endAt) {                        // startFrom will be changed to the index position of the end of the last match
        matcher.find(startFrom);                        // Run the regex find() method, starting at the first " character
        entities[count++] = matcher.group(1);           // Add the match to the array, without its " marks
        startFrom = matcher.end();                      // Update the startFrom index position to the end of the matched region
    }

o scrivere un "parser" con le funzioni di stringa:

    int startFrom = text.indexOf('"');                              // The index-position of the first " character
    int nextQuote = text.indexOf('"', startFrom+1);                 // The index-position of the next " character
    int count = 0;                                                  // An index for the array of matches
    while (startFrom > -1) {                                        // Keep looping as long as there is another " character (if there isn't, or if it's index is negative, the value of startFrom will be less-than-or-equal-to -1)
        entities[count++] = text.substring(startFrom+1, nextQuote); // Retrieve the substring and add it to the array
        startFrom = text.indexOf('"', nextQuote+1);                 // Find the next " character after nextQuote
        nextQuote = text.indexOf('"', startFrom+1);                 // Find the next " character after that
    }

In entrambi, il campione di testo è codificato per motivi di esempio e la stessa variabile si presume essere presente (variabile String denominata text).

Se si desidera verificare i contenuti della matrice entities:

    int i = 0;
    while (i < count) {
        System.out.println(entities[i]);
        i++;
    }

Devo avvertirvi, ci possono essere problemi con i casi di confine / contorno (vale a dire quando un "personaggio è all'inizio o alla fine di una stringa. Questi esempi non saranno funzionano come previsto se il parità di "personaggi è irregolare (cioè se v'è un numero dispari di" caratteri nel testo) è possibile utilizzare un semplice parità-check prima mano:.

    static int countQuoteChars(String text) {
        int nextQuote = text.indexOf('"');              // Find the first " character
        int count = 0;                                  // A counter for " characters found
        while (nextQuote != -1) {                       // While there is another " character ahead
            count++;                                    // Increase the count by 1
            nextQuote = text.indexOf('"', nextQuote+1); // Find the next " character
        }
        return count;                                   // Return the result
    }

    static boolean quoteCharacterParity(int numQuotes) {
        if (numQuotes % 2 == 0) { // If the number of " characters modulo 2 is 0
            return true;          // Return true for even
        }
        return false;             // Otherwise return false
    }

Si noti che se numQuotes sembra essere 0 questo metodo restituisce ancora true (perché 0 modulo ogni numero è 0, quindi (count % 2 == 0) sarà true) anche se non si vuole andare avanti con l'analisi se non ci sono "personaggi, in modo che ci si vuole verificare questa condizione da qualche parte.

Spero che questo aiuti!

Qualcun altro ha fatto una domanda simile su come per trovare '' parole interessanti in un corpus di testi . Si consiglia di leggere le risposte. In particolare, di Bolo risposta indica un interessante articolo che utilizza la densità di comparsa di una parola per decidere quanto sia importante --- con l'osservazione che quando un testo parla di qualcosa, di solito si riferisce a qualcosa che abbastanza spesso. Questo articolo è interessante perché la tecnica non richiede la conoscenza preventiva sul testo che è in fase di elaborazione (per esempio, non è necessario un dizionario mirato alla specifica lessico).

L'articolo suggerisce due algoritmi.

Il primo algoritmo tassi singole parole (come "Federation", o "Trek", etc.) in base alla loro importanza misurata. E 'semplice da implementare, e potrei anche fornire una (non molto elegante) implementazione in Python.

Il secondo algoritmo è più interessante in quanto estrae sintagmi nominali (come "Star Trek", etc.) ignorando completamente gli spazi bianchi e l'utilizzo di una struttura ad albero per decidere come dividere sostantivo frasi. I risultati forniti da questo algoritmo quando applicata a testo fondamentale di Darwin sull'evoluzione sono molto impressionanti. Tuttavia, ammetto implementazione di questo algoritmo avrebbe preso un po 'più pensato come alla descrizione fatta dal l'articolo è piuttosto sfuggente, e ciò che più gli autori sembrano un po' difficile da rintracciare. Detto questo, io non spendere molto tempo, in modo da avere più fortuna.

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