4

我正在尝试使用古腾堡图书馆拉一本书,然后删除法语停用词。通过这样做,我已经能够用英语准确地做到这一点:

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,]

我可以在这里看到,英文版 Oliver Twist 中排名前 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

这些词中至少有一半应该被停用词列表捕获,但事实并非如此。我的代码有什么地方做错了吗?我是整理文本的新手,所以我确信有更好的方法来解决这个问题。

4

2 回答 2

0

事实证明,我的主要问题实际上不是停用词。这是重音字符作为代码而不是重音出现。我应用了这个:

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

情况几乎自行解决了。我也应用了 stopwords-iso 更大的列表。感谢您的两位评论!

于 2019-09-23T19:14:41.000 回答
0

我用了几个不同的包来得到你想要的。我使用了 tidystopwords 中的停用词,因为它们基于通用依赖模型。但是你可以使用 snowball、stopwords 或 prousr 包中的停用词。您甚至可以根据您的要求和您认为的停用词来决定使用多个软件包中的停用词。所有停用词列表都略有不同。

我使用 udpipe 包将文本拆分为单独的标记。这比unnest_tokenstidytext 花费的时间更长(但我使用默认选项,其中包括 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
于 2019-09-21T12:20:44.770 回答