Как правильно применять стоп-слова на французском языке с помощью R
Я пытаюсь вытащить книгу с помощью библиотеки Гутенберга, а затем удалить французские игнорируемые слова. Я смог сделать это точно на английском, сделав следующее:
twistEN <- gutenberg_download(730)
twistEN <- twistEN[118:nrow(twistEN),]
twistEN <- twistEN %>%
unnest_tokens(word, text)
data(stop_words)
twistEN <- twistEN %>%
anti_join(stop_words)
countsEN <- twistEN %>%
count(word, sort=TRUE)
top.en <- countsEN[1:20,]
Я вижу здесь 20 самых популярных слов (по частоте) в английской версии Оливера Твиста:
word n
<chr> <int>
1 oliver 746
2 replied 464
3 bumble 364
4 sikes 344
5 time 329
6 gentleman 309
7 jew 294
8 boy 291
9 fagin 291
10 dear 277
11 door 238
12 head 226
13 girl 223
14 night 218
15 sir 210
16 lady 209
17 hand 205
18 eyes 204
19 rose 201
20 cried 182
Я пытаюсь сделать то же самое с французской версией того же романа:
twistFR <- gutenberg_download(16023)
twistFR <- twistFR[123:nrow(twistFR),]
twistFR <- twistFR %>%
unnest_tokens(word, text)
stop_french <- data.frame(word = stopwords::stopwords("fr"), stringsAsFactors = FALSE)
stop_french <- get_stopwords("fr","snowball")
as.data.frame(stop_french)
twistFR <- twistFR %>%
anti_join(stop_words, by = c('word')) %>%
anti_join(stop_french, by = c("word"))
countsFR <- twistFR %>%
count(word, sort=TRUE)
top.fr <- countsFR[1:20,]
Я изменил код для французских стоп-слов на основе информации, которую нашел в Интернете, и он удаляет некоторые стоп-слова. Но вот список, который я получаю:
word n
<chr> <int>
1 dit 1375
2 r 1311
3 tait 1069
4 re 898
5 e 860
6 qu'il 810
7 plus 780
8 a 735
9 olivier 689
10 si 673
11 bien 656
12 tout 635
13 tre 544
14 d'un 533
15 comme 519
16 c'est 494
17 pr 481
18 pondit 472
19 juif 450
20 monsieur 424
По крайней мере, половина этих слов должна попасть в список запрещенных слов, а это не так. Что-то я делаю неправильно в своем коде? Я новичок в аккуратном тексте, поэтому уверен, что есть более эффективные способы добиться этого.
2 ответа
Оказывается, моя главная проблема заключалась не в стоп-словах. Дело в том, что акцентированные символы проходили как коды, а не как акценты. Я применил это:
twistFR$text <- iconv(twistFR$text, "latin1", "UTF-8")
И ситуация в значительной степени разрешилась сама собой. Я также применил более крупный список запрещенных слов. Спасибо за оба комментария!
Я использовал несколько разных пакетов, чтобы получить то, что вы хотите. Я использовал стоп-слова из tidystopwords, поскольку они основаны на универсальных моделях зависимостей. Но вы можете использовать стоп-слова из снежного кома, стоп-слов или из пакета proustr. Вы даже можете решить использовать стоп-слова из нескольких пакетов в зависимости от ваших требований и того, что вы считаете стоп-словами. Все списки запрещенных слов немного отличаются.
Я использую пакет udpipe для разделения текста на отдельные токены. Это занимает больше времени, чемunnest_tokens
из tidytext (но я использую параметр по умолчанию, который включает теги pos и лемматизацию). Я нахожу этоunnest_tokens
не работает с неанглийскими языками.
library(gutenbergr)
library(tidystopwords)
library(udpipe)
library(dplyr)
# get twist in French
twistFR <- gutenberg_download(16023)
# Convert all lines to utf8 (needed on my system)
twistFR$text <- iconv(twistFR$text, to = "UTF-8")
# get french stopwords based on ud language model
my_french_stopswords <- generate_stoplist(lang_name = "French")
my_french_stopswords <- data.frame(word = my_french_stopswords, stringsAsFactors = FALSE)
# download udpipe model for french language
ud_model <- udpipe_download_model(language = "french")
ud_model_fr <- udpipe_load_model(ud_model)
# set parallel.cores. Udpipe annotate can take a while as it does a lot more than just tokenizing.
ud_twistFR <- udpipe_annotate(ud_model_fr, twistFR$text[123:nrow(twistFR)], parallel.cores = 3)
# transform to data.frame
ud_twistFR_df <- data.frame(ud_twistFR, stringsAsFactors = FALSE)
# put tokens in lowercase, remove stopwords and punctuations
ud_twistFR_df <- ud_twistFR_df %>%
mutate(token = tolower(token)) %>%
anti_join(my_french_stopswords, by = c("token" = "word")) %>%
filter(upos != "PUNCT") # remove punctuations.
# count tokens
ud_countsFR <- ud_twistFR_df %>%
count(token, sort=TRUE)
ud_countsFR[1:20,]
# A tibble: 20 x 2
token n
<chr> <int>
1 pas 1558
2 dit 1366
3 m. 915
4 olivier 843
5 plus 775
6 bien 652
7 répondit 469
8 juif 435
9 monsieur 412
10 bumble 367
11 enfant 355
12 sikes 341
13 jeune 336
14 air 290
15 porte 281
16 tête 279
17 encore 278
18 homme 267
19 même 261
20 demanda 257