문자 순서가 영어 단어인지 잡음인지 확인하는 방법


11

향후 예측을 위해 단어 목록에서 어떤 종류의 기능을 추출하려고 시도합니까? 기존 단어입니까 아니면 문자 혼란입니까?

내가 찾은 작업에 대한 설명 있습니다.

주어진 단어가 영어인지 대답 할 수있는 프로그램을 작성해야합니다. 사전에서 단어를 찾아보기 만하면 되기는 쉽지만 중요한 제한이 있습니다. 프로그램이 64KiB를 넘지 않아야합니다.

따라서 문제를 해결하기 위해 로지스틱 회귀를 사용할 수 있다고 생각했습니다. 데이터 마이닝에 대한 경험이 많지 않지만 작업이 흥미 롭습니다.

감사.


문자 N- 그램.
Emre

사전에서 찾아 봐? 여기서 무엇을하려고합니까, 이것은 명확하지 않습니다. 예를 들다.
Spacedman

죄송합니다. 문제를 완전히 설명하지 못했습니다. 내가 찾은 작업에 대한 설명이 있습니다. 당신은 주어진 단어가 영어인지 대답 할 수있는 프로그램을 작성해야합니다. 사전에서 단어를 찾아보기 만하면 되기는 쉽지만 중요한 제한이 있습니다. 프로그램이 64KiB를 넘지 않아야합니다. 따라서 문제를 해결하기 위해 로지스틱 회귀를 사용할 수 있다고 생각했습니다. 데이터 마이닝에 대한 경험이 많지 않지만 작업이 흥미 롭습니다.
Vitalii Mishchenko

답변:


13

NLP 및 텍스트 분석 중에 예측 모델에 사용할 단어 문서에서 여러 가지 기능을 추출 할 수 있습니다. 여기에는 다음이 포함됩니다.

n 그램

words.txt 에서 임의의 단어 샘플을 가져 옵니다 . 표본의 각 단어마다 가능한 모든 바이그램 문자를 추출하십시오 . 예를 들어, 워드 강도 {이러한 양방향 g 구성 , TR , 다시 , EN , , 하였다 , }. 바이그램별로 그룹화하고 코퍼스에서 각 바이그램의 빈도를 계산하십시오. 이제 트라이 그램에서 n 그램까지 똑같은 일을하십시오. 이 시점에서 로마 문자가 결합하여 영어 단어를 만드는 방법의 빈도 분포에 대한 대략적인 아이디어가 있습니다.

ngram + 단어 경계

적절한 분석을하려면 단어의 시작과 끝에 n- 그램을 나타내는 태그를 만들어야합니다 ( dog- > { ^ d , do , og , g ^ })-음운 / 직교를 캡처 할 수 있습니다. 달리 놓칠 수있는 제약 (예를 들어, 시퀀스 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 

프로그램은 들어오는 문자 시퀀스를 입력으로 가져 와서 앞에서 설명한대로 그램으로 나누고 상위 그램 목록과 비교합니다. 분명히 프로그램 크기 요구 사항에 맞게 상위 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 는 올바르게 거부되지만 (진정한 음), barkle 은 영어 단어로 잘못 분류됩니다. (거짓 긍정적)).

흥미롭게도, zyzzyvas 는 실제 영어 단어 (최소한 words.txt 에 따르면 )이기 때문에 zyzzyvas 는 잘못 거부됩니다 (거짓 부정) . 그러나 그람 순서는 극히 드물기 때문에 많은 차별적 힘을 발휘하지는 않습니다.


1
참고-words.txt에서 샘플링 할 필요가 없으며 전체 목록을 사용하십시오 (cpl 년 동안 빅 데이터 랜드에 있었으므로 입에서 나온 첫 단어는 항상 "임의의 샘플을 채취합니다"lol).
Brandon Loudermilk

나는이 경쟁의 승자가 전략의 일부로 그것들을 포함시킬 수도 있지만 ngram보다 더 많은 통찰력을 추가 할 것으로 생각합니다. 테스트 설명에 "믿을만한"이지만 ​​영어 이외의 단어가 테스트 세트에 있음을 암시하기 때문에 ngram 만 사용하면 많은 오탐 (false positive)이 발생한다고 생각합니다.
Neil Slater

자음 및 모음 전략 의 일반화 는 건너 뛰기 입니다.
Emre

@BrandonLoudermilk 공유 한 샘플의 파이썬 코드를 공유 할 수 있습니까?
iam.Carrot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.