Мне было интересно, можно ли выполнить feauture_frequency
мощной библиотеки quanteda
в R, включая также список фраз или «слов», которые необходимо учитывать, например, у меня есть следующий набор данных:
library(quanteda)
library(quanteda.textstats)
df_sample<-c("Word Record",
"be able to count by word",
"But also include some phrases such as",
"World Record Super Bass Mr. President Mr. President")
Когда я вычисляю textstat_frequency
df_sample, я получаю что-то вроде этого:
> tokens<-corpus(df_sample) %>% tokens(remove_punct = TRUE)
> dfm<-dfm(tokens)
>
> quanteda.textstats::textstat_frequency(dfm)
feature frequency rank docfreq group
1 word 2 1 2 all
2 record 2 1 2 all
3 mr 2 1 1 all
4 president 2 1 1 all
5 be 1 5 1 all
6 able 1 5 1 all
7 to 1 5 1 all
8 count 1 5 1 all
9 by 1 5 1 all
10 but 1 5 1 all
11 also 1 5 1 all
12 include 1 5 1 all
13 some 1 5 1 all
14 phrases 1 5 1 all
15 such 1 5 1 all
16 as 1 5 1 all
17 world 1 5 1 all
18 super 1 5 1 all
19 bass 1 5 1 all
>
что правильно, но я также хочу изменить свой код на другой, чтобы учитывать и печатать в выводе слова или фразы «мистер президент», «мировой рекорд», «супер бас»
key_lookups<-c("Mr. President", "World Record", "Super Bass" )
Как я могу использовать quanteda
funs, чтобы в моем выводе наряду с предыдущими подсчетами также отображалась частота предыдущих фраз, например
«Мистер Президент» 2 «Мировой рекорд» 2 «Супербас» 1
Во-первых: предупреждение о вашем примере кода: не создавайте объекты с тем же именем, что и функции (например, токены и dfm), это (в конечном итоге) приведет к ошибкам и будет сложно отлаживать.
Вероятно, есть несколько способов сделать это. Я создал «обычный» объект токенов и один объект токенов ngrams. оба превратились в dfm и из ngrams dfm, я сохранил фразы, которые вы хотели. Затем объедините dfm, и вы можете использовать textstat_frequency
как обычно.
Примечание: вы не можете комбинировать объекты токенов, как вы можете комбинировать объекты dfm.
library(quanteda)
library(quanteda.textstats)
df_sample<-c("Word Record",
"be able to count by word",
"But also include some phrases such as",
"World Record Super Bass Mr. President Mr. President")
my_tokens <- corpus(df_sample) %>% tokens(remove_punct = TRUE)
my_dfm <- dfm(my_tokens)
# No points as they are removed in the dfm
key_lookups<-c("Mr President", "World Record", "Super Bass" )
my_tokens_ngram <- tokens_ngrams(my_tokens, n = 2, concatenator = " ")
my_dfm_ngrams <- dfm(my_tokens_ngram)
# Only keep the lookups
my_dfm_ngrams <- dfm_keep(my_dfm_ngrams, key_lookups)
# Combine both dfms
my_dfms <- rbind(my_dfm, my_dfm_ngrams)
# if necessary uncomment next part
# my_dfms <- dfm_compress(my_dfms)
исход:
head(textstat_frequency(my_dfms), 5)
feature frequency rank docfreq group
1 word 2 1 2 all
2 record 2 1 2 all
3 mr 2 1 1 all
4 president 2 1 1 all
5 mr president 2 1 1 all
tail(textstat_frequency(my_dfms), 5)
feature frequency rank docfreq group
18 world 1 6 1 all
19 super 1 6 1 all
20 bass 1 6 1 all
21 world record 1 6 1 all
22 super bass 1 6 1 all
Обратите внимание, что использование rbind в dfms создает новое имя документа, например «text1.1». Если вы хотите объединить это обратно с исходными документами, вы можете сначала вызвать dfm_compress(my_dfms)
, а затем вызвать textstat_frequency
.
В библиотеке quanteda
можно было развлечься tokens_compound
library(quanteda)
library(quanteda.textstats)
df_sample<-c("World Record",
"be able to count by word",
"But also include some phrases such as",
"World Record Super Bass Mr. President Mr. President")
toks <- tokens(df_sample,remove_punct = TRUE)
Теперь давайте составим key_lookups
объект toks
.
key_lookups<-c("Mr President", "World Record", "Super Bass" )
toks_comp <- tokens_compound(toks, pattern = phrase(key_lookups))
Взгляните на вывод:
> toks_comp %>% dfm() %>% textstat_frequency()
feature frequency rank docfreq group
1 world_record 2 1 2 all
2 mr_president 2 1 1 all
3 be 1 3 1 all
4 able 1 3 1 all
5 to 1 3 1 all
6 count 1 3 1 all
7 by 1 3 1 all
8 word 1 3 1 all
9 but 1 3 1 all
10 also 1 3 1 all
11 include 1 3 1 all
12 some 1 3 1 all
13 phrases 1 3 1 all
14 such 1 3 1 all
15 as 1 3 1 all
16 super_bass 1 3 1 all
Как я уже сказал, есть несколько способов сделать что-то, и я забыл о tokens_compound
. Разница, и я думаю, что ваша лучше, заключается в том, что в моем случае я считаю и мистера, и президента, и мистера_президента. Вы не делаете, и это, вероятно, лучший результат.
Большое вам спасибо, Phiver, после прочтения некоторых руководств и некоторого кода из документации мощной библиотеки Quanteda, я чувствую, что достиг ответа, который искал, почему бы вам не дать мне отзыв о моем ответе?