Как определить, является ли последовательность символов английским словом или шумом

11

Какие функции вы будете пытаться извлечь из списка слов для будущего предсказания, это уже существующее слово или просто беспорядок символов?

Там есть описание задачи, которую я там нашел .

Вы должны написать программу, которая может ответить, является ли данное слово английским. Это было бы легко - вам просто нужно поискать слово в словаре - но есть важное ограничение: ваша программа не должна быть больше 64 КиБ.

Поэтому я подумал, что можно было бы использовать логистическую регрессию для решения проблемы. У меня нет большого опыта в области интеллектуального анализа данных, но эта задача мне интересна.

Спасибо.

Виталий Мищенко
источник
Буква н-грамм.
Эмре
Посмотри в словаре? Что вы пытаетесь сделать здесь, это не ясно. Привести примеры.
Spacedman
Извините, возможно я не объяснил проблему полностью. Там есть описание задачи, которую я нашел там. Вы должны написать программу, которая может ответить, является ли данное слово английским. Это было бы легко - вам просто нужно поискать слово в словаре - но есть важное ограничение: ваша программа не должна быть больше 64 КиБ. Поэтому я подумал, что можно было бы использовать логистическую регрессию для решения проблемы. У меня нет большого опыта в области интеллектуального анализа данных, но эта задача мне интересна.
Виталий Мищенко

Ответы:

13

Во время НЛП и анализа текста можно извлечь несколько разновидностей функций из документа слов, чтобы использовать его для прогнозного моделирования. К ним относятся следующие.

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 ), но его последовательности грамм чрезвычайно редки и, таким образом, вряд ли будут вносить значительную дискриминационную силу.

Брэндон Лудермилк
источник
1
fyi - не нужно делать выборки из words.txt, просто используйте весь список (я был в стране больших данных в течение нескольких лет, так что первые слова из моего рта всегда "беру случайную выборку", lol).
Brandon Loudermilk
Я думаю, что победитель этого конкурса, скорее всего, добавит более глубокое понимание, чем нграммы, хотя вполне может включить их в состав стратегии. Я думаю, что использование только ngrams приведет к множеству ложных срабатываний, поскольку описание теста подразумевает, что в тестовом наборе присутствуют «правдоподобные», но не английские слова.
Нил Слейтер
Обобщением вашей стратегии согласных и гласных является скип-грамм .
Эмре
@BrandonLoudermilk, можно ли поделиться кодом Python для примеров, которыми вы поделились?
iam.Carrot