Categories

A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

Обработка естественно-языковых текстов в R: облако слов

Обработка естественно-языковых текстов (Natural language processing) – это одна из областей, в которых применяется R.

В этой публикации вы познакомитесь с базовыми инструментами анализа, основанного на данных о частоте встречаемости слов. В частности, мы рассмотрим функции из расширений tm и wordcloud: подготовим текстовые документы для частотного анализа и сделаем на их основе облако слов.

Материалом для работы у нас послужит выборка новостных сообщений о работе Псковского городского молодёжного центра, опубликованных в течение 2013 года в различных Интернет-СМИ. Поиск публикаций и сбор отобранных текстов произвела Екатерина Банщикова в рамках работы над своей дипломным проектом. Всего из более чем сотни новостных сообщений случайным образом было выбрано 20 текстов.

Текстовый корпус

Источники формирования корпуса

Первым шагом при обработке текстов является подготовка простого корпуса текстов. В библиотеке tm поддерживается несколько источников формирования корпуса. Например, на моём компьютере после установки этой библиотеки мне стали доступны функции по созданию корпуса из массива данных (DataFrameSource), из каталога файлов, каждый из которых содержит отдельный документ (DirSource), из вектора (VectorSource), из текстов, доступных по URI-ссылке (URISource) и из набора новостных сообщений агентства Reuters, входящих в состав расширения tm (ReutersSource). Помимо типов, которые входят в библиотеку tm, пользователь может оперативно установить расширения из CRAN, позволяющие импортировать тексты из веб-источников в форматах XML, JSON, HTML (tm.plugin.webmining), из почтовых файлов eml и mbox (tm.plugin.mail), из файлов французской программы текстового анализа Alceste (tm.plugin.alceste), из файлов, полученных от новостных агрегаторов Europresse (tm.plugin.europresse), LexisNexis (tm.plugin.lexisnexis), Dow Jones Factiva (tm.plugin.factiva).

Поскольку наши новостные сообщения хранятся в отдельных текстовых файлах, мы воспользуемся источником типа DirSource.

Чтение источника

Документы могут храниться в источнике в разных форматах. Библиотека tm поддерживает чтение документов в форматах простого текста (readPlain), PDF (readPDF), Microsoft Word (readDOC), XML (readXML), табличной структуры (readTabular – для источников DataFrameSource и VectorSource) и несколько Reuters-форматов. Наш вариант – простой текст.

library(tm)
# Файлы хранятся в каталоге articles
dirpath <- "articles"
articles <- Corpus(DirSource(dirpath),
                   readerControl = list(reader = readPlain,
                                      language = "ru",
                                      load = T))

Предполётная обработка документов корпуса

Все наши тексты сохранены в “дружеском к читателю” формате: с использованием падежей и склонений, пунктуации, строчных и прописных букв, с массой предлогов и прочих частей речи. Все эти элементы текста несут смысл в контексте, но будут мешать при выполнении нашей задачи – построения облака слов.

Библиотека tm содержит инструменты по удалению лишних пробелов, приведению всех букв к строчному виду, удалению цифр, знаков пунктуации и стоп-слов. Приятно то, что присутствует в библиотеке и список стоп-слов для русского языка (проверить его содержание можно с помощью команды stopwords("russian")).

Команда tm_map позволяет применить заданную функцию к каждому документу в корпусе.

# Текстовые файлы были сохранены в кодировке Windows. Конвертируем.
articles <- tm_map(articles, iconv, 'cp1251', 'UTF-8')
articles <- tm_map(articles, stripWhitespace)
articles <- tm_map(articles, tolower)
articles <- tm_map(articles, removeNumbers)
articles <- tm_map(articles, removeWords, stopwords("russian"))
articles <- tm_map(articles, removePunctuation)

Облако слов: первый заход

library(wordcloud)
wordcloud(articles, random.order=F, max.words=80, 
          colors=brewer.pal(6,"Oranges"))
Облако слов без стемматизации

Облако слов без стемматизации

Всё бы хорошо, но на графике встречаются одни и те же слова, но в разных формах. Например: молодёжном – молодёжного – молодёжный, году – года, участники – участников. Поскольку в случае с облаком слов нам не важно, в какой форме слово использовалось, а гораздо полезнее сам факт появления слова и его частота, то нам следует привести все слова к исходной форме.

Стемматизация текстов

Стемматизация по-русски, или плач о национальной свободе

Любую околонаучно-исследовательскую работу крайне желательно проводить с помощью таких компьютерных программ, чей исходный код открыт и доступен для проверки публикой. Иначе, если вы, например, производите расчёты в Excel или SPSS, выводы и воспроизводимость вашего исследования можно поставить под сомнение, т.к. алгоритмы, по которым эти расчёты производились, недоступны ни вам, ни сообществу, а только разработчику программы.

Подозреваю, что алгоритмы стемматизации, в частности, для русского языка – это вещь крайне наукоёмкая, требующая для её создания больших умственных трудозатрат. В России, где отношение к нарушению прав на интеллектуальную собственность достаточно лояльное, а уровень понимания того, что такое лицензионный договор, открытый исходный код и свободные лицензии, у нашего научного сообщества низкий. Поэтому неудивительно, что эффективной программы для стемминга русскоязычных текстов нет, а для создания, например, «Национального корпуса русского языка» с участием РАН использовалась программа с закрытым исходным кодом MyStem от Яндекса. Это при том, что на разработку корпуса выделялось несколько грантов из государственного бюджета. Выглядит это грустно-позорно. Благо, обнаружился Открытый корпус русского языка, все тексты и связанное с ним программное обеспечение распространяются под свободными лицензиями – сразу жить стало приятнее.

Что же есть доступного в R для стемминга русского языка? Библиотека SnowballC реализует стеммер Портера. Например, на наши экземпляры дублирующих слов выше мы получем следующее:

wordStem(c('молодёжный', "молодёжного", "молодёжном",
           "года", "году", "участники", "участников"), language='ru')

[1] "молодёжн" "молодёжн" "молодёжн" "год" "год" "участник" "участник"

Вроде бы ничего, но не каждый поймёт, что такое «молодёжн». Ещё один пример стеммера с открытым исходным кодом – это отечественная разработка Андрея Коваленко Stemka. Написан на C++, может быть использован в качестве библиотеки, так что энтузиасты могут сделать библиотеку для R. На аналогичную строку русских слов Stemka выдаст следующий результат:

молодёжн|ый
молодёжн|ог|о
молодёжн|ом|
год|а
год|у
участник|ам|
участник|и

Удалив в каждой строке вертикальную черту и символы справа от неё мы получим результат, аналогичный портеровскому. Кстати, слово «кровать» он превращает в «крова», как и Портер.

Существует открытый проект АОТ, согласно описаниям предлагающий «COM-объекты, которые можно скомпилировать под Visual Studio и использовать под Delphi». Судя по активности в их svn-репозитории, проект жив. Спасибо разработчикам, что помимо доступных COM-объектов, для компиляции которых нужно купить Visual Studio, Delphi и операционную систему Windows, они предоставили демо-версию своих продуктов онлайн. Мы можем воспользоваться примером морфологического анализа http://aot.ru/demo/morph.html. Данный анализатор успешно справляется и со словом «кровать», и «молодёжного» он превращает в «молодёжный». Для немассированной обработки текстов в R можно отправлять автоматические запросы через демо-версию и «вытаскивать» нужное слово из получаемых в ответ страниц с помощью XPath. Но здесь нужно подумать, насколько такие действия сочетаются с условиями использования демо-версии.

Исходя из вышесказанного, придётся грусто-позорно пользоваться программой с закрытым исходным кодом.

Стемматизация с помощью MyStem от Яндекса

Стеммер MyStem разработан в 1998 году сооснователем Яндекса Ильёй Сегаловичем. Программа доступна для различных операционных систем, исходный код закрыт. И хотя сам сайт Яндекса уверяет, что программа доступна только для некоммерческого использования, внимательно ознакомившись с лицензионным договором, в пункте 3.2 вы обнаружите, что «Программа может использоваться в коммерческих целях для разработки/создания каких-либо сервисов или программ, включаться и использоваться по прямому функциональному назначению в составе таких сервисов или программ, а также использоваться иным образом в процессе оказания услуг/выполнения работ». Исключения составляют те случаи, когда пользователь хочет с помощью MyStem заниматься спамом, раскруткой сайтов или создать свой поисковый движок. Спасибо Яндексу за это!

Правда, помимо закрытого кода у MyStem есть ещё одна ложка дёгтя: в пункте 3.11 соглашения читаем, что «при установке на персональный компьютер каждой копии Программы присваивается индивидуальный номер, который автоматически сообщается Правообладателю». Понятно, что Яндекс хочет знать, сколько копий его программы используется (ведь часть пользователей MyStem точно приносит экономический вред Яндексу, когда пользуются им для раскрутки сайтов), но всё равно неприятно.

Для использования mystem в R создадим одноименную функцию. Для работы требуется, чтобы операционная система знала, где лежит исполняемый файл mystem (в Windows, видимо, mystem.exe).

mystem <- function(doc) {
  library(stringr)
  sdoc <- system('mystem -nl -e utf-8 ', intern=T, input=doc)
  # При получении нескольких вариантов mystem разделяет их
  # вертикальной чертой. Удалим черту и варианты.
  sdoc <- str_replace(sdoc, '\\|.*$', '')
  # Если mystem сомневается в результате, он добавляет знак вопроса. Удаляем.
  sdoc <- str_replace(sdoc, '\\?', '')
  sdoc <- paste(sdoc, collapse=" ")
  attributes(sdoc) <- attributes(doc)
  sdoc
}

Теперь мы обладаем инструментом для стемминга и можем возвращаться в облака.

Финальный аккорд

Дообработка текстов корпуса

Добавляем к обработке текстов стемматизацию. Также логично удалить стоп-слова уже после приведения слов к исходной форме.

articles <- tm_map(articles, iconv, 'cp1251', 'UTF-8')
articles <- tm_map(articles, stripWhitespace)
articles <- tm_map(articles, tolower)
articles <- tm_map(articles, removeNumbers)
articles <- tm_map(articles, removePunctuation)
articles <- tm_map(articles, mystem)
articles <- tm_map(articles, removeWords, c(stopwords("russian"),
                                            "это", "также",
                                            "быть", "мочь",
                                            "май", "апрель", "март",
                                            "ноябрь", "который",
                                            "псковский", "молодежный",
                                            "псков", "центр", 
                                            "городской"))

Рисуем облако слов

wordcloud(articles, random.order=F, max.words=80, 
          colors=brewer.pal(6,"Oranges"))
Облако слов после стемматизации. Слова с низкой частотой еле видны

Облако слов после стемматизации. Слова с низкой частотой еле видны

Теперь все существительные представлены в именительном падеже, глаголы – в инфинитиве. Но слова с низкой частотой, которые рисуются самым маленьким размером шрифта и с наименьшей интенсивностью цвета, практически не читаются. Что случилось, ведь мы не меняли никаких характеристик графика, кроме самих слов и их частот?

В частотах весь фокус: в предыдущей версии графика частоты одного и того же слова «размазывавались» по разным словоформам, а теперь частоты скопились в базовой словоформе. И, естественно, слова-чемпионы добрали гораздо больше, чем слова-аутсайдеры. В итоге, разрыв в частотах между лидерами и отстающими увеличился, а чтобы этот разрыв показать, алгоритм увеличил разницу в размере шрифта и интенсивности цвета. Что делать?

Как правильно использовать цвета в статистике или немного грамматики графики

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

Облако слов без использования цвета. Все слова хорошо читаются

Облако слов без использования цвета. Все слова хорошо читаются

В таком случае все слова хорошо читаются. А если заказчик всё-таки хочет цветную картинку? Надо подумать…

А на сегодня давайте сделаем последнюю доработку: уберём из графика несодержательные в случае с молодёжным центром слова:

articles <- tm_map(articles, removeWords, c(stopwords("russian"),
                                            "это", "также",
                                            "быть", "мочь", "октябрь",
                                            "май", "апрель", "март",
                                            "ноябрь", "который",
                                            "псковский", "молодежный",
                                            "псков", "центр", 
                                            "городской"))
wordcloud(articles, random.order=F, max.words=80)
Облако слов из новостей о Псковском городском молодёжном центре

Облако слов из новостей о Псковском городском молодёжном центре

24 комментария Обработка естественно-языковых текстов в R: облако слов

  • Сергей

    Добрый день, Александр!
    Не могу построить облако слов используя Ваш пример. Не могли бы Вы помочь разобраться в этом примере.
    Опишу подробнее и пошагово:
    1. Устанавливаю библиотеки
    library(tm)
    library(wordcloud)
    2. На диске есть папка oblako в ней один файл 1.txt в нем примерно 20 слов (какие-то повторяются часто, какие-то один раз)
    3. Делаю как в Вашем примере
    dirpath <- "oblako"
    oblako <- Corpus(DirSource(dirpath),
    readerControl = list(reader = readPlain,
    language = "ru",
    load = T))
    R выдает сообщение (не понимаю какую финальную строку он имеет ввиду)
    Warning message:
    In readLines(y, encoding = x$Encoding) :
    incomplete final line found on 'oblako/1.txt'
    4. Строю само облако
    wordcloud(oblako, random.order=F, max.words=80,
    colors=brewer.pal(6,"Oranges")

    Он мне выдает первые два слова из текстового файла, если поменять порядок слов в файле может выдать больше.
    В хелпе wordcloud не нашел с помою какого параметра можно исправить ситуацию.

    Буду благодарен если Вы найдете время мне в этом разобраться. Спасибо!

    • Александр Матрунич

      Сергей, добрый день!

      Это, думаю, с кодировкой исходного файла проблема. В Windows работаете?

      Здесь проблема не в wordcloud, а в readLines, которая вызывается для чтения содержимого файлов, когда вы вызываете функцию Corpus. readLines прочитывает ваш файл строчку за строчкой, а потом натыкается в определённом слове на какой-то символ, который функцией интерпретируется как “incomplete final line”. Поскольку строка, с точки зрения функции, последняя, то дальше файл не читается. И в текстовом корпусе oblako хранятся только те слова, которые находятся в исходном файле не ниже виновной строки.

      Попробуйте, например, в этом текстовом файле следующую строку соединить с “виновной” строкой, чтобы удалить этот проблемный символ (он, скорее всего, не печатается, а служебный), а потом разбить строку Enter’ом заново.

  • Сергей

    Здравствуйте, Александр! Спасибо за ответ!

    Работаю в windows 7. Поэкспериментирую с “виновной” строкой. Однако при работе с большим объемом эксперименты будут очень трудоемкими. Может мне поможет конвертация текста в другой формат или кодировку так, что бы остаться на windows. Или решение такой задачи в winwows часто будет глючить.

    • Александр Матрунич

      Сергей, под виндой тоже должно работать. Скорее всего ещё что-нибудь со знаком переноса строки (в Windows одно, в других ОС – другое). Можно попробовать сохранить с помощью Notepad++, эта программа позволяет менять кодировки и знак переноса строк. Хотя удивительно, что именно из-за одной строки.

      Ещё вариант – это посмотреть опции Corpus() или DirSource(), возможно, там есть опции для задания кодировки.

      Ещё вариант – это вместо чтения из текстовых файлов использовать другой способ загрузки корпуса (напр., XMLSource). Тем более, если объёмы у вас большие и “скакать” по файлам в поисках запрещённых символов непродуктивно.

  • Александр Матрунич

    Вообще под Windows в R вечно выскакивают проблемы с кириллицей. То там, то тут нужны какие-то дополнительные опции, потому что в винде не UTF (это я про 7 и ниже, в 8 не пробовал). Всё-таки если R использовать на регулярной основе и для “production”, то я б рекомендовал GNU/Linux. Если не хочется целиком уходить с MS, то можно в виртуальной машине развернуть линукс, там поставить RStudio server и работать в RStudio через браузер из винды.

  • Сергей

    Спасибо, Александр!
    Попробую предложенные варианты.

  • Сергей

    Добрый день, Александр!
    Хотелось бы еще получить вашу консультацию.
    Поставил ubuntu 14.04 поставил R и R studio, загружаю пакеты необходимые для построения облака слов

    install.packages(“tm”, dependencies=T)
    он ругается

    > install.packages(“tm”)
    Installing package into ‘/home/serg/R/i686-pc-linux-gnu-library/3.0’
    (as ‘lib’ is unspecified)
    Warning in install.packages :
    package ‘tm’ is not available (for R version 3.0.2)
    я так понял не хочет ставить на версию 3.0.2 но это вроде бы последняя версия, по карайней мере при попытке установить заново R он говорит установлена последняя версия.
    И в винде установлена версия 3.0.2, пакет tm устанавливается (хотя и предупреждает, что пакет был собран под версию 3.0.3).

    Не могу понять как поставить 3.0.3 или поставить tm на версию 3.0.2
    Заранее спасибо!

  • Александр Матрунич

    Сергей, попробуйте установить пакет средствами убунты через apt-get:

    apt-get install r-cran-tm

    Думаю, что дело в том, что убунта вышла в апреле, и в её “наборе” R версии 3.0, а летом вышел R версии 3.1. Но в убунте она не обновится до тех пор, пока дистрибутив целиком не обновится (14.10). Когда вы средствами R обновляете пакеты (update.packages / install.packages), то R скачивает самые последние версии, расчитанные на самое свежее ядро R.

    А когда вы пользуетесь apt-get, то убунта сама скачивает из своих репозиториев версию пакета, актуальную именно для неё. Т.е. убунтовцы сами отдельно поддерживают кучу R-пакетов.

    Да, интересно, в федоре версия R последняя, т.е. у них другая политика по отношению к R.

    http://stackoverflow.com/questions/2170043/r-apt-get-install-r-cran-foo-vs-install-packagesfoo

  • Сергей

    Добрый день, Александр!
    С пакетами разобрался, простейшее облако строить получается.

    Если есть время помогите разобраться в стемматизации.
    Не получается выполнить стемматизацию функцией mystem.

    Есть два файла txt, загружаю их

    dirpath <- "oblako"
    oblako <- Corpus(DirSource(dirpath),
    readerControl = list(reader = readPlain,
    language = "ru",
    load = T))

    Далее

    mystem <- function(doc) {
    library(stringr)
    sdoc <- system('mystem -nl -e utf-8 ', intern=T, input=doc)
    # При получении нескольких вариантов mystem разделяет их
    # вертикальной чертой. Удалим черту и варианты.
    sdoc <- str_replace(sdoc, '\\|.*$', '')
    # Если mystem сомневается в результате, он добавляет знак вопроса. Удаляем.
    sdoc <- str_replace(sdoc, '\\?', '')
    sdoc <- paste(sdoc, collapse=" ")
    attributes(sdoc) <- attributes(doc)
    sdoc
    }

    Затем

    oblako <- tm_map(oblako, stripWhitespace)

    oblako <- tm_map(oblako, removeNumbers)
    oblako <- tm_map(oblako, removeWords, c(stopwords("russian"),"это", "наши"))
    oblako <- tm_map(oblako, removePunctuation)
    oblako <- tm_map(oblako, mystem)

    он выдает ошибку
    oblako <- tm_map(oblako, mystem)
    sh: 1: mystem: not found
    sh: 1: mystem: not found
    Предупреждение
    In mclapply(content(x), FUN, …) :
    all scheduled cores encountered errors in user code

    еще не понимаю строчку
    oblako wordcloud(oblako, random.order=F, max.words=80, min.freq=2, colors=”Blue”)
    Ошибка в UseMethod(“meta”, x) :
    нет подходящего метода для ‘meta’ применяемого к объекту класса “character”
    Вдобавок: Предупреждение
    In mclapply(unname(content(x)), termFreq, control) :
    all scheduled cores encountered errors in user code

    • Александр Матрунич

      он выдает ошибку
      oblako < - tm_map(oblako, mystem) sh: 1: mystem: not found sh: 1: mystem: not found

      В операцоинной системе должна быть установлена программа mystem. В данном случае R передаёт управление операционной системе, чтобы та выполнила команду ‘mystem -nl -e utf-8 ‘. ОС пытается это сделать и не находит программу mystem.

      oblako wordcloud(oblako, random.order=F, max.words=80, min.freq=2, colors=”Blue”)

      Это я тоже не понимаю 🙂 Видимо, вы хотели запустить так:

      wordcloud(oblako, random.order=F, max.words=80, min.freq=2, colors=”Blue”)

  • Матвей

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

  • Александр Матрунич

    Матвей, вы работаете в Windows? Можете показать образец проблемного кода?

  • Матвей

    Работаю в Windows
    Код облака:
    wordcloud(vector, max.words = 100, random.order = F, scale = c(4, 1))

    Результат получается следующий:
    Латиница
    http://prntscr.com/707llc
    Кириллица
    http://prntscr.com/707k73

    Т.е. с кириллицей получается большой разброс между словами.

  • Александр Матрунич

    Предупреждений никаких не выдаёт? Похоже, что wordcloud() неправильно определяет итоговый размер слова, т.е. он “думает”, что длина больше, чем на самом деле. Т.е. у него некорректная информация о параметрах шрифта.

    Попробуйте изменить параметры шрифта. В самой функции wordcloud() таких аргументов нет, но все неопознанные аргументы wordcloud() будет передавать дальше в базовую функцию text().

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

    У text() есть параметр font, попробуйте задать здесь какой-нибудь системный шрифт Windows (Arial?).

    И такой же параметр попробуйте прямо в wordcloud()

  • Матвей

    Сама функция text() вроде выводит все верно. Код ниже располагает 4 строчки близко друг к другу (как понимаю, в основе параметра pos в т.ч. длина текста).

    plot(c(0, 1), c(0, 1), ann = F, bty = ‘n’, type = ‘n’, xaxt = ‘n’, yaxt = ‘n’)
    text(x = 0.5, y = 0.5,pos =1, enc2native(“ТЕКСТ ТЕКСТТЕКСТТЕКСТ ТЕКСТ”))
    text(x = 0.5, y = 0.5,pos =2, enc2native(“ТЕКСТ ТЕКСТТЕКСТТЕКСТ ТЕКСТ”))
    text(x = 0.5, y = 0.5,pos =3, enc2native(“ТЕКСТ ТЕКСТТЕКСТТЕКСТ ТЕКСТ”))
    text(x = 0.5, y = 0.5,pos =4, enc2native(“ТЕКСТ ТЕКСТТЕКСТТЕКСТ ТЕКСТ”))

    Возможно ли как-то увидеть код wordcloud (если он на R)?

  • Александр Матрунич

    Да, просто вводите название функции без скобок:
    > wordcloud

    А шрифт пробовали изменять?

    90%, что это специфика Windows. Надо какие-нибудь доп.параметры указывать для кириллических шрифтов.

  • YesThisIsDog

    Спасибо за отличную статью! Столкнулся с проблемой (Debian). Вылетает такая ошибка:

    Error in system("./mystem -n -e utf-8 ", intern = T, input = str) :
    'input' must be a character vector or 'NULL'

    Попробовал перенести строку

    str <- paste(doc, collapse=" ")

    повыше (до system), но теперь такое :

    Error in x$meta[[tag]] : subscript out of bounds
    Calls: wordcloud ... setNames -> lapply -> FUN -> meta.PlainTextDocument
    Execution halted

    Код такой:

    #!/usr/bin/env Rscript

    library("tm")
    library("wordcloud")
    library("RColorBrewer")

    mystem <- function(doc) {
    library("stringr")
    sdoc <- paste(doc, collapse=" ")
    sdoc <- system('./mystem -n -e utf-8 ', intern=T, input=sdoc)
    sdoc <- str_replace(sdoc, '\\|.*$', '')
    sdoc <- str_replace(sdoc, '\\?', '')

    attributes(sdoc) <- attributes(doc)
    sdoc
    }

    docs <- Corpus(DirSource("./ar"),
    readerControl = list(reader = readPlain,
    language="ru",
    load=T))

    docs <- tm_map(docs, content_transformer(tolower), lazy=TRUE)
    docs <- tm_map(docs, stripWhitespace, lazy=TRUE)
    docs <- tm_map(docs, removeNumbers, lazy=TRUE)
    docs <- tm_map(docs, removePunctuation, lazy=TRUE)
    docs <- tm_map(docs, mystem, lazy=TRUE)
    docs <- tm_map(docs, removeWords, stopwords("russian"), lazy=TRUE)
    docs <- tm_map(docs, removeWords, c("это", "который", "также", "быть"), lazy=TRUE)

    png("wordcloud.png", width=800, height=600)
    set.seed(1234)
    wordcloud(docs, random.order=F, max.words=200, colors=brewer.pal(7, "Oranges"))

  • Евгений

    При вызове функции
    Articles <- Corpus(DirSource(cname),
    readerControl = list(reader = readDOC,
    language = "ru",
    load = T))

    Возникает ошибка
    Error in system2("antiword", c(AntiwordOptions, shQuote(normalizePath(uri))), :
    '"antiword"' not found

    с чем это может быть свзяано?

    • Александр Матрунич

      ‘”antiword”‘ not found

      Программа antiword не установлена или до неё не указан путь.

      • Евгений

        Александр, не совсем понимаю, что это за программа и где её взять.
        У меня Windows и для него есть вот такой архив: http://www-stud.rbi.informatik.uni-frankfurt.de/~markus/antiword/
        Но его распаковка не даёт мне понимая, что делать дальше. Чувствую себя, чайником. Но правда не понимаю, как её установить и как считывать Word DOC документы в R

        • Александр Матрунич

          Евгений!

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

          Когда вы даёте команду system2(“antiword”, …), R передаёт в операционную систему запрос выполнить команду antiword и передать этой команде последующие параметры. Винда этой программы не находит и возвращает ошибку. Пропишите полный путь к антиворду:

          system2(
            command = file.path("c:",
                                "путь",
                                "к", 
                                "папке", 
                                "antiword"),
            args = c(AntiwordOptions, shQuote(normalizePath(uri))))
          • Евгений

            Спасибо!
            Но не сработало 🙂
            Error in paste(c(shQuote(command), env, args), collapse = ” “) :
            object ‘AntiwordOptions’ not found

            Как я понимаю в скаченной мной папке нету данных файлов.

            Задача обработать сотню файлов. Переводить вручную – долго и бессмысленно.
            Пытаюсь понять как через R переводить их в текстовый формат.
            Из английских источников понял, что есть два путь 1) Antiword 2) docx2txt
            Но с обоими пока не удаётся разобраться

  • Александр Матрунич

    Евгений, вы неправильно поняли 🙂

    object ‘AntiwordOptions’ not found

    Вы ж запускаете команду system2() и в одном из аргументов даёте инструкцию использовать объект AntiwordOptions, который у вас, видимо, не создан.

    Так что сначала подтяните матчасть по R, а затем уже за antiword беритесь. Так быстрее разберётесь.

    Кстати, конвертировать ворд в текст из командной строки и LibreOffice умеет.

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>