Сегментная документация Quanteda Corpus - PullRequest
0 голосов
/ 24 февраля 2020

В настоящее время я работаю с пакетом quanteda, и я хотел бы сегментировать мой корпус в соответствии с шаблоном, состоящим по крайней мере из двух символов регулярного выражения в строке. Однако я не уверен, как на самом деле работает функция corpus_segment (). Я построил следующий небольшой пример, чтобы проиллюстрировать мои вопросы:

test <- "start  middle  end" 
test <- corpus(test)
test
Corpus consisting of 1 document and 0 docvars.
texts(test)
               text1 
"start  middle  end"

Теперь я хотел бы сегментировать документ в соответствии с шаблоном по крайней мере из двух символов регулярного выражения:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex"))
 text1.1  text1.2 
"middle"    "end"

Теперь слово перед первым совпадением с образцом было удалено. Посмотрев документацию, я увидел, что по умолчанию remove_pattern равен TRUE. Тем не менее, я не понимаю, почему он также удаляет слово перед первым сопоставлением с образцом. Моим первоначальным предположением было то, что это как-то связано с аргументом pattern_position, и действительно, если я установлю его на «after», произойдет следующее:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex", pattern_position="after"))
text1.1  text1.2 
"start" "middle"

Таким образом, слово после последнего паттерна будет вырезано. Я выяснил, что установка параметра remove_pattern в значение «FALSE» сохраняет все три слова и выполняет то, что я намеревался сделать:

texts(corpus_segment(test, pattern="\\s{2,}", valuetype = "regex",  extract_pattern=FALSE))
 text1.1  text1.2  text1.3 
 "start" "middle"    "end" 

Документация функции гласит следующее:

"extract_pattern: извлекает сопоставленные шаблоны из текстов и сохраняет в документах, если ИСТИНА "

" pattern_position: либо "до", либо "после", в зависимости от того, предшествует ли шаблон тексту (как с предоставленным пользователем тегом, таким как ## INTRO в приведенных ниже примерах) или следует за текстом (как с разделителями знаков препинания) "

, и я не вижу, как в этой документации объясняется, почему" начало "или" конец "вырезаны в зависимости от параметра pattern_position .

1 Ответ

1 голос
/ 25 февраля 2020

Это хороший вопрос, и я подаю вопрос , чтобы посмотреть, намело ли это поведение, на которое мы рассчитывали.

Обратите внимание, что char_segment() работает таким же образом.

library("quanteda")
## Package version: 2.0.0

txt <- "start middle end"
corp <- corpus(txt)

corpus_segment(corp, " ", extract_pattern = FALSE)
## Corpus consisting of 3 documents.
## text1.1 :
## "start"
## 
## text1.2 :
## "middle"
## 
## text1.3 :
## "end"
corpus_segment(corp, " ", extract_pattern = TRUE)
## Corpus consisting of 2 documents and 1 docvar.
## text1.1 :
## "middle"
## 
## text1.2 :
## "end"

char_segment(txt, " ", remove_pattern = FALSE)
## [1] "start"  "middle" "end"
char_segment(txt, " ", remove_pattern = TRUE)
## [1] "middle" "end"

Есть, конечно, другие способы сделать это до создания объекта quanteda corpus из вектора вашего персонажа, такие как следующие. (Оберните их в unlist(), если хотите вернуть вектор.)

test <- "start  middle  end"

stringi::stri_split_regex(test, "\\p{Zs}{2}")
## [[1]]
## [1] "start"  "middle" "end"

base::strsplit(test, "\\s{2}")
## [[1]]
## [1] "start"  "middle" "end"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...