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


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.