Come determinare se la sequenza di caratteri è parola inglese o rumore


11

Che tipo di funzionalità proverai ad estrarre dall'elenco di parole per la previsione futura, è una parola esistente o solo un pasticcio di caratteri?

C'è una descrizione dell'attività che ho trovato .

Devi scrivere un programma in grado di rispondere se una determinata parola è inglese. Sarebbe facile - dovresti solo cercare la parola nel dizionario - ma c'è una restrizione importante: il tuo programma non deve essere più grande di 64 KiB.

Quindi, ho pensato che sarebbe stato possibile utilizzare la regressione logistica per risolvere il problema. Non ho molta esperienza con il data mining ma l'attività è interessante per me.

Grazie.


La lettera n-grammi.
Emre,

Cercare in un dizionario? Cosa stai cercando di fare qui, questo non è chiaro. Dare esempi.
Spacedman,

Scusa, forse non ho spiegato completamente il problema. C'è una descrizione dell'attività che ho trovato Devi scrivere un programma in grado di rispondere se una determinata parola è inglese. Sarebbe facile - dovresti solo cercare la parola nel dizionario - ma c'è una restrizione importante: il tuo programma non deve essere più grande di 64 KiB. Quindi, ho pensato che sarebbe stato possibile utilizzare la regressione logistica per risolvere il problema. Non ho molta esperienza con il data mining ma l'attività è interessante per me.
Vitalii Mishchenko,

Risposte:


13

Durante la PNL e l'analisi del testo, è possibile estrarre diverse varietà di funzionalità da un documento di parole da utilizzare per la modellazione predittiva. Questi includono quanto segue.

ngrams

Prendi un campione casuale di parole da words.txt . Per ogni parola nel campione, estrai ogni possibile bi-grammo di lettere. Ad esempio, la parola forza è composta da questi grammi: { st , tr , re , en , ng , gt , th }. Raggruppa per bi-grammo e calcola la frequenza di ogni bi-grammo nel tuo corpus. Ora fai la stessa cosa per i tri-grammi, ... fino a n-grammi. A questo punto hai una vaga idea della distribuzione della frequenza di come le lettere romane si combinano per creare parole inglesi.

ngram + limiti di parole

Per fare un'analisi corretta dovresti probabilmente creare tag per indicare n-grammi all'inizio e alla fine di una parola, ( cane -> { ^ d , do , og , g ^ }) - questo ti permetterebbe di catturare fonologico / ortografico vincoli che potrebbero altrimenti non essere rilevati (ad esempio, la sequenza ng non può mai verificarsi all'inizio di una parola inglese nativa, quindi la sequenza ^ ng non è consentita - uno dei motivi per cui i nomi vietnamiti come Nguyễn sono difficili da pronunciare per chi parla inglese) .

Chiama questa raccolta di grammi word_set . Se inverti l'ordinamento per frequenza, i tuoi grammi più frequenti saranno in cima all'elenco - questi rispecchieranno le sequenze più comuni tra le parole inglesi. Di seguito mostro un po 'di codice (brutto) usando il pacchetto {ngram} per estrarre le lettere ngram dalle parole e poi calcolare le frequenze dei grammi:

#' Return orthographic n-grams for word
#' @param w character vector of length 1
#' @param n integer type of n-gram
#' @return character vector
#' 
getGrams <- function(w, n = 2) {
  require(ngram)
  (w <- gsub("(^[A-Za-z])", "^\\1", w))
  (w <- gsub("([A-Za-z]$)", "\\1^", w))


  # for ngram processing must add spaces between letters
  (ww <- gsub("([A-Za-z^'])", "\\1 \\2", w))
  w <- gsub("[ ]$", "", ww)

  ng <- ngram(w, n = n)
  grams <- get.ngrams(ng)
  out_grams <- sapply(grams, function(gram){return(gsub(" ", "", gram))}) #remove spaces
  return(out_grams)
}

words <- list("dog", "log", "bog", "frog")
res <- sapply(words, FUN = getGrams)
grams <- unlist(as.vector(res))
table(grams)

## ^b ^d ^f ^l bo do fr g^ lo og ro 
##  1  1  1  1  1  1  1  4  1  4  1 

Il tuo programma prenderà semplicemente una sequenza di caratteri in entrata come input, la suddividerà in grammi come discusso in precedenza e confronterà con l'elenco dei primi grammi. Ovviamente dovrai ridurre le tue prime n scelte per adattarle ai requisiti di dimensione del programma .

consonanti e vocali

Un'altra possibile caratteristica o approccio sarebbe quello di esaminare le sequenze vocali consonanti. Fondamentalmente converti tutte le parole in stringhe di consonanti vocali (es. Pancake -> CVCCVCV ) e segui la stessa strategia precedentemente discussa. Questo programma potrebbe probabilmente essere molto più piccolo, ma risentirebbe dell'accuratezza perché estrae i telefoni in unità di alto livello.

nchar

Un'altra caratteristica utile sarà la lunghezza della stringa, poiché la possibilità di parole inglesi legittime diminuisce all'aumentare del numero di caratteri.

library(dplyr)
library(ggplot2)

file_name <- "words.txt"
df <- read.csv(file_name, header = FALSE, stringsAsFactors = FALSE)
names(df) <- c("word")

df$nchar <- sapply(df$word, nchar)
grouped <- dplyr::group_by(df, nchar)
res <- dplyr::summarize(grouped, count = n())
qplot(res$nchar, res$count, geom="path", 
      xlab = "Number of characters", 
      ylab = "Frequency", 
      main = "Distribution of English word lengths in words.txt",
      col=I("red"))

distribuzione delle lunghezze delle parole

Analisi degli errori

Il tipo di errori prodotti da questo tipo di macchina dovrebbe essere parole senza senso - parole che sembrano come se fossero parole inglesi ma che non lo sono (ad esempio, ghjrtg verrebbe correttamente respinto (vero negativo) ma barkle verrebbe erroneamente classificato come una parola inglese (falso positivo)).

È interessante notare che gli zyzzyva verrebbero erroneamente respinti (falso negativo), perché zyzzyvas è una vera parola inglese (almeno secondo words.txt ), ma le sue sequenze di grammi sono estremamente rare e quindi non contribuiranno con molta forza discriminatoria.


1
a proposito - non c'è bisogno di campionare da words.txt, basta usare l'intero elenco (sono stato in big data land per un anno cpl quindi le prime parole dalla mia bocca sono sempre "prendere un campione casuale" lol).
Brandon Loudermilk,

Penso che il vincitore di questa competizione aggiungerà probabilmente ulteriori approfondimenti rispetto agli ngram, sebbene possa includerli come parte della strategia. Penso che l'uso dei soli ngram porti a molti falsi positivi, poiché la descrizione del test implica che nel set di test ci sono parole "credibili" ma non inglesi.
Neil Slater,

Una generalizzazione della strategia di consonanti e vocali è di saltare i grammi .
Emre,

@BrandonLoudermilk sarebbe possibile condividere il codice Python per gli esempi che hai condiviso?
iam.Carrot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.