如何确定字符序列是英文单词还是杂音


11

您将尝试从单词列表中提取什么样的功能以供将来预测,是现有单词还是仅是字符混乱?

我在那儿找到了对任务的描述。

您必须编写一个程序来回答给定单词是否为英语。这很容易-您只需要在词典中查找单词-但有一个重要限制:您的程序不得大于64 KiB。

因此,我认为可以使用逻辑回归来解决问题。我没有大量的数据挖掘经验,但是这项任务对我来说很有趣。

谢谢。


字母n克。
Emre

在字典中查找吗?您要在这里做什么,目前尚不清楚。举个例子。
Spacedman '16

抱歉,也许我没有完全解释问题。我在那里 找到了对任务的描述。您必须编写一个程序来回答给定单词是否为英语。这很容易-您只需要在词典中查找单词-但有一个重要限制:您的程序不得大于64 KiB。 因此,我认为可以使用逻辑回归来解决问题。我没有大量的数据挖掘经验,但是这项任务对我来说很有趣。
Vitalii Mishchenko

Answers:


13

在NLP和文本分析过程中,可以从单词文档中提取几种特征,以用于预测建模。这些包括以下内容。

语法

words.txt中随机抽取单词。对于样本中的每个单词,提取每个可能的二元字母。例如,单词强度包括以下两个字母组合:{ sttrreennggtth }。按字母组合进行分组,并计算语料库中每个字母组合的频率。现在,对三元语法执行相同的操作,...一直到n元语法。至此,您对罗马字母如何组合以创建英语单词的频率分布有了一个大概的了解。

ngram +单词边界

为了进行适当的分析,您可能应该创建标记以在单词的开头和结尾指示n-元组(dog- > { ^ ddoogg ^ })-这将允许您捕获语音/正字否则可能会丢失的约束(例如,序列ng永远不会出现在英语单词的开头,因此序列ng是不允许的-越南语如Nguyễn难以为英语使用者发音的原因之一) 。

将此克集合称为word_set。如果按频率反向排序,则最常见的克数将位于列表的顶部-这些数字将反映英语单词中最常见的序列。下面,我展示一些使用软件包{ngram}的(丑陋的)代码,从单词中提取字母ngram,然后计算语法频率:

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

您的程序仅将输入的字符序列作为输入,如前所述将其分解为g,然后与前g的列表进行比较。显然,您必须减少您的前n个选择以适应程序大小的要求

辅音和元音

另一个可能的特征或方法是查看辅音元音序列。基本上将所有的话中声母韵母字符串(如煎饼 - > 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将被正确拒绝(真否定),但巴克勒将错误地归类为英语单词) (假阳性))。

有趣的是,zyzzyvas将被错误地拒绝(错误否定),因为zyzzyvas是一个真实的英语单词(至少根据words.txt而言),但是其gram序列非常少见,因此不太可能产生很大的辨别力。


1
仅供参考-无需从word.txt进行采样,只需使用整个列表即可(我进入大数据领域已有cpl年,所以从我嘴里出来的第一个单词总是“随机抽取”大声笑)。
布兰登·劳德米尔克

我认为本次竞赛的获胜者可能会比ngrams提供更多的见解,尽管它很可能会将其作为策略的一部分。我认为仅使用ngram会导致许多误报,因为测试描述暗示“可信”但非英语单词出现在测试集中。
尼尔·斯莱特

辅音和元音策略的概括是skip-grams
Emre

@BrandonLoudermilk是否可以为您共享的样本共享python代码?
iam.Carrot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.