Есть ли более быстрая альтернатива R quanteda :: tokens_lookup ()?
Я использую tokens () в пакете quanteda R для токенизации фрейма данных с 2000 документами. В каждом документе от 50 до 600 слов. На моем ПК это занимает пару секунд (Microsoft R Open 3.4.1, Intel MKL (с использованием 2 ядер)).
У меня есть объект словаря, сделанный из фрейма данных из почти 600 000 слов (TERMS) и соответствующей им леммы (PARENT). Есть 80 000 различных лемм.
Я использую tokens_lookup () для замены элементов в списке токенов на их леммы, найденные в словаре. Но на это уходит минимум 1,5 часа. Эта функция слишком медленная для моей проблемы. Есть ли более быстрый способ получить список токенов?
Я хочу напрямую преобразовать список токенов, чтобы сделать ngrams ПОСЛЕ использования словаря. Если бы мне были нужны только онограммы, я мог бы легко сделать это, объединив матрицу функций документа со словарем.
Как мне сделать это быстрее? Преобразовать список токенов в фрейм данных, присоединиться к словарю, преобразовать обратно в упорядоченный список токенов?
Вот пример кода:
library(quanteda)
myText <- c("the man runs home", "our men ran to work")
myDF <- data.frame(myText)
myDF$myText <- as.character(myDF$myText)
tokens <- tokens(myDF$myText, what = "word",
remove_numbers = TRUE, remove_punct = TRUE,
remove_symbols = TRUE, remove_hyphens = TRUE)
tokens
# tokens from 2 documents.
# text1 :
# [1] "the" "man" "runs" "home"
#
# text2 :
# [1] "our" "men" "ran" "to" "work"
term <- c("man", "men", "woman", "women", "run", "runs", "ran")
lemma <- c("human", "human", "human", "humen", "run", "run", "run")
dict_df <- data.frame(TERM=term, LEMMA=lemma)
dict_df
# TERM LEMMA
# 1 man human
# 2 men human
# 3 woman human
# 4 women humen
# 5 run run
# 6 runs run
# 7 ran run
dict_list <- list( "human" = c("man", "men", "woman", "women") , "run" = c("run", "runs", "ran"))
dict <- quanteda::dictionary(dict_list)
dict
# Dictionary object with 2 key entries.
# - human:
# - man, men, woman, women
# - run:
# - run, runs, ran
tokens_lemma <- tokens_lookup(tokens, dictionary=dict, exclusive = FALSE, capkeys = FALSE)
tokens_lemma
#tokens from 2 documents.
# text1 :
# [1] "the" "human" "run" "home"
#
# text2 :
# [1] "our" "human" "run" "to" "work"
tokens_ngrams <- tokens_ngrams(tokens_lemma, n = 1:2)
tokens_ngrams
#tokens from 2 documents.
# text1 :
# [1] "the" "human" "run" "home" "the_human" "human_run" "run_home"
#
# text2 :
# [1] "our" "human" "run" "to" "work" "our_human" "human_run" "run_to" "to_work"