Во время НЛП и анализа текста можно извлечь несколько разновидностей функций из документа слов, чтобы использовать его для прогнозного моделирования. К ним относятся следующие.
ngrams
Возьмите случайную выборку слов из words.txt . Для каждого слова в образце извлеките все возможные биграммы букв. Например, сила слова состоит из следующих биграмм: { st , tr , re , en , ng , gt , th }. Группируйте по биграммам и вычисляйте частоту каждого биграмма в вашем корпусе. Теперь сделайте то же самое для триграмм, вплоть до n-грамм. На данный момент у вас есть приблизительное представление о распределении частот сочетания римских букв для создания английских слов.
Ngram + словоразделы
Для того, чтобы сделать правильный анализ вероятно , вы должны создать тег для обозначения п-грамм в начале и в конце слова, ( собака -> { ^ д , у , ог , г ^ }) - это позволит вам захватить фонологический / орфографическое ограничения , которые в противном случае могут быть пропущены (например, последовательность нг никогда не может произойти в начале родного английского слова, таким образом , последовательность ^ нг не допускается - одна из причин , почему вьетнамские имена , как Нгуен являются трудно произносить для английского языка) ,
Назовите эту коллекцию граммов word_set . Если вы перевернете сортировку по частоте, ваши наиболее часто встречающиеся граммы будут в верхней части списка - они будут отражать наиболее распространенные последовательности по английским словам. Ниже я покажу некоторые (некрасивый) код с использованием пакета {Ngram} , чтобы извлечь письмо ngrams из слов затем вычислить частоты грамм:
#' 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
Ваша программа будет просто принять входящую последовательность символов в качестве входных данных, разбить его на грамм , как обсуждалась ранее , и сравнить список лучших грамм. Очевидно , вам придется сократить свою верхний п кирку , чтобы соответствовать требованиям размера программы .
согласные и гласные
Другой возможной особенностью или подходом было бы рассмотрение согласных последовательностей гласных. В основном преобразуйте все слова в согласные строки гласных (например, блин -> CVCCVCV ) и следуйте той же стратегии, которая обсуждалась ранее. Эта программа, вероятно, могла бы быть намного меньше, но пострадала бы от точности, потому что она абстрагирует телефоны в устройства высокого порядка.
NCHAR
Еще одной полезной функцией будет длина строки, так как вероятность появления законных английских слов уменьшается с увеличением количества символов.
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"))
Анализ ошибок
Тип ошибок , полученный этого типом машины должен быть бессмысленными словами - слова , которые выглядят , как они должны быть английскими словами , но не (например, ghjrtg будет правильно отклонены (правда отрицательный) , но barkle бы неправильно классифицирована как английское слово (ложный положительный результат)).
Интересно, что zyzzyvas был бы неправильно отклонен (ложно отрицательный), потому что zyzzyvas - это настоящее английское слово (по крайней мере, в соответствии с words.txt ), но его последовательности грамм чрезвычайно редки и, таким образом, вряд ли будут вносить значительную дискриминационную силу.