Quanteda вычисляет частоту токенов в dfm, включая также настраиваемый список фраз

Мне было интересно, можно ли выполнить 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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых: предупреждение о вашем примере кода: не создавайте объекты с тем же именем, что и функции (например, токены и 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.

Большое вам спасибо, Phiver, после прочтения некоторых руководств и некоторого кода из документации мощной библиотеки Quanteda, я чувствую, что достиг ответа, который искал, почему бы вам не дать мне отзыв о моем ответе?

R_Student 02.01.2023 16:05

В библиотеке 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 02.01.2023 16:34

Другие вопросы по теме