NLPとテキスト分析中に、予測モデリングに使用する単語のドキュメントからいくつかの種類の機能を抽出できます。これらには以下が含まれます。
Nグラム
words.txtからランダムな単語のサンプルを取得します。サンプルの各単語について、可能なすべてのバイグラム文字を抽出します。たとえば、「strength」という単語は次のバイグラムで構成されています:{ st、tr、re、en、ng、gt、th }。バイグラムでグループ化し、コーパス内の各バイグラムの頻度を計算します。今度は同じことをトライグラムに対して行います... nグラムまでです。この時点で、ローマ字が英語の単語を作成するためにどのように組み合わされるかの頻度分布の大まかな考えがあります。
ngram +単語境界
適切な分析を行うには、おそらく単語の最初と最後にN-gramを示すタグを作成する必要があります(dog- > { ^ d、do、og、g ^ })-これにより、音韻/正字法をキャプチャできますそれ以外の場合は見逃される可能性のある制約(たとえば、シーケンスngはネイティブの英語の単語の先頭では決して発生しないため、シーケンス^ ngは許可されません-Nguyễnなどのベトナム語の名前が英語を話す人にとって発音しにくい理由の1つ) 。
このグラムのコレクションを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
プログラムは入力文字列を入力として受け取り、前述のようにそれをグラムに分割し、上位のグラムのリストと比較します。明らかに、プログラムサイズの要件に合わせるには、上位n個の候補を減らす必要があります。
子音と母音
別の可能な機能またはアプローチは、子音の母音シーケンスを調べることです。基本的には子音母音文字列ですべての単語を変換する(例えば、パンケーキ - > CVCCVCV)と、以前に説明したのと同じ戦略に従います。このプログラムはおそらくはるかに小さい可能性がありますが、電話を高次のユニットに抽象化するため、精度に影響します。
nchar
もう1つの便利な機能は文字列の長さです。文字数が増えると、正当な英単語の可能性が減ります。
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は実際には英語の単語であるため(少なくともwords.txtによると)、zyzzyvasは誤って拒否されます(偽陰性)が、そのグラムシーケンスは非常にまれであり、したがって、多くの差別力をもたらす可能性は低いです。