отформатировать количество цифр в результатах R

Я создал матрицу терминов документа, которая ищет числа из 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?


person stephan    schedule 19.08.2018    source источник
comment
Ваш вопрос не ясен. Ваш код действительно возвращает только числа от 100000 до 600000. Кроме того, вы должны заменить create_dtm(it, vectorizer) на create_dtm(itoken, vectorizer).   -  person 000andy8484    schedule 20.08.2018
comment
я хочу извлечь числа от 100000 до 600000, но код возвращает каждую комбинацию из 6 терминов, даже если между ними есть запятая. он возвращает это 123.456 как 6-значное число, но это не так.   -  person stephan    schedule 20.08.2018


Ответы (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      .
person Weihuang Wong    schedule 19.08.2018
comment
нет, сэр, я хочу наоборот. мне просто нужны числа от 1 миллиона до 6 миллионов, извлеченные десятичные числа ложны (они не находятся в желаемом поле) - person stephan; 20.08.2018
comment
Я хочу исправить проблему извлечения десятичных знаков - person stephan; 20.08.2018
comment
Разве это не то, что я сделал? Если вы обработаете docs, как я показал, и запустите остальную часть кода, у вас не будет десятичных чисел. - person Weihuang Wong; 20.08.2018

Вы можете искать границу слова \\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" 
person A. Suliman    schedule 19.08.2018

Вы должны учитывать десятичную точку в функции 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
person Blasif    schedule 19.08.2018
comment
а если десятичная запятая? как я могу добавить это - person stephan; 20.08.2018
comment
Посмотрите код. Во-первых, для обработки десятичной запятой я добавил шаг перед шагом gsub. Кроме того, мы сравнивали только целочисленные значения (мы не включали в сравнение десятичные числа), поэтому я немного изменил код. Теперь он должен работать нормально. - person Blasif; 20.08.2018