Как лемматизировать корпус с определенным словарем в R? » - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь выполнить lemmatization на корпусе, используя функцию lemmatize_strings() в качестве аргумента для tm_map() из tm пакета.

Но я хочу использовать свой собственный словарь ("лексика" - первый столбец с полной словоформой в нижнем регистре, в то время как второй столбец имеет соответствующую лемму о замене).

Я пытался использовать:

corpus<-tm_map(corpus, lemmatize_strings)

Но не работал ... Когда я использую:

lemmatize_strings(corpus[[1]], dictionary = lexico)

У меня нет проблем!

Как я могу поместить свой словарь "лексика" в fuction tm_map ()?

Извините за этот вопрос, это моя первая попытка провести анализ текста в возрасте 48 лет.

Чтобы быть более понятным, мой корпус составлен из 2000 документов;выдержка из первого документа:

corpus[[1]][[1]]

[9] "..."

[10] "Nos últimos dias da passada legislatura, a maioria de direita aprovou duas leis que significam enormes recuos nos direitos das cidadãs do país. Fizeram tábua rasa do pronunciamento das cidadãs e cidadãos do país em referendo, optando por humilhar e tentar culpabilizar as mulheres que abortam por sua livre escolha. Estas duas leis são a Lei n.º 134/2015 e a Lei n.º 136/2015, de setembro. A primeira prevê o pagamento de taxas moderadoras na interrupção de gravidez quando for realizada, por opção da mulher, nas primeiras 10 semanas de gravidez. A segunda representa a primeira alteração à Lei n.º 16/2007, de 17 de abril, sobre exclusão de ilicitude nos casos de interrupção voluntária da gravidez." 

Затем работал над файлом словаря (лексика) с такой конфигурацией:

lexico[1:10,]
           termo         lema pos.tag
1             aa            a NCMP000
2           aais          aal NCMP000
3            aal          aal NCMS000
4      aaleniano    aaleniano NCMS000
5     aalenianos    aaleniano NCMP000
6     ab-rogação   ab-rogação NCFS000
7    ab-rogações   ab-rogação NCFP000
8   ab-rogamento ab-rogamento NCMS000
9  ab-rogamentos ab-rogamento NCMP000
10   ab-rogáveis   ab-rogável  AQ0CP0

Когда я использую функцию lemmatize_strings(corpus[[1]], dictionary = lexico), она работает правильнои дать документ из корпуса № 1, лемматизированный леммами из моего словаря.

Проблема, с которой я столкнулся, заключается в следующей функции:

> corpus<-tm_map(corpus, lemmatize_strings, dictionary = lexico)
Warning messages:
1: In stringi::stri_extract_all_regex(x, numreg) :
  argument is not an atomic vector; coercing
2: In stringi::stri_extract_all_regex(x, numreg) :
  argument is not an atomic vector; coercing
> corpus[[1]][[1]]
[1] ""

Это просто уничтожит все мои документы в корпусе

> corpus
<<VCorpus>>
Metadata:  corpus specific: 0, document level (indexed): 0
Content:  documents: 2000

Заранее спасибо за ответ!

1 Ответ

0 голосов
/ 23 марта 2019

Вы можете, например, использовать пакет quanteda для этого:

library("quanteda")
text <- "This is a test sentence. We can lemmatize it using quanteda."
dict <- data.frame(
  word = c("is", "using"),
  lemma = c("be", "use"),
  stringsAsFactors = FALSE
)

toks <- tokens(text, remove_punct = TRUE)
toks_lemma <- tokens_replace(toks,
                             pattern = dict$word,
                             replacement = dict$lemma,
                             case_insensitive = TRUE, 
                             valuetype = "fixed")
toks_lemma
tokens from 1 document.
text1 :
 [1] "This"      "be"        "a"         "test"      "sentence"  "We"        "can"       "lemmatize"
 [9] "it"        "use"       "quanteda" 

Функция очень быстрая и, несмотря на название, в основном была заменена на лемматизацию.

...