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