文字シーケンスが英単語かノイズかを判別する方法


11

将来の予測のために単語リストからどのような機能を抽出しようとしますか?それは既存の単語ですか、それとも単なる文字の混乱ですか?

そこで見つけたタスクの説明があります。

あなたは与えられた単語が英語であるかどうかに答えることができるプログラムを書かなければなりません。これは簡単です—辞書で単語を検索する必要があるだけです—しかし、重要な制限があります。プログラムは64 KiBを超えてはいけません。

そのため、問題を解決するためにロジスティック回帰を使用することは可能だと思いました。私はデータマイニングの経験があまりありませんが、その仕事は私にとって興味深いものです。

ありがとう。


文字Nグラム。
Emre、2016

辞書で調べますか?ここで何をしようとしているのか、はっきりしていません。例を上げてください。
Spacedman

申し訳ありませんが、多分私は問題を完全に説明していません。そこで見つけた課題の説明があり ます。与えられた単語が英語かどうかを答えられるプログラムを書かなければなりません。これは簡単です—辞書で単語を検索する必要があるだけです—しかし、重要な制限があります。プログラムは64 KiBを超えてはいけません。 そのため、問題を解決するためにロジスティック回帰を使用することは可能だと思いました。私はデータマイニングの経験があまりありませんが、その仕事は私にとって興味深いものです。
Vitalii Mishchenko

回答:


13

NLPとテキスト分析中に、予測モデリングに使用する単語のドキュメントからいくつかの種類の機能を抽出できます。これらには以下が含まれます。

Nグラム

words.txtからランダムな単語のサンプルを取得します。サンプルの各単語について、可能なすべてのバイグラム文字を抽出します。たとえば、「strength」という単語は次のバイグラムで構成れています:{ sttrreennggtth }。バイグラムでグループ化し、コーパス内の各バイグラムの頻度を計算します。今度は同じことをトライグラムに対して行います... nグラムまでです。この時点で、ローマ字が英語の単語を作成するためにどのように組み合わされるかの頻度分布の大まかな考えがあります。

ngram +単語境界

適切な分析を行うには、おそらく単語の最初と最後にN-gramを示すタグを作成する必要があります(dog- > { ^ ddoogg ^ })-これにより、音韻/正字法をキャプチャできますそれ以外の場合は見逃される可能性のある制約(たとえば、シーケンス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は誤って拒否されます(偽陰性)が、そのグラムシーケンスは非常にまれであり、したがって、多くの差別力をもたらす可能性は低いです。


1
fyi-words.txtからサンプリングする必要はありません。リスト全体を使用するだけです(私はcpl年間ビッグデータの土地にいるので、最初の単語が口から出てくるのは常に「ランダムなサンプルを取る」ですlol)。
Brandon Loudermilk

このコンテストの勝者は、戦略の一部として含まれる可能性がありますが、ngramよりもさらに洞察を追加する可能性が高いと思います。テストの説明では「信じられる」が英語以外の単語がテストセットに含まれていることを示しているため、ngramのみを使用すると多くの誤検知が発生すると思います。
Neil Slater

子音と母音の戦略の一般化は、スキップグラムです。
Emre、2016

@BrandonLoudermilkあなたが共有したサンプルのpythonコードを共有することは可能でしょうか?
iam.Carrot 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.