วิธีการตรวจสอบว่าลำดับตัวละครเป็นคำภาษาอังกฤษหรือเสียงรบกวน


11

ฟีเจอร์ประเภทใดที่คุณจะพยายามแยกออกจากรายการคำศัพท์สำหรับการทำนายอนาคตมันเป็นคำที่มีอยู่หรือเป็นแค่ตัวละคร?

มีรายละเอียดของงานที่ผมพบคือมี

คุณต้องเขียนโปรแกรมที่สามารถตอบได้ว่าคำที่กำหนดเป็นภาษาอังกฤษหรือไม่ นี่จะเป็นเรื่องง่าย - คุณเพียงแค่ต้องค้นหาคำในพจนานุกรม - แต่มีข้อ จำกัด ที่สำคัญ: โปรแกรมของคุณต้องมีขนาดไม่เกิน 64 KiB

ดังนั้นฉันคิดว่ามันจะเป็นไปได้ที่จะใช้การถดถอยโลจิสติกในการแก้ปัญหา ฉันไม่มีประสบการณ์ในการขุดข้อมูลมากนัก แต่งานนั้นน่าสนใจสำหรับฉัน

ขอบคุณ


ตัวอักษร n-grams
เอ็ม

ค้นหาในพจนานุกรมหรือไม่ คุณกำลังพยายามทำอะไรที่นี่ไม่ชัดเจน ยกตัวอย่าง.
Spacedman

ขออภัยฉันอาจไม่ได้อธิบายปัญหาอย่างสมบูรณ์ มีคำอธิบายของงานที่ฉันพบที่นั่น คุณต้องเขียนโปรแกรมที่สามารถตอบได้ว่าคำที่กำหนดเป็นภาษาอังกฤษหรือไม่ นี่จะเป็นเรื่องง่าย - คุณเพียงแค่ต้องค้นหาคำในพจนานุกรม - แต่มีข้อ จำกัด ที่สำคัญ: โปรแกรมของคุณต้องมีขนาดไม่เกิน 64 KiB ดังนั้นฉันคิดว่ามันจะเป็นไปได้ที่จะใช้การถดถอยโลจิสติกในการแก้ปัญหา ฉันไม่มีประสบการณ์ในการขุดข้อมูลมากนัก แต่งานนั้นน่าสนใจสำหรับฉัน
Vitalii Mishchenko

คำตอบ:


13

ในระหว่าง 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 ) แต่ลำดับของกรัมนั้นหายากมากและไม่น่าจะมีอำนาจในการเลือกปฏิบัติมากนัก


1
fyi - ไม่จำเป็นต้องสุ่มตัวอย่างจาก word.txt เพียงใช้รายการทั้งหมด (ฉันอยู่ในพื้นที่เก็บข้อมูลขนาดใหญ่เป็นเวลาหลายปี cpl ดังนั้นคำแรกที่ออกจากปากของฉันมักจะ "สุ่มตัวอย่าง" lol)
Brandon Loudermilk

ฉันคิดว่าผู้ชนะการแข่งขันนี้มีแนวโน้มที่จะเพิ่มข้อมูลเชิงลึกมากกว่า ngrams ถึงแม้ว่ามันอาจรวมไว้เป็นส่วนหนึ่งของกลยุทธ์ ฉันคิดว่าการใช้ ngrams เพียงอย่างเดียวจะทำให้เกิดผลบวกปลอมหลายอย่างเนื่องจากคำอธิบายการทดสอบมีความหมายว่า "เชื่อได้" แต่คำที่ไม่ใช่ภาษาอังกฤษอยู่ในชุดทดสอบ
Neil Slater

ลักษณะทั่วไปของคุณพยัญชนะและสระกลยุทธ์ข้ามกรัม
เอ็ม

@BrandonLoudermilk เป็นไปได้ไหมที่จะแบ่งปันรหัสไพ ธ อนสำหรับตัวอย่างที่คุณแชร์ไว้
iam.Carrot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.