Проблема с доступом к количествам корпуса quanteda в версии> = 2

#r #text-mining #corpus #quanteda

#r #интеллектуальный анализ текста #corpus #quanteda

Вопрос:

У меня возникла проблема при запуске того же скрипта, который я написал ранее. Тогда, когда я применил quanteda::corpus к объекту readtext, он вернул объект класса «corpus» и «list». Но когда я запускаю тот же скрипт, он теперь возвращает объекты класса «корпус» и «характер». И это влияет на последующие коды. Что может быть причиной этого и как я могу решить эту проблему?

Вот сценарий:

 txt <- readtext("C:/Users/aerol/Desktop/txt_sample")
corpus_txt <- corpus(txt) %>%
  corpus_reshape(to = "sentences")

docvars(corpus_txt, "Treaty") <- corpus_txt$documents$`_document`
docvars(corpus_txt, "Year") <- as.integer(stri_sub(corpus_txt$documents$`_document`, -9, -6))
 

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

Тогда класс corpus txt был «corpus» «список»:

 > class(corpus_txt)
[1] "corpus" "list"  
 

Но теперь:

 > class(corpus_txt)
[1] "corpus"    "character"
> packageVersion("quanteda")
[1]2.1.2’
 

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

Заранее большое спасибо.

Ответ №1:

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

Из https://github.com/quanteda/quanteda/blob/master/NEWS.md#quanteda-20:

quanteda 2.0 вносит некоторые существенные изменения, подробно описанные здесь.

  1. Новая структура объекта corpus.

    Внутренние компоненты объекта corpus были переработаны и теперь основаны на символьном векторе с мета- и системными данными в атрибутах. Все они обновлены для работы с существующими функциями извлечения и замены. Если вы использовали их раньше, то вы даже не должны заметить изменения. Docvars теперь обрабатываются отдельно от текстов, точно так же, как docvars обрабатываются для объектов tokens.

От ?corpus :

Для quanteda >= 2.0 это специально классифицированный вектор символов. У него есть много дополнительных атрибутов, но вы не должны обращаться к этим атрибутам напрямую, особенно если вы являетесь автором другого пакета. Вместо этого используйте функции извлечения и замены, иначе ваш код не только станет уродливее, но и может сломаться, если изменится внутренняя структура объекта corpus. Использование функций доступа и замены гарантирует, что будущий код для управления объектами corpus будет продолжать работать.

Решение? Использовать docnames(corpus_txt) .

Комментарии:

1. Спасибо за ваш ответ, профессор. Но я использовал этот скрипт всего месяц назад, и он работал нормально. Теперь он внезапно начал возвращать разные объекты. Насколько мне известно, с момента начала моего проекта несколько месяцев назад я использовал ту же версию.

2. Можете ли вы включить код вместе с выводом, включая версию пакета?

3. Еще раз спасибо за быстрый ответ. Я соответствующим образом отредактировал вопрос.

4. См . Дополнение о docnames() программе .

5. Спасибо за ваше время и заботу, профессор, я это сделаю.