R как язык программирования общего назначения

Мне понравился Python раньше, потому что у Python есть богатые встроенные типы, такие как наборы, диктофоны, списки, кортежи. Эти структуры помогают писать короткие сценарии для обработки данных.

С другой стороны, R подобен Matlab и имеет скаляр, вектор, фрейм данных, массив и список в качестве своих типов данных. Но в нем отсутствуют наборы, диктофоны, кортежи и т.д. Я знаю, что тип списка является мощным, многие операции можно рассматривать как обработку списка. Но идея использования R как языка общего назначения остается неопределенной.

(Ниже приведен пример пример. Не означает, что я сосредоточен на обработке текста/разработке.)

Например, мне нужно сделать подсчет TF-IDF для набора новостей (например, 200 000 статей в папке и ее подпапках).

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

Я знаю, что могу использовать другой язык для обработки и загрузки данных в R. Но, может быть, (для небольших вещей) лучше всего перевести всю предварительную обработку в один R script.

Итак, мой вопрос заключается в том, что R обладает достаточными возможностями в таких богатых структурах данных на уровне языка? Или, если нет, любые пакеты обеспечивают хорошее расширение для языка R?

Ответы

Ответ 1

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

Несколько оговорок. Во-первых, я бы предложил очень внимательно изучить пару внешних пакетов для набора задач в вашем Q - в частности, хеш (структура данных ключевого значения типа python) и stringr (состоит в основном из оберток над менее удобными функциями манипуляции с строками в базовой библиотеке)

Оба stringr и хэш доступны на CRAN.

> library(hash)
> dx = hash(k1=453, k2=67, k3=913)
> dx$k1
  [1] 453
> dx = hash(keys=letters[1:5], values=1:5)
> dx
  <hash> containing 5 key-value pair(s).
   a : 1
   b : 2
   c : 3
   d : 4
   e : 5

> dx[a]
  <hash> containing 1 key-value pair(s).
  a : 1

> library(stringr)
> astring = 'onetwothree456seveneight'
> ptn = '[0-9]{3,}'
> a = str_extract_all(astring, ptn)
> a
  [[1]]
  [2] "456"

Похоже, что существует большое количество пользователей R, для которых обработка текста и текстовая аналитика составляют значительную часть их повседневной работы, о чем свидетельствует CRAN Просмотр задачи обработки естественного языка (одна из примерно 20 таких неофициальных доменных пакетов). Внутри этого Task View находится пакет tm - пакет, предназначенный для функций интеллектуального анализа текста. Включенные в tm - оптимизированные функции для обработки задач, таких как упомянутые в вашем Q.

Кроме того, R имеет отличный выбор пакетов для интерактивной работы на достаточно больших наборах данных (например, > 1 ГБ) часто без необходимости создания инфраструктуры параллельной обработки (но которая, безусловно, может использовать кластер, если он доступен), Самым впечатляющим из них, на мой взгляд, является набор пакетов под рубрикой "Проект Bigmemory" (CRAN) Майкла Кейна и Джона Эмерсона в Йеле; этот Проект включает в себя большую память, бинаналитику, синхронность, bigtabulate и bigalgebra. В целом, методы, лежащие в основе этих пакетов, включают в себя: (i) распределение данных в общую память, что позволяет координировать совлокальный доступ отдельными параллельными процессами с одной копией данных; (ii) структуры данных с файловой поддержкой (которые, я считаю, но я не уверен, являются синонимами файловой структуры с отображением памяти и которые позволяют очень быстро получить доступ с диска с помощью указателей, что позволяет избежать ограничения RAM на доступный размер файла).

Тем не менее, довольно много функций и структур данных в стандартной библиотеке R упрощают интерактивную работу с данными, приближающимися к обычным пределам ОЗУ. Например,.RData, собственный двоичный формат, настолько прост, насколько это возможно (команды сохраняют и загружают), и у него отличное сжатие:

> library(ElemStatLearn)
> data(spam)
> format(object.size(spam), big.mark=',')
  [1] "2,344,384" # a 2.34 MB data file
> save(spam, file='test.RData')

Этот файл "test.RData" имеет значение 176 КБ, более 10-кратное сжатие.

Ответ 2

Это просто неверно, что R не хватает наборов, dicts, списков и кортежей; они просто реализованы как некоторые другие структуры. Конечно, производительность может быть проблемой, но обычно она не хуже, чем у Python, и вы обычно можете найти пакет, который имеет решение, закодированное как эффективный код C.

Я мало разбираюсь в текстовом поиске, но tm пакет может содержать то, что вы хотите.

Ответ 3

Вы должны посмотреть Просмотр задачи обработки естественного языка.

Заголовки тем:

Фонетика и обработка речи:
Лексические базы данных:
Извлечение ключевых слов и манипуляция с общей строкой:
Обработка естественного языка:
Строковые ядра:
Текстовое расписание: