मैंने एक दस्तावेज़ टर्म मैट्रिक्स बनाया है जो कुछ डेटा माइनिंग मुद्दों के लिए 100000 to 600000 से नंबर खोजता है, लेकिन मैंने उल्लेख किया है कि यह वांछित संख्या के परिणाम के रूप में नहीं लेता है, यह हर संख्या को रिक्त स्थान या दशमलव के साथ 6 अंकों के संयोजन और रिटर्न में जोड़ता है यह एक एकल संख्या के रूप में

यह मेरा कोड है

    library(text2vec)

 docs = c(doc1 = " letter ltetter (-è)  323.456 1  789 ",
     dc2 = "letters 123.45 1letters 100000  98 76 54  ",
     dc3 = "123456789  454321 letters 124 258 ")
#delete every thing but numbers
    docs = gsub("[^0-9 ]", "", docs, perl = T)
#creating the dtm
    itoken = itoken(docs, tokenizer = word_tokenizer, ids = names(docs))
    vector = create_vocabulary(itoken)
    vectorizer = vocab_vectorizer(vector)
    dtm = create_dtm(itoken, vectorizer)

     (dtm[, colnames(dtm) %in% 100000:600000])
3 x 4 sparse Matrix of class "dgCMatrix"
     100000  454321 323456
doc1      .     .      1
dc2       1     .      .
dc3       .     1      .

निकाला गया 100000 सही है= यह वांछित मार्जिन में है (100000 and 600000)

454321 सही है= यह वांछित मार्जिन में है (100000 and 600000)

323456 गलत है= दस्तावेज़ में संख्या 323.456 है, यह मार्जिन में नहीं है, लेकिन निकाली गई है मैं इसे 100000 to 600000 से केवल संख्या वापस करने के लिए कैसे अनुकूलित कर सकता हूं?

1
stephan 19 अगस्त 2018, 23:42
आपका प्रश्न अस्पष्ट है। ऐसा लगता है कि आपका कोड 100000 से 600000 तक केवल संख्याएँ लौटाता है। साथ ही, आपको create_dtm(it, vectorizer) को create_dtm(itoken, vectorizer) से बदलना चाहिए।
 – 
000andy8484
20 अगस्त 2018, 00:09
मैं 100000 से 600000 तक संख्याएं निकालना चाहता हूं, लेकिन कोड प्रत्येक 6 शब्दों का संयोजन देता है, भले ही बीच में अल्पविराम हो। यह इस 123.456 को 6 अंकों की संख्या के रूप में लौटाता है लेकिन यह नहीं है
 – 
stephan
20 अगस्त 2018, 00:16

3 जवाब

अगर मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप दशमलव बिंदुओं सहित दस्तावेज़ों से सभी संख्याएं निकालना चाहते हैं।

तो आप कुछ ऐसा करना चाहते हैं

docs <- sapply(docs, function(doc) {
  nums <- regmatches(doc, gregexpr("[0-9]+\\.*[0-9]*", doc))
  paste(unlist(nums), collapse = " ")
})
docs
#                       doc1                        dc2 
#            "323.456 1 789" "123.45 1 100000 98 76 54" 
#                        dc3 
# "123456789 454321 124 258"

यदि हम आपका शेष कोड docs पर चलाते हैं:

library(text2vec)
itoken = itoken(docs, tokenizer = word_tokenizer, ids = names(docs))
vector = create_vocabulary(itoken)
vectorizer = vocab_vectorizer(vector)
dtm = create_dtm(itoken, vectorizer)
dtm[, colnames(dtm) %in% 100000:600000]
# 3 x 2 sparse Matrix of class "dgCMatrix"
#      454321 100000
# doc1      .      .
# dc2       .      1
# dc3       1      .
1
Weihuang Wong 20 अगस्त 2018, 00:48
नहीं सर मुझे इसका उल्टा चाहिए। मैं सिर्फ 1 मिलियन से 6 लाख तक की संख्या चाहता हूं, निकाले गए दशमलव संख्याएं झूठी हैं (वे वांछित मार्जिन में नहीं हैं)
 – 
stephan
20 अगस्त 2018, 00:11
मैं दशमलव निष्कर्षण की समस्या को ठीक करना चाहता हूँ
 – 
stephan
20 अगस्त 2018, 00:20
क्या मैंने यही नहीं किया? यदि आप docs जैसा मैंने दिखाया है, संसाधित करते हैं, और अपना शेष कोड चलाते हैं, तो आपके पास दशमलव संख्याएं नहीं होंगी।
 – 
Weihuang Wong
20 अगस्त 2018, 00:46

आप एक शब्द सीमा \\b के लिए खोज सकते हैं जिसमें 6 अंक 1-6 [1-6] से शुरू होते हैं और उसके बाद कोई भी 5 अंक [0-9]{5} होते हैं।

library(stringr)
docs_list <- lapply(docs, 
                   function(x){str_extract_all(x,"\\b[1-6][0-9]{5}\\b", simplify = TRUE)})

docs_list[sapply(docs_list, function(x) length(x)==0L)] <- NA

unlist(docs_list)
doc1      dc2      dc3 
  NA "100000" "454321" 
1
A. Suliman 20 अगस्त 2018, 01:15

आपको gsub फ़ंक्शन में दशमलव बिंदु पर विचार करना होगा।

library(text2vec)

docs = c(doc1 = " letter ltetter (-è)  323.456 1  789 ",
     dc2 = "letters 123.45 1letters 100000  98 76 54  ",
     dc3 = "123456789  454321 letters 124 258 ")

#If you have decimal commas first do this
docs = sub(',','.',docs,perl = T)
#Here what i've changed
docs = gsub("[^0-9^.^ ]", "", docs, perl = T)

#creating the dtm
itoken = itoken(docs, tokenizer = word_tokenizer, ids = names(docs))
vector = create_vocabulary(itoken)
vectorizer = vocab_vectorizer(vector)
dtm = create_dtm(itoken, vectorizer)
dtm_1 <- as.numeric(colnames(dtm))
table <- as.matrix(dtm[, (dtm_1 < 600000 & dtm_1>10000)])

library(reshape)
df_melted <- melt(table)
df_melted <- df_melted[which(df_melted$value != 0),]
colnames(df_melted) <- c("Document","Number Found","times")

यह आपको देता है:

  Document Number Found times
2      dc2       100000     1
6      dc3       454321     1
1
Blasif 20 अगस्त 2018, 05:11
और यदि कोई दशमलव अल्पविराम है? मैं इसे कैसे जोड़ सकता हूँ?
 – 
stephan
20 अगस्त 2018, 04:10
कोड देखो। सबसे पहले, दशमलव अल्पविराम को संभालने के लिए मैंने gsub चरण से पहले एक चरण जोड़ा है। साथ ही, हम केवल पूर्णांक मानों के साथ तुलना कर रहे थे (हम तुलना में दशमलव संख्याओं को शामिल नहीं कर रहे थे), इसलिए मैंने कोड को थोड़ा संशोधित किया। अब इसे ठीक काम करना चाहिए।
 – 
Blasif
20 अगस्त 2018, 05:16