Найти слова в корпусе на основе леммы

Я занимаюсь анализом текста с помощью R, и у меня возникает "проблема", которую я хотел бы решить... Чтобы найти в корпусе отчеты, содержащие больше всего заданного слова или выражения, я использую kwicфункция от quantedaпакет, как это:

result <- kwic (corp2,c(phrase("trous oblongs")))

где corp2это корпус. trous oblongsна французском, и это во множественном числе. Однако, когда я сделаю это, я получу только отчеты, содержащие выражение во множественном числе. Я также хотел бы принять во внимание случаи единственного числа trou oblong(и наоборот, если я изначально введу код trou oblong, получите также множественное число).

я знаю это udpipeпакет, благодаря его udpipe_annotate Функция: https://www.rdocumentation.org/packages/udpipe/versions/0.3/topics/udpipe_annotate, способна извлечь лемму из слов в тексте.

Так что я хотел бы знать, если udpipe имеет функцию, которая могла бы найти все вхождения слов, имеющих одну и ту же лемму в корпусе, или, если возможно, сделать это с kwic,

заранее спасибо

2 ответа

Решение

Quanteda имеет tokens_wordstem() который использует стеммер SnoballC:

toks <- tokens(corp2)
toks_stem <- tokens_wordstem(toks, "french")
kwic(toks_stem, phrase("trous oblong"))

Кроме того, вы также можете использовать * подстановочный знак для поиска основ:

toks <- tokens(corp2)
kwic(toks, phrase("trou* oblong*"))

Если вы хотите вставить в структуру UDPIPE, вы можете использовать txt_nextgram с txt_recode_ngram или используйте результаты анализа зависимостей, если ваши 2 условия не совпадают, но вы все равно хотите их найти.

library(udpipe)
library(data.table)
txt <- c("Les trous sont oblongs.", 
         "Les trous oblongs du systeme de montage des deux parties permettent un reglage facile et un alignement precis.")

## Annotate with udpipe to tokenise, obtain pos tags, lemmas, dependency parsing output
udmodel <- udpipe_download_model("french-sequoia", udpipe_model_repo = "bnosac/udpipe.models.ud")
udmodel <- udpipe_load_model(udmodel$file_model)
x <- udpipe_annotate(udmodel, txt)
x <- as.data.table(x)

## Situation 1: words are following one another
x <- x[, lemma_bigram := txt_nextgram(lemma, n = 2, sep = " "), by = list(doc_id, paragraph_id, sentence_id)]
subset(x, lemma_bigram %in% c("trous oblong"))

## Situation 2: words are not following one another - use dependency parsing results
x <- merge(x, 
           x[, c("doc_id", "paragraph_id", "sentence_id", "token_id", "token", "lemma", "upos", "xpos"), with = FALSE], 
           by.x = c("doc_id", "paragraph_id", "sentence_id", "head_token_id"),
           by.y = c("doc_id", "paragraph_id", "sentence_id", "token_id"),
           all.x = TRUE, all.y = FALSE, 
           suffixes = c("", "_parent"),
           sort = FALSE)
subset(x, lemma_bigram %in% c("trous oblong") | (lemma %in% "trous" & lemma_parent %in% "oblong"))

Если вы хотите перекодировать ключевые слова в 1 термин (охватывает только ситуацию 1):

x$term <- txt_recode_ngram(x$lemma, compound = "trous oblong", ngram = 2, sep = " ")
Другие вопросы по тегам