Nano Hash - криптовалюты, майнинг, программирование

Обнаружение нескольких шаблонов с помощью grepl с большими векторами шаблонов в R

каталог - это вектор символов с разными значениями. Он имеет следующую структуру

value   name    location    companybrand        
1111    ikea    boston      nike
1234    7/11    new york    marlboro
1456    walmart new york    marlboro

листинг содержит все города США -> Чикаго, Бостон, Нью-Йорк, Лос-Анджелес и еще одну колонку с полными названиями брендов.

Location                    Brand
New York, 5th Avenue        Coca Cola LTD
New York, 51 Str            Nike Corporation 
New York, Broadway          Marlboro Incorporated

if (sum(grepl(paste("\\b", as.character(location), "\\b", sep = ""), catalog$value[i], fixed = FALSE)) > 0 && 
    sum(grepl(paste("\\b", as.character(companybrand), "\\b", sep = ""), catalog$value[i], fixed = FALSE)) > 0){
  subdata <- subset(listing, listing$local == as.character(location[which(grepl(paste("\\b", as.character(location), "\\b", sep = ""), catalog$value[i], fixed = FALSE)]) && listing$commercial == as.character(companybrand[which(grepl(paste("\\b", as.character(companybrand), "\\b", sep = ""), catalog$value[i], fixed = FALSE))]))
}

Как видите, я пытаюсь запустить функцию grepl, используя несколько шаблонов, которая возвращает следующую ошибку:

Warning message:
In grepl(paste("\\b", distmunicipality, "\\b", sep = ""), ctlg$distvalor[i],  :
  argument 'pattern' has length > 1 and only the first element will be used

Я читал в других сообщениях, что подходящим решением для этого является свертывание всех проверяемых шаблонов в одну строку с разделителями каналов, как показано ниже:

companybrand <- paste(companybrand, collapse = "|")
location <- paste(location, collapse = "|")

который отлично работает для небольших векторов, но в моем случае у меня есть 4 миллиона элементов в бренде компании, что приводит к завершению работы R из-за нехватки памяти. Есть ли практический способ сделать это (возможно, используя sapply), чтобы запустить этот матч, не требуя вычислительных затрат?


  • Посмотрите на пакет stringi. Он поддерживается C / ++, и большинство операций векторизованы поверх string и pattern (которые используют string и pattern). Вероятно, это будет значительно быстрее и эффективнее с точки зрения памяти. 07.10.2015
  • Каков ваш ожидаемый результат? 07.10.2015
  • @hrbrmstr Раньше я использовал пакет stringr, в частности функцию str_detect, чтобы выполнить это, и, хотя он работает, мне казалось, что с огромным объемом данных это было довольно неэффективно, поэтому я прибег к использованию grepl в предположении что базовые функции R более эффективны с точки зрения вычислений. Я ошибаюсь, думая так? 07.10.2015
  • @AvinashRaj Мой вывод будет подмножеством списка фреймов данных. Для данного значения каталога на итерации i он должен найти, какое местоположение и торговая марка компании находятся в этой строке, и соответственно подмножество списка фрейма данных. Как вы понимаете, это часть более крупного кода, отсюда и индексация i. 07.10.2015
  • stringi (основа stringr) будет намного эффективнее, чем base (а также обрабатывать более широкий массив символьных данных, не то, чтобы вам это могло понадобиться сейчас). он основан на site.icu-project.org. Вы также можете mclapply это сделать, если у вас нет Windows. 07.10.2015

Ответы:


1

Я не уверен, почему этот вопрос все еще жив.

Кажется, что проблема в том, что у вас есть два названия для каждой марки и местоположения, вы хотите объединить два набора данных по бренду и местоположению, чтобы у вас была под рукой информация из обоих источников данных. Похоже на нечеткое слияние или приблизительное совпадение объединить.

В любом случае, пытаясь ответить на OP, речь идет не столько о том, как создать гигантский логический вентиль, сколько о том, как применить кучу более мелких логических вентилей.

В вашем примере вы упоминаете, что проблема с конкатенированным списком каналов состоит в том, что он будет содержать 4 миллиона записей. Я бы предложил примерно следующее:

require(data.table)
catalog<- data.table(value=c("1111","1234","1456"),
                     name=c("ikea","7/11","walmart"),
                     location=c("boston","new york","new york"),
                     companybrand=c("nike","marlboro","marlboro"))

listing<-data.table(Location=c("New York, 5th Avenue","New York,51 str","New York, Broadway"),
                    Brand=c("Coca Cola LTD","Nike Corporation","Marlboro Incorporated"))


for(companybrand in unique(catalog$companybrand)){
  listing[grepl(paste0("\\b",companybrand,"\\b"),Brand,ignore.case=TRUE),
          companybrand:=companybrand]
}

for(location in catalog$location){
 listing[grepl(paste0("\\b",location,"\\b"),location,Location,ignore.case=TRUE),
    location:=location]
}

dictionary<-listing[complete.cases(listing)]

Примечание: если брендов и местоположений в catalog гораздо больше, чем в inlisting, то я бы инвертировал код и заставил цикл for проходить по меньшим listing записям.

Приведенный выше код генерирует словарь, который вы можете использовать для поиска пар местоположения-бренда (или пар местоположения-бренда компании) для их переводов, и он должен быть более эффективным с точки зрения памяти (я не тестировал это).

Для подмножества данных на этом этапе все, что вам нужно сделать, это объединить словарь (возможно, переименовав столбцы словаря) с любым набором данных, который вы хотите разбить на подмножество по именам столбцов, которые использует набор данных.

09.06.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..