Ich habe einen großen Textkörper, wo ich Wörter mit ihren entsprechenden Synonyme effizient ersetzen möchte (zum Beispiel ersetzen alle Vorkommen von "Automobil" mit dem Synonym "Auto"). Aber ich habe Mühe, einen geeigneten (effizienten) Weg zu finden, dies zu tun.Ersetzen Sie Wörter in text2vec effizient
Für die spätere Analyse verwende ich die text2vec
Bibliothek und möchte diese Bibliothek auch für diese Aufgabe verwenden (unter Vermeidung von tm
Abhängigkeiten zu reduzieren).
An (ineffizient) Art und Weise würde wie folgt aussehen:
# setup data
text <- c("my automobile is quite nice", "I like my car")
syns <- list(
list(term = "happy_emotion", syns = c("nice", "like")),
list(term = "car", syns = c("automobile"))
)
My Brute-Force-Lösung ist, so etwas zu haben und eine Schleife verwenden, um die Worte zu suchen und sie
library(stringr)
# works but is probably not the best...
text_res <- text
for (syn in syns) {
regex <- paste(syn$syns, collapse = "|")
text_res <- str_replace_all(text_res, pattern = regex, replacement = syn$term)
}
# which gives me what I want
text_res
# [1] "my car is quite happy_emotion" "I happy_emotion my car"
ersetzen
Ich habe es mit tm
mit diesem Ansatz by MrFlick (mit tm::content_transformer
und tm::tm_map
) gemacht, aber ich möchte die Abhängigkeiten des Projekts durch Ersetzen von tm
durch die schnellere reduzieren text2vec
.
Ich denke, die optimale Lösung wäre, irgendwie zu verwenden text2vec
s itoken
, aber ich bin mir nicht sicher, wie. Irgendwelche Ideen?
Das sieht nach einem sehr interessanten Konzept aus! Ich habe ein paar schnelle Benchmarks auf ihnen gemacht. Während bei kleinen Synonym-Samples die For-Schleife schneller ist, ist der 'Fastmatch'-Ansatz auf größeren Listen viel schneller! Da ich noch am Projekt arbeite, sind deine 2 Cent hier sehr wertvoll! – David
Beachten Sie auch, dass 'text2vec :: word_tokenizer' ziemlich langsam ist im Vergleich zu 'stringr :: str_split (TEXT_HERE, pattern = stringr :: boundary (" word "))'. Der einzige Grund, warum ich nicht 'striplr' /' stringi'/'tokenizers' verwende, ist, dass ich die Anzahl der' text2vec' Abhängigkeiten so klein wie möglich halten möchte. –