2014-12-26 1 views
-1

Как использовать apply в R с двумя кадрами данных?

У меня есть dataframe с ~ 1M строк текста. Я хочу заменить большой список пользовательских стоп-слов, которые пакет TM не может обрабатывать. Список состоит из ~ 37 тыс. Слов. У меня есть следующий код, который работает, и требуется некоторое время, но я хочу улучшить код с помощью функции apply.

Проблема

Я не знаю, как использовать контент из двух dataframes в применимом применяются функции. Вот мой код:

stopwords <- read.table("stopwords.csv", header=TRUE, quote="\"", stringsAsFactors=FALSE) 
corpus <- read.delim("corpus.txt", header=TRUE, stringsAsFactors=FALSE) 

for(i in 1:nrow(stopwords)){ 
    corpus$text <- gsub(paste("\\<",stopwords$list[i],"\\>", sep=""), "", corpus$text) 
    message(paste(i, stopwords$list[i], sep=" - ")) #Show in console 
} 

Я также отображение текущего счета/слова в консоли, чтобы отслеживать прогресс, но как только у меня есть применение функции работать, я обернуть его в pbapply пакета, чтобы получить правильный индикатор ,

Примеры данных

Корпус Dataframe - Одна колонка с «текст» в качестве заголовка
полиции миров действовал решительно премьер Майк Бейрд
полицейскую операцию по карте пораженную область трафика реального трафика NSW
комиссар номер Сципиона заложников не указано
nsw премьер-министр избегать мартина место осведомлено о бдительности
происходит мысли сердца заложников семьи пострадавших
Lindt кафе хороший отважный могучий воин аллаха членоголовый
IKEA полиции консультируют граждан бизнеса избежать торговых площадок

Игнорируемые слова Кадр данных - с одной колонкой с «список» в качестве заголовка.
ааа
AAAA
aaaaaaand
aaaaand
Aaaargh
aaack
aaahh
aaahhhh
aaalll
aaand
aaarse
Aachen
aadityanath

+0

Какова цель угловых кронштейнов? – jlhoward

+0

Это регулярное выражение, которое соответствует только целым словам, в противном случае заменяются части слов. – RUser

ответ

1

Вы можете попробовать следующую векторизованную подход:

# create a string of stopwords wrapped in `\\<` and `\\>` 
x <- paste(paste0("\\<", stopwords$list, "\\>"), collapse = "|") 
# use x to replace the words using gsub 
corpus$text <- gsub(x, "", corpus$text) 

(Не тестировались в отсутствии воспроизводимого примера)

Чтобы проиллюстрировать, как паста и paste0 работы:

> (stopwords <- letters[1:5]) 
#[1] "a" "b" "c" "d" "e" 

paste(paste0("\\<", stopwords, "\\>"), collapse = "|") 
#[1] "\\<a\\>|\\<b\\>|\\<c\\>|\\<d\\>|\\<e\\>" 

Используя это в gsub заменит любой из | разделенные стоп-слова с "" без цикла.По существу, он создает одну строку, содержащую все стоп-слова, каждая из которых завернута в \\< и \\>, потому что они разделены логическим ИЛИ (который является | в R).

+2

Я получаю эту ошибку: Ошибка в gsub (вставить (paste0 ("\\ <", stopwords $ list, "\\>"), collapse = "|"),: assertion 'tree-> num_tags == num_tags' не удалось выполнить regexp: файл 'tre-compile.c', строка 634 – RUser

+1

@RUser, что делать, если вы запускаете только 'x <- paste (paste0 (" \\ <", stopwords $ list," \\> "), collapse = "|") '- это работает? Ваша проблема не воспроизводима, поэтому ее нелегко помочь. –

+0

Я ценю вашу помощь, спасибо! Он работает и дает мне вектор символов всех слов, как указано выше. Например, [1 ] «\\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ | \\ " – RUser