подставив несколько нграмм в квантеду - PullRequest
0 голосов
/ 05 октября 2018

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

Я могу сделать это ниже сstr_replace_all и я знаю о функции token_compound() в quanteda, но, похоже, она не выполняет именно то, что мне нужно.

library(stringr)
text<-c('a text about some political parties called the new democratic party the new democrats and the liberal party and the liberals')
text1<-str_replace_all(text, '(liberal party)|liberals', 'olp')
text2<-str_replace_all(text1, '(new democrats)|new democratic party', 'ndp')

Должен ли я каким-то образом просто предварительно обработать текст, прежде чем превратить его в корпус?Или есть способ сделать это после превращения его в корпус в quanteda.

Вот некоторый расширенный пример кода, который немного лучше определяет проблему:

`text<-c('a text about some political parties called the new democratic party 
the new democrats and the liberal party and the liberals. I would like the 
word democratic to be counted in the dfm but not the words new democratic. 
The same goes for liberal helpings but not liberal party')
partydict <- dictionary(list(
olp = c("liberal party", "liberals"),
ndp = c("new democrats", "new democratic party"),
sentiment=c('liberal', 'democratic')
))

dfm(text, dictionary=partydict)`

В этом примере учитывается democratic в смысле new democratic и democratic, но ябыли бы те, которые учитываются отдельно.

1 Ответ

0 голосов
/ 05 октября 2018

Требуется функция 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

Два дополнительных замечания:

  1. Если вы не хотите, чтобы ключи были прописными в замене токенов замены, установите capkeys = FALSE.

  2. Вы можете установить различные типы соответствия, используяvaluetype аргумент, включая valuetype = regex.(И обратите внимание, что ваше регулярное выражение в примере, вероятно, сформировано неправильно, поскольку область действия вашего оператора | в примере ndp получит «новых демократов» ИЛИ «новых», а затем «демократических партий». Но с tokens_lookup() вам не нужно беспокоиться об этом!)

...