Если вы можете сначала токенизировать тексты, тогда векторизация будет намного быстрее.Это также быстрее, если а) вы можете использовать многопоточное решение и б) вы используете фиксированное вместо сопоставления регулярных выражений.
Вот как это сделать в пакете quanteda .Последняя строка вставляет токены обратно в один «документ» как символьный вектор, если это то, что вам нужно.
library("quanteda")
## Package version: 1.4.3
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
##
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
##
## View
quanteda_options(threads = 4)
txt <- c(
"this is a random sentence containing bca sk",
"another sentence with bc a but also with zqx tt",
"this sentence contains none of the patterns",
"this sentence contains only bc a"
)
patterns <- c("abc sk", "bc a", "zqx tt")
replacements <- c(
"@a-specfic-tag-@abc sk",
"@a-specfic-tag-@bc a",
"@a-specfic-tag-@zqx tt"
)
Это токенизирует тексты и затем использует быструю замену типов хеширования, используяфиксированное сопоставление с образцом (но вы могли бы использовать valuetype = "regex"
для сопоставления с регулярным выражением).Оборачивая patterns
внутри функции phrases()
, вы указываете tokens_replace()
искать последовательности токенов, а не отдельные совпадения, поэтому это решает проблему, состоящую из нескольких слов.
toks <- tokens(txt) %>%
tokens_replace(phrase(patterns), replacements, valuetype = "fixed")
toks
## tokens from 4 documents.
## text1 :
## [1] "this" "is" "a" "random" "sentence"
## [6] "containing" "bca" "sk"
##
## text2 :
## [1] "another" "sentence"
## [3] "with" "@a-specfic-tag-@bc a"
## [5] "but" "also"
## [7] "with" "@a-specfic-tag-@zqx tt"
##
## text3 :
## [1] "this" "sentence" "contains" "none" "of" "the"
## [7] "patterns"
##
## text4 :
## [1] "this" "sentence" "contains"
## [4] "only" "@a-specfic-tag-@bc a"
Наконец, если вы действительнохотите вернуть это обратно в формат символов, затем преобразовать в список типов символов и затем вставить их вместе.
sapply(as.list(toks), paste, collapse = " ")
## text1
## "this is a random sentence containing bca sk"
## text2
## "another sentence with @a-specfic-tag-@bc a but also with @a-specfic-tag-@zqx tt"
## text3
## "this sentence contains none of the patterns"
## text4
## "this sentence contains only @a-specfic-tag-@bc a"
Вам придется проверить это на большом корпусе, но строки 700k не звучаткак слишком большая задача.Пожалуйста, попробуйте это и сообщите, как это было!