ในระหว่าง NLP และการวิเคราะห์ข้อความคุณลักษณะที่หลากหลายสามารถแยกได้จากเอกสารคำที่ใช้สำหรับการสร้างแบบจำลองการทำนาย เหล่านี้รวมถึงต่อไปนี้
ngrams
ใช้ตัวอย่างที่สุ่มจากคำจากwords.txt สำหรับแต่ละคำในตัวอย่างให้ดึงทุกตัวอักษรสองกรัมที่เป็นไปได้ ตัวอย่างเช่นความแข็งแรงของคำประกอบด้วย bi-grams เหล่านี้: { st , tr , re , en , ng , gt , th } จัดกลุ่มตามไบแกรมและคำนวณความถี่ของแต่ละแกรมในคลังของคุณ ทีนี้ทำสิ่งเดียวกันนี้กับไตรกรัม, ... จนถึง n-grams ณ จุดนี้คุณมีความคิดคร่าวๆของการกระจายความถี่ของตัวอักษรโรมันรวมกันเพื่อสร้างคำภาษาอังกฤษ
ขอบเขตคำ + ngram
ในการวิเคราะห์ที่ถูกต้องคุณควรสร้างแท็กเพื่อระบุ n-g ที่จุดเริ่มต้นและจุดสิ้นสุดของคำ ( dog -> { ^ d , do , og , g ^ }) - สิ่งนี้จะช่วยให้คุณสามารถบันทึกเสียง / orthographic ข้อ จำกัด ที่ไม่ควรพลาด (เช่นลำดับngไม่สามารถเกิดขึ้นได้ที่จุดเริ่มต้นของคำภาษาอังกฤษดั้งเดิมดังนั้นลำดับ^ ngไม่อนุญาต - หนึ่งในเหตุผลที่ชื่อภาษาเวียดนามเช่นNguyễnยากที่จะออกเสียงสำหรับผู้พูดภาษาอังกฤษ) .
โทรคอลเลกชันของกรัมนี้word_set หากคุณกลับเรียงลำดับตามความถี่กรัมที่พบบ่อยที่สุดของคุณจะอยู่ที่ด้านบนของรายการ - สิ่งเหล่านี้จะสะท้อนลำดับที่พบบ่อยที่สุดในคำภาษาอังกฤษ ด้านล่างฉันจะแสดงบางรหัส (น่าเกลียด) โดยใช้แพคเกจ{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เพื่อให้พอดีกับขนาดของโปรแกรม
พยัญชนะและสระ
คุณสมบัติหรือวิธีการอื่นที่เป็นไปได้คือการดูลำดับเสียงสระของพยัญชนะ โดยทั่วไปจะแปลงคำทั้งหมดในสตริงสระพยัญชนะ (เช่นpancake -> 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จะถูกปฏิเสธอย่างไม่ถูกต้อง (false positive) เพราะzyzzyvasเป็นคำภาษาอังกฤษจริง (อย่างน้อยตามword.txt ) แต่ลำดับของกรัมนั้นหายากมากและไม่น่าจะมีอำนาจในการเลือกปฏิบัติมากนัก