Karakter dizisinin İngilizce sözcük veya gürültü olup olmadığını belirleme


11

Gelecek tahmin etmek için kelime listesinden ne tür özellikler çıkarmaya çalışacaksınız, mevcut kelime mi yoksa sadece karakter karışıklığı mı?

Orada bulduğum görevin tanımı var .

Belirli bir kelimenin İngilizce olup olmadığını cevaplayabilecek bir program yazmalısınız. Bu kolay olurdu - sadece sözlüğe bakmanız gerekir - ancak önemli bir kısıtlama vardır: programınız 64 KiB'den büyük olmamalıdır.

Bu yüzden, problemi çözmek için lojistik regresyonu kullanmanın mümkün olacağını düşündüm. Veri madenciliği konusunda çok fazla tecrübem yok ama görev benim için ilginç.

Teşekkürler.


N-gram harfi.
Emre

Sözlükten mi bakıyorsunuz? Burada ne yapmaya çalışıyorsun, bu belli değil. Örnekler ver.
Spacedman

Üzgünüm, belki problemi tam olarak açıklamamıştım. Orada bulduğum görevin tanımı var Belirli bir kelimenin İngilizce olup olmadığını cevaplayabilecek bir program yazmanız gerekiyor. Bu kolay olurdu - sadece sözlüğe bakmanız gerekir - ancak önemli bir kısıtlama vardır: programınız 64 KiB'den büyük olmamalıdır. Bu yüzden, problemi çözmek için lojistik regresyonu kullanmanın mümkün olacağını düşündüm. Veri madenciliği konusunda çok fazla tecrübem yok ama görev benim için ilginç.
Vitalii Mishchenko

Yanıtlar:


13

NLP ve metin analizi sırasında, tahmin modellemesi için kullanılacak bir kelime belgesinden çeşitli özellikler çıkarılabilir. Bunlar aşağıdakileri içerir.

ngrams

Words.txt dosyasından rastgele bir kelime örneği alın . Örnekteki her kelime için, olası her iki gramlık harfi çıkarın . Örneğin, güç kelimesi şu iki gramdan oluşur: { st , tr , re , en , ng , gt , th }. Bigrama göre gruplandırın ve korpusunuzdaki her bi gramın sıklığını hesaplayın. Şimdi aynı şeyi üç gram için de yapın, ... en fazla n grama kadar. Bu noktada, Roma harflerinin İngilizce kelimeler oluşturmak için nasıl birleştirildiğine dair kabaca bir fikriniz var.

ngram + kelime sınırları

Düzgün bir analiz yapmak için muhtemelen bir kelimenin başlangıcında ve sonunda n-gram belirtecek etiketler oluşturmanız gerekir ( köpek -> { ^ d , do , og , g ^ }) - bu fonolojik / ortografik olarak yakalamanıza izin verir aksi kaçırmış olabilir kısıtlamalar (örneğin, sekans ng , ana dili İngilizce kelimenin başında dolayısıyla dizisini meydana asla ^ ng değildir müsaade - gibi Vietnam isimler nedenlerinden biri Nguyễn İngilizce konuşanlar için telaffuz zor) .

Bu gram koleksiyonunu word_set olarak adlandırın . Frekansa göre sıralamayı tersine çevirirseniz, en sık kullandığınız gramlar listenin en üstünde yer alır - bunlar İngilizce kelimeler arasında en yaygın dizileri yansıtır. Aşağıda harf ngramlarını kelimelerden çıkarmak ve gram frekanslarını hesaplamak için {ngram} paketini kullanarak bazı (çirkin) kodları göstereceğim :

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

Programınız yalnızca gelen bir karakter dizisini girdi olarak alır, daha önce tartışıldığı gibi gramlara böler ve üst gramların listesiyle karşılaştırır. Açıkçası en büyük seçimlerinizi program boyutu gereksinimine uyacak şekilde azaltmanız gerekecektir .

ünsüzler ve ünlüler

Başka bir olası özellik veya yaklaşım, ünsüz sesli harf dizilerine bakmak olacaktır. Temel olarak ünsüz sesli harf dizelerindeki tüm kelimeleri dönüştürün (örneğin, gözleme -> CVCCVCV ) ve daha önce tartışılan stratejiyi takip edin. Bu program muhtemelen çok daha küçük olabilir, ancak telefonları yüksek dereceli birimlere soyutladığı için doğruluktan muzdarip olacaktır.

nchar

Karakterlerin sayısı arttıkça meşru İngilizce sözcüklerin olasılığı azaldıkça, bir başka yararlı özellik dize uzunluğu olacaktır.

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"))

kelime uzunluklarının dağılımı

Hata analizi

Bu tür bir makine tarafından üretilen hataların türü saçmalık kelimeler olmalıdır - İngilizce kelimeler olmalı gibi görünen, ancak olmayan (örneğin, ghjrtg doğru bir şekilde reddedilecek (gerçek negatif) ama kabuk yanlış bir İngilizce kelime olarak sınıflandırılacaktır. (yanlış pozitif)).

İlginçtir, zyzzyvas yanlış bir şekilde reddedilir (yanlış negatif), çünkü zyzzyvas gerçek bir İngilizce kelimesidir (en azından words.txt'ye göre ), ancak gram dizileri son derece nadirdir ve bu nedenle çok fazla ayrımcı güce katkıda bulunma olasılığı yoktur.


1
fyi - word.txt'den örneklemeye gerek yok, sadece tüm listeyi kullanın (ağzımdan ilk kelimeler her zaman "rastgele bir örnek almak" lol böylece ben bir cpl yıldır büyük veri arazi olmuştur.
Brandon Loudermilk

Bence bu yarışmanın galibi ngramlardan biraz daha fazla içgörü katacak, ancak stratejinin bir parçası olarak da dahil edebilir. Test açıklaması "inandırıcı" ancak İngilizce olmayan kelimelerin test setinde olduğunu ima ettiği için, yalnızca ngramların kullanılmasının birçok yanlış pozitifliğe yol açacağını düşünüyorum.
Neil Slater

Ünsüzler ve ünlüler stratejinizin genelleştirilmesi atlama gramlarıdır .
Emre

@BrandonLoudermilk, paylaştığınız örneklerin python kodunu paylaşmak mümkün mü?
iam.Crotrot
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.