Как правильно применять стоп-слова на французском языке, используя R - PullRequest
3 голосов
/ 21 сентября 2019

Я пытаюсь вытащить книгу с помощью библиотеки Гутенберга, а затем удалить французские стоп-слова.Я смог сделать это точно на английском языке, выполнив следующее:

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 лучших слов (по частоте) в английской версии Oliver Twist это:

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 ]

0 голосов
/ 23 сентября 2019

Оказывается, моей главной проблемой были не стоп-слова.Это было то, что акцентированные символы проходили как коды, а не как акценты.Я применил это:

twistFR$text <- iconv(twistFR$text, "latin1", "UTF-8")

И ситуация в значительной степени разрешилась сама собой.Я также применил большой список стоп-слов.Спасибо за ваши комментарии!

0 голосов
/ 21 сентября 2019

Я использовал несколько разных пакетов, чтобы получить то, что вы хотите.Я использовал стоп-слова из 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
...