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