2014-06-27 7 views
12

मैं TM पैकेज के साथ बहुत सारे विश्लेषण कर रहा हूं। मेरी सबसे बड़ी समस्याओं में से एक स्टेमिंग और स्टेमिंग-जैसे ट्रांसफॉर्मेशन से संबंधित है।आर टेक्स्ट विश्लेषण के साथ स्टेमिंग

मान लें कि मेरे पास कई लेखांकन संबंधी शब्द हैं (मुझे वर्तनी के मुद्दों से अवगत है)।
हम स्टेमिंग के बाद है:

accounts -> account 
account -> account 
accounting -> account 
acounting -> acount 
acount  -> acount 
acounts -> acount 
accounnt -> accounnt 

परिणाम: 3 शर्तें (खाते, acount, खाता) जहाँ मैं 1 (खाता) को पसंद किया है के रूप में इन सभी को एक ही अवधि से संबंधित हैं।

1) वर्तनी को सही करने के लिए एक संभावना है, लेकिन मैंने आर में कभी कोशिश नहीं की है। क्या यह भी संभव है?

2) अन्य विकल्प के लिए एक संदर्भ सूची यानी वह खाता = (खाते, खाते, लेखांकन, acounting, acount, acounts, accounnt) और फिर मास्टर अवधि वाली सभी आवृत्तियां प्रतिस्थापित किया जा सके। मैं आर में यह कैसे करूँगा?

एक बार फिर, किसी भी मदद/सुझावों की बहुत सराहना की जाएगी।

उत्तर

11

हम समानार्थियों की एक सूची स्थापित कर सकते हैं और उन मानों को प्रतिस्थापित कर सकते हैं। उदाहरण

synonyms <- list(
    list(word="account", syns=c("acount", "accounnt")) 
) 

के लिए यह कहते हैं हम "acount" और "खाता" (मैं हम स्टेमिंग के बाद यह कर रहे हैं संभालने हूँ) के साथ "accounnt" बदलना चाहते हैं। अब चलिए टेस्ट डेटा बनाते हैं।

raw<-c("accounts", "account", "accounting", "acounting", 
    "acount", "acounts", "accounnt") 

और अब के एक परिवर्तन समारोह है कि प्राथमिक पर्याय के साथ हमारी सूची में शब्दों को बदल देगा परिभाषित करते हैं।

library(tm) 
replaceSynonyms <- content_transformer(function(x, syn=NULL) { 
    Reduce(function(a,b) { 
     gsub(paste0("\\b(", paste(b$syns, collapse="|"),")\\b"), b$word, a)}, syn, x) 
}) 

यहाँ हम एक कस्टम परिवर्तन को परिभाषित करने के content_transformer समारोह का उपयोग करें। और मूल रूप से हम प्रत्येक शब्द को बदलने के लिए बस gsub करते हैं। हम तो कोष

tm <- Corpus(VectorSource(raw)) 
tm <- tm_map(tm, stemDocument) 
tm <- tm_map(tm, replaceSynonyms, synonyms) 
inspect(tm) 

पर इस का उपयोग कर सकते हैं और हम देख सकते हैं कि इन सभी मूल्यों "खाता" के रूप में वांछित के रूप में तब्दील कर रहे हैं। अन्य समानार्थी जोड़ने के लिए, मुख्य synonyms सूची में अतिरिक्त सूचियां जोड़ें। प्रत्येक उप-सूची में "शब्द" और "syns" नाम होना चाहिए।

+0

बढ़िया, यह मेरे लिए काम करना चाहिए, लेकिन मुझे मैन्युअल रूप से सूचियों को संकलित करना है - जो ठीक है। पहले से अधिक नियंत्रण। धन्यवाद! – RUser

+0

बस मेरे लाइव डेटा पर इसका परीक्षण किया - एक आकर्षण की तरह काम करता है! सबसे कठिन हिस्सा सभी शब्दों के सभी प्रकारों की पहचान करना है और फिर किसी भी तरह से सूची निर्माण को आसान/स्वचालित बनाते हैं। – RUser

8

श्री फ्लिक ने प्रश्न # 2 का उत्तर दिया है। मैं प्रश्न # 1 के उत्तर के माध्यम से आ रहा हूं।

यहां एक दृष्टिकोण है जो ज्ञात शब्द डेटा बेस (DICTIONARYqdapDictionaries से) की बाइनरी खोज का उपयोग करता है। एक बाइनरी लुकअप निश्चित रूप से धीमा है, लेकिन अगर हम प्रतिस्थापन के बारे में कुछ धारणाएं करते हैं (जैसे चरित्र की संख्या में मतभेदों की एक श्रृंखला)।

  1. का उपयोग कर qdap के bag_o_words
  2. एक शब्दकोश में उन शब्दों को देखो (qdapDictionaries 'DICTIONARY डेटा सेट) शब्द match का उपयोग कर पहचान नहीं लगता है शब्द का एक अनूठा बैग में बारी Corpus: तो यहाँ मूल विचार है
    • ये misses चरण # 2 से हम क्या देखने
  3. एक में शब्दों के लिए वर्णों की संख्या का निर्धारण किया जाएगा शब्दकोश सकल अंतर बाद में उपयोग करते हुए nchar
  4. भागो एक पाश (sapply) के माध्यम से misses के प्रत्येक तत्व को खत्म करने और निम्न कार्य करें:
    एक। से प्रत्येक तत्व को tm::stemDocument
    बी का उपयोग करके प्रत्येक तत्व को स्टेम करें। अक्षरों की संख्या निर्धारित करें और nchar
    सी का उपयोग करके उस श्रेणी के भीतर नहीं हैं जो शब्दकोश से उन्मूलन करें।
    डी से अधिक शब्दों को खत्म करने के लिए का उपयोग max.distance के साथ करें। मिस्ड एलिमेंट के सबसे नज़दीक शब्दकोश से शब्द निर्धारित करने के लिए एक बाइनरी लुकअप (वह रिवर्स इंजीनियरों agrep) का उपयोग करें [नोट करें यह qdap से ]
  5. परिणाम एक नामित वेक्टर है जिसका उपयोग हम कर सकते हैं gsub बिंग
  6. उपयोग tm_map एक कस्टम के साथ के लिए tm स्वाद gsub समारोह शब्दों को बदलने के
  7. tm_map और stemDocument

साथ उत्पन्न करते हैं कोड यहाँ है। मैंने आपके द्वारा प्रदान किए गए शब्दों और कुछ यादृच्छिक शब्दों का उपयोग करके नकली Corpus बनाया है ताकि यह प्रदर्शित किया जा सके कि इसे शुरू से अंत तक कैसे किया जाए। आप range और max.distance के साथ खेल सकते हैं जो sapply पर आपूर्ति की जाती है। जितना धीमा आप इनके साथ धीमे हो जाते हैं, लेकिन खोज बहुत अधिक होगी, लेकिन इससे गलती हो सकती है। यह वास्तव में सामान्य अर्थ में वर्तनी सुधार के लिए उत्तर नहीं है लेकिन यहां काम करता है क्योंकि आप वैसे भी खड़े थे। Aspell पैकेज है लेकिन मैंने पहले कभी इसका उपयोग नहीं किया है।

terms <- c("accounts", "account", "accounting", "acounting", "acount", "acounts", "accounnt") 

library(tm); library(qdap) 

fake_text <- unlist(lapply(terms, function(x) { 
    paste(sample(c(x, sample(DICTIONARY[[1]], sample(1:5, 1)))), collapse=" ") 
})) 

fake_text 

myCorp <- Corpus(VectorSource(fake_text)) 
terms2 <- unique(bag_o_words(as.data.frame(myCorp)[[2]])) 
misses <- terms2[is.na(match(terms2, DICTIONARY[[1]]))] 

chars <- nchar(DICTIONARY[[1]]) 

replacements <- sapply(misses, function(x, range = 3, max.distance = .2) { 
    x <- stemDocument(x) 
    wchar <- nchar(x) 
    dict <- DICTIONARY[[1]][chars >= (wchar - range) & chars <= (wchar + range)] 
    dict <- dict[agrep(x, dict, max.distance=max.distance)] 
    names(which.min(sapply(dict, qdap:::Ldist, x))) 
}) 

replacer <- content_transformer(function(x) { 
    mgsub(names(replacements), replacements, x, ignore.case = FALSE, fixed = FALSE) 
}) 

myCorp <- tm_map(myCorp, replacer) 
inspect(myCorp <- tm_map(myCorp, stemDocument)) 
+0

धन्यवाद टायलर, अब मुझे लगता है कि मेरे लिए श्रीफ्लिक के समाधान का उपयोग करना आसान है क्योंकि मेरे पास इसका अधिक नियंत्रण है, लेकिन आपने मुझे अपने समाधान के लिए धन्यवाद, कुछ विचारों और पैकेजों पर ध्यान दिया है! – RUser

6

इस प्रश्न ने मुझे qdap पैकेज के लिए वर्तनी जांच लिखने का प्रयास करने के लिए प्रेरित किया। एक इंटरैक्टिव संस्करण है जो यहां उपयोगी हो सकता है। यह qdap >= version 2.1.1 में उपलब्ध है।

library(devtools) 
install_github("qdapDictionaries", "trinker") 
install_github("qdap", "trinker") 
library(tm); library(qdap) 

## एक Corpus पुन: जैसे आप का वर्णन: आप इस समय देव संस्करण की आवश्यकता होगी .. यहाँ स्थापित करने के लिए कदम उठाए जाते हैं इसका मतलब है कि।

terms <- c("accounts", "account", "accounting", "acounting", "acount", "acounts", "accounnt") 

fake_text <- unlist(lapply(terms, function(x) { 
    paste(sample(c(x, sample(DICTIONARY[[1]], sample(1:5, 1)))), collapse=" ") 
})) 

fake_text 

inspect(myCorp <- Corpus(VectorSource(fake_text))) 

इंटरैक्टिव वर्तनी परीक्षक (check_spelling_interactive)

m <- check_spelling_interactive(as.data.frame(myCorp)[[2]]) 
preprocessed(m) 
inspect(myCorp <- tm_map(myCorp, correct(m))) 

correct समारोह केवल check_spelling_interactive के उत्पादन में से एक बंद समारोह पकड़ लेता है और आप तो करने के लिए लागू करने के लिए "सही करने" की अनुमति देता है ## कोई भी नई पाठ स्ट्रिंग (ओं)।

संबंधित मुद्दे