में एनजीआरएम टोकन की सूची से प्रभावी ढंग से स्टॉपवर्ड को कैसे हटाएं, यह कुछ ऐसा करने का बेहतर तरीका है जो मैं पहले से ही अक्षम कर सकता हूं: "स्टॉप शब्द" का उपयोग करके एन-ग्राम टोकन की एक श्रृंखला फ़िल्टर करें ताकि एन-ग्राम ट्रिगर हटाने में किसी भी स्टॉप शब्द शब्द की घटना।आर
मुझे एक ऐसा समाधान होना पसंद है जो यूनिग्राम और एन-ग्राम दोनों के लिए काम करता है, हालांकि यह दो संस्करणों के साथ ठीक होगा, एक "निश्चित" ध्वज वाला और एक "रेगेक्स" ध्वज वाला होगा। मैं प्रश्न के दो पहलुओं को एक साथ रख रहा हूं क्योंकि किसी के पास ऐसा समाधान हो सकता है जो एक अलग दृष्टिकोण की कोशिश करता है जो निश्चित और नियमित अभिव्यक्ति स्टॉपवर्ड पैटर्न दोनों को संबोधित करता है।
प्रारूप:
टोकन चरित्र वैक्टर, जो unigrams, या एन-ग्राम एक
_
(अंडरस्कोर) चरित्र से श्रेणीबद्ध किया जा सकता है की एक सूची है।स्टॉपवर्ड एक चरित्र वेक्टर हैं। अभी मैं इसे एक निश्चित स्ट्रिंग होने के लिए संतुष्ट हूं, लेकिन नियमित अभिव्यक्ति स्वरूपित स्टॉपवर्ड का उपयोग करके इसे लागू करने में सक्षम होने के लिए यह एक अच्छा बोनस होगा।
वांछित आउटपुट: इनपुट मिलान टोकन लेकिन एक रोक शब्द मिलान किसी भी घटक टोकन के माध्यम से वर्णों की एक सूची से हटाया जा रहा है। (यह एक unigram मैच, या शर्तों जो एन-ग्राम शामिल हैं में से एक के लिए एक मैच का मतलब है।)
उदाहरण, परीक्षण डाटा, और काम कर कोड और मानक पर निर्माण करने के लिए:
tokens1 <- list(text1 = c("this", "is", "a", "test", "text", "with", "a", "few", "words"),
text2 = c("some", "more", "words", "in", "this", "test", "text"))
tokens2 <- list(text1 = c("this_is", "is_a", "a_test", "test_text", "text_with", "with_a", "a_few", "few_words"),
text2 = c("some_more", "more_words", "words_in", "in_this", "this_text", "text_text"))
tokens3 <- list(text1 = c("this_is_a", "is_a_test", "a_test_text", "test_text_with", "text_with_a", "with_a_few", "a_few_words"),
text2 = c("some_more_words", "more_words_in", "words_in_this", "in_this_text", "this_text_text"))
stopwords <- c("is", "a", "in", "this")
# remove any single token that matches a stopword
removeTokensOP1 <- function(w, stopwords) {
lapply(w, function(x) x[-which(x %in% stopwords)])
}
# remove any word pair where a single word contains a stopword
removeTokensOP2 <- function(w, stopwords) {
matchPattern <- paste0("(^|_)", paste(stopwords, collapse = "(_|$)|(^|_)"), "(_|$)")
lapply(w, function(x) x[-grep(matchPattern, x)])
}
removeTokensOP1(tokens1, stopwords)
## $text1
## [1] "test" "text" "with" "few" "words"
##
## $text2
## [1] "some" "more" "words" "test" "text"
removeTokensOP2(tokens1, stopwords)
## $text1
## [1] "test" "text" "with" "few" "words"
##
## $text2
## [1] "some" "more" "words" "test" "text"
removeTokensOP2(tokens2, stopwords)
## $text1
## [1] "test_text" "text_with" "few_words"
##
## $text2
## [1] "some_more" "more_words" "text_text"
removeTokensOP2(tokens3, stopwords)
## $text1
## [1] "test_text_with"
##
## $text2
## [1] "some_more_words"
# performance benchmarks for answers to build on
require(microbenchmark)
microbenchmark(OP1_1 = removeTokensOP1(tokens1, stopwords),
OP2_1 = removeTokensOP2(tokens1, stopwords),
OP2_2 = removeTokensOP2(tokens2, stopwords),
OP2_3 = removeTokensOP2(tokens3, stopwords),
unit = "relative")
## Unit: relative
## expr min lq mean median uq max neval
## OP1_1 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 100
## OP2_1 5.119066 3.812845 3.438076 3.714492 3.547187 2.838351 100
## OP2_2 5.230429 3.903135 3.509935 3.790143 3.631305 2.510629 100
## OP2_3 5.204924 3.884746 3.578178 3.753979 3.553729 8.240244 100
टीएम या qdap में stopwords हटाने की विधि पर्याप्त नहीं है? हालांकि वे दूसरी तरफ काम करते हैं, पहले स्टॉपवर्ड को हटा दें और फिर एन-ग्राम बनाएं। – phiver
नहीं, यह काफी आसान है, मैं निर्माण के बाद स्टॉपवर्ड युक्त एनजीआरएम को हटाने का एक प्रभावी तरीका जानने की कोशिश कर रहा हूं। –
क्या आपने टाइटलर रिंकर के नए पैकेज की जांच की है, जिथब पर टर्मको? यह आशाजनक लग रहा है। अभी तक इसे देखने के लिए समय नहीं है। – phiver