So bestimmen Sie, ob die Zeichenfolge ein englisches Wort oder ein Rauschen ist

11

Welche Art von Funktionen werden Sie versuchen, aus der Liste der Wörter für zukünftige Vorhersagen zu extrahieren? Ist es ein vorhandenes Wort oder nur ein Durcheinander von Zeichen?

Es gibt Beschreibung der Aufgabe , die ich fand es .

Sie müssen ein Programm schreiben, das antworten kann, ob ein bestimmtes Wort Englisch ist. Dies wäre einfach - Sie müssten nur das Wort im Wörterbuch nachschlagen -, aber es gibt eine wichtige Einschränkung: Ihr Programm darf nicht größer als 64 KB sein.

Daher dachte ich, es wäre möglich, die logistische Regression zur Lösung des Problems zu verwenden. Ich habe nicht viel Erfahrung mit Data Mining, aber die Aufgabe ist für mich interessant.

Vielen Dank.

Vitalii Mishchenko
quelle
Der Buchstabe n-Gramm.
Emre
In einem Wörterbuch nachschlagen? Was versuchst du hier zu tun, das ist nicht klar. Nenne Beispiele.
Spacedman
Entschuldigung, vielleicht habe ich das Problem nicht vollständig erklärt. Es gibt Beschreibung der Aufgabe , die ich fand es müssen Sie ein Programm schreiben, ob ein gegebenes Wort Englisch beantworten kann. Dies wäre einfach - Sie müssten nur das Wort im Wörterbuch nachschlagen -, aber es gibt eine wichtige Einschränkung: Ihr Programm darf nicht größer als 64 KB sein. Daher dachte ich, es wäre möglich, die logistische Regression zur Lösung des Problems zu verwenden. Ich habe nicht viel Erfahrung mit Data Mining, aber die Aufgabe ist für mich interessant.
Vitalii Mishchenko

Antworten:

13

Während der NLP- und Textanalyse können verschiedene Arten von Funktionen aus einem Wortdokument extrahiert werden, um sie für die Vorhersagemodellierung zu verwenden. Dazu gehören die folgenden.

ngrams

Nehmen Sie eine zufällige Auswahl von Wörtern aus words.txt . Extrahieren Sie für jedes Wort in der Stichprobe jedes mögliche Bi-Gramm Buchstaben. Zum Beispiel besteht die Wortstärke aus diesen Bi-Gramm: { st , tr , re , en , ng , gt , th }. Gruppieren Sie nach Bi-Gramm und berechnen Sie die Häufigkeit jedes Bi-Gramms in Ihrem Korpus. Machen Sie jetzt dasselbe für Tri-Gramm, ... bis hin zu n-Gramm. An diesem Punkt haben Sie eine ungefähre Vorstellung von der Häufigkeitsverteilung, wie römische Buchstaben zu englischen Wörtern kombiniert werden.

ngram + Wortgrenzen

Um eine ordnungsgemäße Analyse durchzuführen, sollten Sie wahrscheinlich Tags erstellen, die n-Gramm am Anfang und Ende eines Wortes angeben ( Hund -> { ^ d , do , og , g ^ }). Auf diese Weise können Sie phonologisch / orthografisch erfassen Einschränkungen, die sonst möglicherweise übersehen würden (z. B. kann die Sequenz ng niemals am Anfang eines englischen Muttersprachlers auftreten, daher ist die Sequenz ^ ng nicht zulässig - einer der Gründe, warum vietnamesische Namen wie Nguyễn für englischsprachige Personen schwer auszusprechen sind). .

Nennen Sie diese Grammsammlung das word_set . Wenn Sie die Sortierung nach Häufigkeit umkehren, stehen Ihre häufigsten Gramme ganz oben auf der Liste - diese spiegeln die häufigsten Sequenzen in englischen Wörtern wider. Unten zeige ich einen (hässlichen) Code mit dem Paket {ngram} , um den Buchstaben ngrams aus Wörtern zu extrahieren und dann die Grammfrequenzen zu berechnen:

#' 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 

Ihr Programm nimmt nur eine eingehende Zeichenfolge als Eingabe, teilt sie wie zuvor beschrieben in Gramm auf und vergleicht sie mit der Liste der Top-Gramm. Natürlich müssen Sie Ihre Top- N-Picks reduzieren , um die Anforderungen an die Programmgröße zu erfüllen .

Konsonanten & Vokale

Ein weiteres mögliches Merkmal oder ein möglicher Ansatz wäre die Betrachtung von Konsonantenvokalsequenzen. Konvertieren Sie grundsätzlich alle Wörter in Konsonanten-Vokalzeichenfolgen (z. B. Pfannkuchen -> CVCCVCV ) und folgen Sie der zuvor beschriebenen Strategie. Dieses Programm könnte wahrscheinlich viel kleiner sein, würde aber unter Genauigkeit leiden, da es Telefone in Einheiten höherer Ordnung abstrahiert.

nchar

Ein weiteres nützliches Merkmal ist die Länge der Zeichenfolge, da die Möglichkeit für legitime englische Wörter mit zunehmender Anzahl von Zeichen abnimmt.

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"))

Verteilung der Wortlängen

Fehleranalyse

Die Art der Fehler, die von diesem Maschinentyp erzeugt werden, sollten unsinnige Wörter sein - Wörter, die so aussehen, als wären sie englische Wörter, die es aber nicht sind (z. B. würde ghjrtg korrekt zurückgewiesen (wahres Negativ), aber barkle würde fälschlicherweise als englisches Wort klassifiziert (falsch positiv)).

Interessanterweise würden Zyzzyvas fälschlicherweise abgelehnt (falsch negativ), da Zyzzyvas ein echtes englisches Wort ist (zumindest laut words.txt ), aber seine Grammsequenzen sind äußerst selten und tragen daher wahrscheinlich nicht viel Diskriminierungskraft bei.

Brandon Loudermilk
quelle
1
fyi - keine Notwendigkeit, aus words.txt zu probieren, benutze einfach die gesamte Liste (ich bin seit cpl Jahren im Big-Data-Land, also sind die ersten Wörter aus meinem Mund immer "nimm eine Zufallsstichprobe" lol).
Brandon Loudermilk
Ich denke, der Gewinner dieses Wettbewerbs wird wahrscheinlich weitere Erkenntnisse als ngrams hinzufügen, obwohl er sie möglicherweise als Teil der Strategie einbezieht. Ich denke, dass die Verwendung von ausschließlich ngrammen zu vielen Fehlalarmen führen wird, da die Testbeschreibung impliziert, dass "glaubwürdige", aber nicht englische Wörter im Testsatz enthalten sind.
Neil Slater
Eine Verallgemeinerung Ihrer Konsonanten- und Vokalstrategie ist das Überspringen von Gramm .
Emre
@BrandonLoudermilk Wäre es möglich, den Python-Code für die von Ihnen freigegebenen Beispiele freizugeben?
iam.Carrot