Molbiol.ru | О проекте | Справочник | Методы | Растворы | Расчёты | Литература | Орг.вопросы Web | Фирмы | Coffee break | Картинки | Работы и услуги | Биржа труда | Zbio-wiki NG SEQUENCING · ЖИЗНЬ РАСТЕНИЙ · БИОХИМИЯ · ГОРОДСКИЕ КОМАРЫ · А.А.ЛЮБИЩЕВ · ЗООМУЗЕЙ Темы за 24 часа [ Вход* | Регистрация* ] Форум: | |
plantago Постоянный участник |
library(lattice) aa1 <- do.call(make.groups, aa[, 3:12]) aa1$MARKER <- rep(aa$MARKER, 10) aa1$TIME <- rep(aa$TIME, 10) dotplot(MARKER ~ data | which, groups=TIME, data=aa1, auto.key=TRUE)
|
penkin.2011 Участник |
mydat= kr_csv.zip # 1. загрузка библиотек library("tm") library("SnowballC") library("textcat") #выбираем русский язык mydat.lang_category<-textcat(mydat$name); mydat.ru=mydat[mydat.lang_category =="russian",] corpus=Corpus(VectorSource(mydat.ru)) View(as.matrix(mydat.ru)) Вот на этом месте затык corpus=Corpus(VectorSource(mydat.ru)) CODE <<VCorpus>> Metadata: corpus specific: 0, document level (indexed): 0 Content: documents: 0 и куда все документы подевались? соответственно создавать дтм бессмысленно #создаем матрицу документов функция DocumentTermMatrix (...) dtm=DocumentTermMatrix(corpus, control=list(stemming=T, stopwords=F, minWorldLenght=3,removeNumbers=T, removePunctuation=T, #stopwords=c(stopwords('SMART')) weighting=function(x) weightTf(x) )) CODE <<DocumentTermMatrix (documents: 0, terms: 0)>> Non-/sparse entries: 0/0 Sparsity : 100% Maximal term length: 0 Weighting : term frequency (tf) Подскажите, что делать? (Чернышевский) Файл/ы:
|
zelenayapyatka |
Сообщение было отредактировано zelenayapyatka - 02.11.2017 13:20 |
plantago Постоянный участник |
|
zelenayapyatka |
(plantago @ 03.11.2017 01:10) Здравствуйте! Этот вопрос адресован мне? В скаченном мной R меню на английском языке, это не удобно в работе. Англ. я владею не достаточно хорошо. Хочу русифицировать систему. Есть ли такая возможность? Использую RStudio. Через меню Tools/Global Options/Spelling изменила Main dictionary language на Russian. Не помогло. Возможно, я делаю что-то не то? В интернете не нашла ответа как русифицировать R. Обратилась к вам в группу "R Help" |
plantago Постоянный участник |
RStudio -- отдельный проект, коммерческий (хотя и с открытым кодом). Сам R русифицирован, меню в версии под Windows -- на русском. |
ПолинаШ Участник |
GetCoef <- function (nc=6) { DFr <- DFp[,sample(ncol(DFp), nc)] m <- lm(Y ~ ., data=DFr) a<-summary(m)$coefficients a[a[,3]<=0.05,1] } nr <- 1000 sumC <- rep(0, ncol(DFp)+1) names(sumC) <- c("(Intercept)", names(DFp)) replicate(nr, { res <- GetCoef(6) sumC[names( sumC) %in% names(res)] <- sumC[names( sumC) %in% names(res)] + 1 }) Т.к. sample() "рассыпает порядок следования переменных, накопление единичек происходит не у тех переменных. Поправьте меня, пожалуйста. Сообщение было отредактировано ПолинаШ - 01.12.2017 10:07 |
Guest IP-штамп: frd82cfYPkYIM гость |
(ПолинаШ @ 30.11.2017 19:54) Имею вектор Y и таблицу DFp из более 100 предикторов. Хочу подсчитать, сколько раз каждый предиктор оказывается статистически значимым из 1000 subset-ов, составленных из 6 случайных переменных: Т.к. sample() "рассыпает порядок следования переменных, накопление единичек происходит не у тех переменных. Поправьте меня, пожалуйста. Не очень понятна цель. Это некие "случайные подпространства"? Сам порядок легко сохранить. Генерить список индексов выбранных колонок, и по ней уже проходиться как параметру строя список решений. Тогда порядок предикторов будет очевиден для каждого найденного решения.
|
ПолинаШ Участник |
А проблема, действительно, решается просто: ind <- intersect(names(sumC), names(res)) sumC[ind] <- sumC[ind] + 1 Сообщение было отредактировано ПолинаШ - 01.12.2017 10:06 |
binom15 |
У меня много условных операторов, поэтому пытаюсь условия считать с базы данных и подставить их в оператор if (условие) ... Вот так всё работает: > mkra=1; nkra=3; g1=1; g2=1 > law <- (mkra>0 & nkra==1 & g1>0 & g2>0) > law [1] FALSE а с базы данных не работает > lwb <- read.dbf("law.dbf") > lwv <- lwb$LAW > law <- as.character(lwv[1]) > law [1] "(mkr>0 & nkr==1 & g1>0 & g2==0)" |
pApA2017 |
|
binom15 |
(pApA2017 @ 05.12.2017 23:22) Это просто два разных условия, причём первое не g2, а g1. А по существу вопроса - как преобразовать символьное выражение в вид, воспринимаемый условным оператором? Сообщение было отредактировано binom15 - 06.12.2017 18:15 |
plantago Постоянный участник |
|
binom15 |
Уберём базу данных типа .dbf, поле в нём "с условием" в символьном формате. введём переменные mkr=1; nkr=3; g1=1; g2=1 lwv <- "(mkr>0 & nkr==3 & g1>0 & g2>0)" Как lwn преобразовать в логическое выражение? В виде law <- функция(lwv) и далее if (law) {...} |
PS2004R Постоянный участник |
(binom15 @ 07.12.2017 07:23) Давайте подойдём к этому вопросу проще. Уберём базу данных типа .dbf, поле в нём "с условием" в символьном формате. введём переменные mkr=1; nkr=3; g1=1; g2=1 lwv <- "(mkr>0 & nkr==3 & g1>0 & g2>0)" Как lwn преобразовать в логическое выражение? В виде law <- функция(lwv) и далее if (law) {...} например вот так PS ну или закат солнца вручную eval(parse(text="(mkr>0 & nkr==3 & g1>0 & g2>0)")) , если конечно "преобразовать в логическое выражение" означает "вычислить". Сообщение было отредактировано PS2004R - 07.12.2017 08:48
|
binom15 |
(PS2004R @ 07.12.2017 09:45) например вот так PS ну или закат солнца вручную eval(parse(text="(mkr>0 & nkr==3 & g1>0 & g2>0)")) , если конечно "преобразовать в логическое выражение" означает "вычислить". Огромное спасибо! То, что надо, работает! |
codeR |
Мне нужно объединить два набора данных, используя compare linkage для вычисления весов. Первый набор данных имеет 2,5 миллион строк, второй набор данных - 300 000 строк. Оба набора данных имеют только одну переменную (ido), и я должен соединять по этой переменной. Это простая операция, если вы используете небольшое количество строк, но мне нужно работать с наибольшим количеством строк. Поэтому я пишу код: CODE library(RecordLinkage) #here we work only with ido to calculate the wieghts for merged data df_01=read.csv(/1new.csv", sep=";",dec=",") #View(df_01) str(df_01) df_02=read.csv(po.csv", sep=";",dec=",") #View(df_02) str(df_02) #get weights rpairs_jar <- compare.linkage(df_01, df_02, strcmp = c("ido"), strcmpfun = jarowinkler) поскольку объемы большие я получил ошибку cannot allocate vector of size 845.3 Gb Т.е. не хватает оперативной памяти, я стал гуглить вопрос , и нашел, что кто-то уже спрашивал об этом здесь Ответ одного пользователя выбрать метод факторизации итеративный, который работает с порциями данных подскажите, а как это реализовать работу с пропорциями Мой сервер Intel Xeon CPU E5-1650 v4@ 3.60ghz 128 gb ram 10 tb hdd windows 2012 R2x64 ссылка на файлы Помогите, пожалуйста. |
Guest IP-штамп: frd82cfYPkYIM гость |
(codeR @ 16.12.2017 16:39) Извиняюсь за офф-топ. Мой вопрос не по биологии, а скорее просто по R Мне нужно объединить два набора данных, используя compare linkage для вычисления весов. Первый набор данных имеет 2,5 миллион строк, второй набор данных - 300 000 строк. Оба набора данных имеют только одну переменную (ido), и я должен соединять по этой переменной. Это простая операция, если вы используете небольшое количество строк, но мне нужно работать с наибольшим количеством строк. Поэтому я пишу код: CODE library(RecordLinkage) #here we work only with ido to calculate the wieghts for merged data df_01=read.csv(/1new.csv", sep=";",dec=",") #View(df_01) str(df_01) df_02=read.csv(po.csv", sep=";",dec=",") #View(df_02) str(df_02) #get weights rpairs_jar <- compare.linkage(df_01, df_02, strcmp = c("ido"), strcmpfun = jarowinkler) поскольку объемы большие я получил ошибку cannot allocate vector of size 845.3 Gb Т.е. не хватает оперативной памяти, я стал гуглить вопрос , и нашел, что кто-то уже спрашивал об этом здесь Ответ одного пользователя подскажите, а как это реализовать работу с пропорциями Мой сервер Intel Xeon CPU E5-1650 v4@ 3.60ghz 128 gb ram 10 tb hdd windows 2012 R2x64 ссылка на файлы Помогите, пожалуйста. Я понимаю, что написать str(df_02) и не показать выхлоп модно и молодежно, но тем не менее вопрос: Ваша ссылка не работает, что лежит в ido? |
codeR |
если не качает попробуйте пожалуйста, хотя у меня ссылка работает здесь меньше наблюдений, думал если буду удалять, что-то да получится, но нет, просто чуть меньше cannot allocate vector of size 24.3 Gb > str(df_01) 'data.frame': 30654 obs. of 1 variable: $ ido: Factor w/ 17471 levels "\"ДАТЧИК ЛОТКА \"\"ЛИЦОМ ВВЕРХ......",..: 9366 12182 11451 11451 6910 6909 6907 6908 6906 15423 ... > str(df_02) 'data.frame': 216572 obs. of 1 variable: $ ido: Factor w/ 157878 levels "- Расцепитель независимый РН-47 на DIN-рейку",..: 30 32 38 39 42 43 44 45 46 47 ... > но я не могу удалять, все должны быть строки. |
Guest IP-штамп: frd82cfYPkYIM гость |
(codeR @ 16.12.2017 18:01) ido это просто столбец, в двух файлах всего один ключевой столбец если не качает попробуйте пожалуйста, хотя у меня ссылка работает здесь меньше наблюдений, думал если буду удалять, что-то да получится, но нет, просто чуть меньше cannot allocate vector of size 24.3 Gb > str(df_01) 'data.frame': 30654 obs. of 1 variable: $ ido: Factor w/ 17471 levels "\"ДАТЧИК ЛОТКА \"\"ЛИЦОМ ВВЕРХ......",..: 9366 12182 11451 11451 6910 6909 6907 6908 6906 15423 ... > str(df_02) 'data.frame': 216572 obs. of 1 variable: $ ido: Factor w/ 157878 levels "- Расцепитель независимый РН-47 на DIN-рейку",..: 30 32 38 39 42 43 44 45 46 47 ... > но я не могу удалять, все должны быть строки. Схема такая 1. Как минимум прочитайте файлы не преобразуя эти переменные в факторы. 2. Как оптимум: Скачайте openrefine и закачав оба файла сразу, пометив дописывать имена файлов, (придется указать в конфиге программы большую кучу) проведите нормализацию-кластеризацию описаний уровней (на сайте программы есть видео примеры). 3. Потом выгрузить, и в R для линкинга (не забывая о п.1). |
codeR |
так они сами как факторы читаются, это ж текстовые данные. Как мне их сделать на "факторными"? |
Guest IP-штамп: frd82cfYPkYIM гость |
(codeR @ 16.12.2017 20:50) 1. Как минимум прочитайте файлы не преобразуя эти переменные в факторы. так они сами как факторы читаются, это ж текстовые данные. Как мне их сделать на "факторными"? опцию укажите при чтении если не продолжать возиться с медленным read.csv() на больших файлах, то CODE df.данные <- data.table::fread("читаемый_файл.csv", stringsAsFactors=FALSE, dec=",") если оставаться последователем Захер Мазоха, то добавить stringsAsFactors = F в вызов read.csv() тоже |
codeR |
фанатом мазохизма Я оценил Захер))) |
codeR |
df_01=data.table::fread("C:/Users/Admin/Desktop/pot.csv", sep=";", dec=",",stringsAsFactors=FALSE) #View(df_01) str(df_01) df_01=df_01[rowSums(is.na(df_01)) == 0,] df_02=data.table::fread("C:/Users/Admin/Desktop/1.csv", sep=";",dec=",",,stringsAsFactors=FALSE) #View(df_02) df_02=df_02[rowSums(is.na(df_02)) == 0,] str(df_02) > rpairs_jar <- compare.linkage(df_02, df_01, + strcmp = c("ido"), + strcmpfun = jarowinkler) Error in if (n > 0) c(NA_integer_, -n) else integer() : missing value where TRUE/FALSE needed Ошибка связана с NA, но я их поудалял. Что мне делать? |
Guest IP-штамп: fr/MUrmodT6VA гость |
(codeR @ 18.12.2017 18:19) Прошу прощение за беспокойство не могу победить ошибку df_01=data.table::fread("C:/Users/Admin/Desktop/pot.csv", sep=";", dec=",",stringsAsFactors=FALSE) #View(df_01) str(df_01) df_01=df_01[rowSums(is.na(df_01)) == 0,] df_02=data.table::fread("C:/Users/Admin/Desktop/1.csv", sep=";",dec=",",,stringsAsFactors=FALSE) #View(df_02) df_02=df_02[rowSums(is.na(df_02)) == 0,] str(df_02) > rpairs_jar <- compare.linkage(df_02, df_01, + strcmp = c("ido"), + strcmpfun = jarowinkler) Error in if (n > 0) c(NA_integer_, -n) else integer() : missing value where TRUE/FALSE needed Ошибка связана с NA, но я их поудалял. Что мне делать? Вам не эффективно _по единственному_ столбцу делать слияние этим алгоритмом. Почему Вы не пользуетесь уже полученным советом очистки и унификации данных в openrefine с помощью одновременной интерактивной кластеризации по этому полю обоих таблиц? Крайне маловероятно, что "оно само" склеит ваши строки лучше. |
codeR |
и уже линкуем кластера. Я просто Вам не ответил. Таким образом мы теряем много строк Пример бумага А4 Бумага А0(Ватман) Это разные позиции, но после кластеризации,это будет считаться одним и тем же. |
Guest IP-штамп: fr/MUrmodT6VA гость |
(codeR @ 19.12.2017 17:36) Я сразу скачал openrefine и посмотрел видео. Проблема в том, что после такого как он кластеризует ,мы уже работает не с реальными прайсовыми позициями, а с кластерами и уже линкуем кластера. Я просто Вам не ответил. Таким образом мы теряем много строк Пример бумага А4 Бумага А0(Ватман) Это разные позиции, но после кластеризации,это будет считаться одним и тем же. Объединять или нет найденные позиции является решением оператора. Там несколько различных вариантов алгоритмов кластеризации, подберите наиболее подходящий (и его параметры) для первой коррекции... второй, третьей... а там глядишь и данные кончаться. Это интерактивная работа, и её ни в коем случае не надо пытаться сделать "в одино решение". (потом, если захотите, можно оригинальное уникальное название и конечное (если их достаточно много накопиться) использовать для обучения нейросети в R, что бы делать все сразу "за один шаг") Кроме того сразу нормализуйте текст по регистру и числу пробелов, обычно в фильме обучающем это есть. |
binom15 |
OS windows 10 |
ИНО Постоянный участник Донецк |
|
Guest IP-штамп: frd82cfYPkYIM гость |
(binom15 @ 25.12.2017 21:49) CODE > ?dev. ?dev.capabilities ?dev.copy ?dev.cur ?dev.interactive ?dev.next ?dev.print ?dev.capture ?dev.copy2eps ?dev.flush ?dev.list ?dev.off ?dev.set ?dev.control ?dev.copy2pdf ?dev.hold ?dev.new ?dev.prev ?dev.size > ?dev.
|
binom15 |
dev.off() - прекрасно работает. |
ИНО Постоянный участник Донецк |
|
plantago Постоянный участник |
|
binom15 |
С x11 открываю 4 окна и вывожу 12 графиков. 4 окна крестиком долго закрывать, а dev.list() и dev.off() удобно использовать затем для закрытия нужных окон в функции. |
codeR |
Например строятся несколько моделей, которые измеряют признак. Например, построил несколько регрессионных моделей и все достаточно точно измеряют зависимую переменную, КМД варьируется от 0.9-0.95. Так вот можно ли бустингом объединить мои модели в композиции и будет ли это работать Это можно как-то обосновать? |
Guest IP-штамп: frQ9QtzA7VEDk гость |
(codeR @ 23.01.2018 11:47) Подскажите, пожалуйста, корретно ли Бустинг считать алгоритмом, который объединяет модели в композицию. Например строятся несколько моделей, которые измеряют признак. Например, построил несколько регрессионных моделей и все достаточно точно измеряют зависимую переменную, КМД варьируется от 0.9-0.95. Так вот можно ли бустингом объединить мои модели в композиции и будет ли это работать Это можно как-то обосновать? Разные по структуре модели нет. А одинаковые модели объединяют кроссвалидацией, по сути это и есть бутстреп. |
codeR |
|
passant |
А если под "объединением" вы понимаете просто использование результатов работы одного метода как исходные данные для работы другого метода - то это никак не объединение модели а просто их совместное использование. В общем-то в нейросетях используют нечто подобное. |
Vikulik |
Пользовательская функция: mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc <- paste(sdoc, collapse=" ") sdoc } Пример использования: data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) data_cor_t <- tm_map(data_cor, mystem) Результат: > data_cor[[1]]$content [1] "Раз два три" > data_cor[[2]]$content [1] "четыре пять шесть" > data_cor_t[[1]]$content [1] "раз два три четыре пять шесть" Т.е. проблема в том, что функция paste приводит к тому, что документы корпуса склеиваются в один. Тот же результат, если использовать упрощенную функцию: mystem <- function(x) { doc <- paste(x, "@", collapse = " ") doc } > data_cor_t[[1]]$content [1] "Раз два три @ четыре пять шесть @" Использование content_transformer(FUN) и PlainTextDocument тоже не помогают. В чем тут дело? |
Guest IP-штамп: frd82cfYPkYIM гость |
(Vikulik @ 03.02.2018 17:09) Здравствуйте, помогите, пожалуйста, решить проблему с использованием пользовательских функций для трансформации корпуса (tm_map пакета tm). Пользовательская функция: mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc <- paste(sdoc, collapse=" ") sdoc } Пример использования: data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) data_cor_t <- tm_map(data_cor, mystem) Результат: > data_cor[[1]]$content [1] "Раз два три" > data_cor[[2]]$content [1] "четыре пять шесть" > data_cor_t[[1]]$content [1] "раз два три четыре пять шесть" Т.е. проблема в том, что функция paste приводит к тому, что документы корпуса склеиваются в один. Тот же результат, если использовать упрощенную функцию: mystem <- function(x) { doc <- paste(x, "@", collapse = " ") doc } > data_cor_t[[1]]$content [1] "Раз два три @ четыре пять шесть @" Использование content_transformer(FUN) и PlainTextDocument тоже не помогают. В чем тут дело? 1. Не совсем понятно чего Вы ожидаете получить от paste(). 2. Оберните применяемую функцию в content_transformer(), по идее тогда обработка ограничиться текстом документа. |
ПолинаШ Участник |
dead <- cbind(df$погибло, df$выжило) anova(glm(dead ~ доза , family = binomial(link=probit), data=df), glm(dead ~ log10(доза), family = binomial(link=probit), data=df), test = "Chisq") Analysis of Deviance Table Model 1: dead ~ доза Model 2: dead ~ log10(доза) Resid. Df Resid. Dev Df Deviance Pr(>Chi) 1 124 161.34 2 124 141.94 0 19.409 Как оценить значимость D = 19.4 и показать, что снижение остаточной ошибки мало. Или не мало.... |
Vikulik |
(Guest @ 03.02.2018 23:17) 1. Не совсем понятно чего Вы ожидаете получить от paste(). 2. Оберните применяемую функцию в content_transformer(), по идее тогда обработка ограничиться текстом документа. 1. Функция Mystem разбивает текст на слова. Если слова в текст не соединять, то получается результат следующий (т.е. количество документов увеличивается до количества слов): > data_cor_t[[1]]$content [1] "раз" 2. С content_transformer() пробовала - никакого эффекта. Ниже код и результат: data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc <- paste(sdoc, collapse=" ") sdoc } f <- content_transformer(function(x) mystem(x)) data_cor_t <- tm_map(data_cor, f) data_cor_t[[1]]$content > data_cor_t[[1]]$content [1] "раз два три четыре пять шесть" |
Guest IP-штамп: frd82cfYPkYIM гость |
(Vikulik @ 04.02.2018 15:51) 1. Функция Mystem разбивает текст на слова. Если слова в текст не соединять, то получается результат следующий (т.е. количество документов увеличивается до количества слов): > data_cor_t[[1]]$content [1] "раз" 2. С content_transformer() пробовала - никакого эффекта. Ниже код и результат: data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc <- paste(sdoc, collapse=" ") sdoc } f <- content_transformer(function(x) mystem(x)) data_cor_t <- tm_map(data_cor, f) data_cor_t[[1]]$content > data_cor_t[[1]]$content [1] "раз два три четыре пять шесть" CODE > data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) > data_cor <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 0 Content: documents: 2 > data_cor[[1]] <<PlainTextDocument>> Metadata: 7 Content: chars: 11 > data_cor[[1]]$content [1] "Раз два три" > mystem <- function(doc) { sdoc <- sapply(doc, paste, collapse=" "); sdoc} > data_cor_t <- tm_map(data_cor, content_transformer(mystem)) > data_cor_t[[1]]$content [1] "Раз два три" > data_cor_t[[2]]$content [1] "четыре пять шесть" но я по прежнему не понимаю что Вы хотите от paste() |
Guest IP-штамп: frd82cfYPkYIM гость |
(ПолинаШ @ 04.02.2018 14:43) Очень не хочется маяться с логарифмами Как оценить значимость D = 19.4 и показать, что снижение остаточной ошибки мало. Или не мало.... |
Vikulik |
(Guest @ 04.02.2018 18:14) но я по прежнему не понимаю что Вы хотите от paste() Приведу на примере, как работает mystem и зачем нужно использовать paste. data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) doc <- data_cor[[1]]$content > doc [1] "Раз два три" sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') > sdoc [1] "раз" "два" "три" Получается, что на выходе стемминга совокупность слов, которые нужно обратно собрать в документ. Если этого не сделать, то на выходе будет не 2 документа, а 6 документов. mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc } data_cor_t <- tm_map(data_cor, content_transformer(mystem)) > data_cor <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 0 Content: documents: 2 > data_cor_t <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 0 Content: documents: 6 |
Guest IP-штамп: frd82cfYPkYIM гость |
(Vikulik @ 04.02.2018 17:53) Приведу на примере, как работает mystem и зачем нужно использовать paste. data_cor <- Corpus(VectorSource(as.character(c("Раз два три", "четыре пять шесть")))) doc <- data_cor[[1]]$content > doc [1] "Раз два три" sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') > sdoc [1] "раз" "два" "три" Получается, что на выходе стемминга совокупность слов, которые нужно обратно собрать в документ. Если этого не сделать, то на выходе будет не 2 документа, а 6 документов. mystem <- function(doc) { sdoc <- system('C:/Users/Downloads/mystem-3.1-win-64bit/mystem -ln -e cp1251', intern=T, input=doc) sdoc <- str_replace(sdoc, '\\?', '') sdoc <- str_replace(sdoc, '\\|.*$', '') sdoc } data_cor_t <- tm_map(data_cor, content_transformer(mystem)) > data_cor <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 0 Content: documents: 2 > data_cor_t <<SimpleCorpus>> Metadata: corpus specific: 1, document level (indexed): 0 Content: documents: 6 А чем Вас не устраивает приведенное мной решение? CODE > mystem <- function(doc) { sdoc <- paste(doc, collapse=" "); sdoc} > data_cor_t <- tm_map(data_cor, content_transformer(function(x) sapply(x, mystem))) > data_cor_t[[2]]$content [1] "четыре пять шесть" > data_cor_t[[1]]$content [1] "Раз два три" > |
Vikulik |
(Guest @ 04.02.2018 20:33) К сожалению, скоростью. Я похожий вариант пробовала. > system.time(tm_map(data_cor, content_transformer(function(x) sapply(x, mystem)))) пользователь система прошло 0.03 0.14 6.36 > system.time(Corpus(VectorSource(lapply(1:length(data_cor_t), function(i) mystem(data_cor_t[[i]]$content))))) пользователь система прошло 0.01 0.11 6.36 > system.time(tm_map(data_cor_t, stemDocument, language = "russian")) пользователь система прошло 0 0 0 Последний вариант - это стандартная функция стемминга Портера. Но она не устраивает тем, как приводит слова к первоначальной форме. |
Vikulik |
|
Guest IP-штамп: frd82cfYPkYIM гость |
(Vikulik @ 04.02.2018 19:49) К сожалению, скоростью. Я похожий вариант пробовала. > system.time(tm_map(data_cor, content_transformer(function(x) sapply(x, mystem)))) пользователь система прошло 0.03 0.14 6.36 > system.time(Corpus(VectorSource(lapply(1:length(data_cor_t), function(i) mystem(data_cor_t[[i]]$content))))) пользователь система прошло 0.01 0.11 6.36 > system.time(tm_map(data_cor_t, stemDocument, language = "russian")) пользователь система прошло 0 0 0 Последний вариант - это стандартная функция стемминга Портера. Но она не устраивает тем, как приводит слова к первоначальной форме. в эту игру можно играть вдвоем добавьте в tm_map() опцию , lazy = TRUE CODE system.time(tm_map(data_cor, content_transformer(function(x) sapply(x, mystem)), lazy = TRUE)) покажите, сколько теперь на 30 документах? |
Vikulik |
(Guest @ 04.02.2018 22:44) Вот результаты: > system.time(tm_map(data_cor, content_transformer(function(x) sapply(x, mystem)), lazy = TRUE)) пользователь система прошло 0 0 0 > system.time(tm_map(data_cor, content_transformer(function(x) sapply(x, mystem)), lazy = FALSE)) пользователь система прошло 0.04 0.11 6.37 Единственное, что пришлось использовать волатильный корпус, т.е.: data_cor <- VCorpus(VectorSource(...)) вместо data_cor <- Corpus(VectorSource(...)) Спасибо большое за помощь! Но если я понимаю правильно, функция tm_map применяется не к каждому элементу корпуса последовательно, а ко всем документам единовременно, и решение выше является единственно работающим, так? |
« Предыдущая тема · Биофизика и матметоды в биологии · Следующая тема » |