Требуется функция tokens_lookup()
, после определения словаря, который определяет канонические ярлыки сторон в качестве ключей и перечисляет все вариации ngram названий сторон в качестве значений.Установив exclusive = FALSE
, он сохранит токены, которые не совпадают, по сути выступая в качестве замены всех вариантов каноническими названиями партий.
В приведенном ниже примере я немного изменил ваш исходный текст, чтобы проиллюстрировать, как названия партий будут комбинироваться, чтобы отличаться от фраз, использующих «либеральную», но не «либеральную партию».
library("quanteda")
text<-c('a text about some political parties called the new democratic party
which is conservative the new democrats and the liberal party and the
liberals which are liberal helping poor people')
toks <- tokens(text)
partydict <- dictionary(list(
olp = c("liberal party", "the liberals"),
ndp = c("new democrats", "new democratic party")
))
(toks2 <- tokens_lookup(toks, partydict, exclusive = FALSE))
## tokens from 1 document.
## text1 :
## [1] "a" "text" "about" "some" "political" "parties"
## [7] "called" "the" "NDP" "which" "is" "conservative"
## [13] "the" "NDP" "and" "the" "OLP" "and"
## [19] "OLP" "which" "are" "liberal" "helping" "poor"
## [25] "people"
Так что заменил дисперсию названия партии ключами партии.Построение dfm из этих новых токенов теперь происходит на этих новых токенах, сохраняя использование (например) «либерала», которое может быть связано с настроениями, но уже объединив «либеральную партию» и заменив ее «OLP».Применение словаря к dfm теперь будет работать для вашего примера «либерала» в «либеральной помощи», не путая его с использованием слова «либерал» в названии партии.
sentdict <- dictionary(list(
left = c("liberal", "left"),
right = c("conservative", "")
))
dfm(toks2) %>%
dfm_lookup(dictionary = sentdict, exclusive = FALSE)
## Document-feature matrix of: 1 document, 19 features (0% sparse).
## 1 x 19 sparse Matrix of class "dfm"
## features
## docs olp ndp a text about some political parties called the which is RIGHT and LEFT are helping
## text1 2 2 1 1 1 1 1 1 1 3 2 1 1 2 1 1 1
## features
## docs poor people
## text1 1 1
Два дополнительных замечания:
Если вы не хотите, чтобы ключи были прописными в замене токенов замены, установите capkeys = FALSE
.
Вы можете установить различные типы соответствия, используяvaluetype
аргумент, включая valuetype = regex
.(И обратите внимание, что ваше регулярное выражение в примере, вероятно, сформировано неправильно, поскольку область действия вашего оператора |
в примере ndp получит «новых демократов» ИЛИ «новых», а затем «демократических партий». Но с tokens_lookup()
вам не нужно беспокоиться об этом!)