2016-06-30 6 views
1

Рассмотрим следующее MWE в упражнении для интеллектуального анализа текста, используя R {tm}: Toyota имеет несколько моделей внедорожников в США. models<-c("highlander","land cruiser","rav4","sequoia","4runner"). Общие средства массовой информации относятся к ним не как «toyota rav4» (корпус уже преобразован в нижний регистр), а как «rav4». Чтобы получить один столбец toyota suvs в DocumentTermMatrix, мне нужно преобразовать все эти бренды в один общий «toyota_suv». То, что я делаю сейчас, это повторить mycorpus<-tm_map(mycorpus, gsub, pattern="rav4", replacement="toyota_suv") для длины (моделей). Взломам было бы установить model_names<-rep("toyota_suv",length(models)) и продолжить жизнь. Как настроить словарь со многими-к-одному, так что все models заменяются на «toyota_suv» в одном выражении? Большое спасибо.R словарь: создать сопоставление «много-к-одному»

ответ

4

Вы можете использовать векторную функцию замещения. Пакет stringi предлагает такую ​​функцию с семейством функций stri_replace_all. Здесь я использую stri_replace_all_fixed, но при необходимости настраиваю чувствительность к регистру и другие параметры.

library(tm) 
library(stringi) 

toyota_suvs <- c("highlander","land cruiser","rav4","sequoia","4runner") 

tm_map(toyCorp, stri_replace_all_fixed, 
    pattern = toyota_suvs, replacement = "toyota_suv", 
    vectorize_all = FALSE) 

данные:

toyExample <- c("you don't know about the rav4, John Snow", 
    "the highlander is a great car", 
    "I want a land cruiser") 

toyCorp <- Corpus(VectorSource(toyExample)) 
+0

Спасибо. не открывая другого вопроса, как это соотносится с сопоставлением словарей с точки зрения времени? – Pradeep

+0

@ Pradeep Я не знаю. Я думаю, вам нужно будет немного поработать над созданием примера набора документов и точно, какую продукцию вы хотите получить. Если вы хотите изменить сами входные документы (перед созданием корпуса), это будет трудно превзойти с помощью 'stringi' напрямую:' stri_replace_all_fixed (toyExample, pattern = toyota_suvs, replacement = "toyota_suv", vectorize_all = FALSE) '. Подача в 'tm_map' значительно замедлит процесс. – Jota

+0

Если время является важным соображением, я бы отошел от пакета 'tm'. Возможно, вы можете попробовать 'quanteda', который имеет метод словаря, однако я не смог заставить его работать с помощью нескольких слов типа« сухопутный крейсер ». Таким образом, потребуется дополнительная обработка. – Jota