Te damos la bienvenida a nuestro sitio, aquí vas a hallar la resolución que andabas buscando.
Solución:
¿Qué opinas de saltarte el StringJoin
y almacenar un bigrama como un par de cadenas?
getbigrams[text_String] := Module[words,
words =
StringSplit[
ToLowerCase[StringDelete[text, PunctuationCharacter]]];
Counts[Partition[words, 2, 1]]
]
Eso puede ahorrar alrededor del 40 % del tiempo:
data = ExampleData /@ ExampleData["Text"];
a = Table[
Merge[<|First[#] <> " " <> Last[#] -> 1|> & /@
Partition[
StringSplit[
StringReplace[ToLowerCase[data[[i]]],
PunctuationCharacter -> ""]], 2, 1], Total], i, 1,
[email protected]]; // AbsoluteTiming // First
b = getbigrams /@ data; // AbsoluteTiming // First
Values[a] == Values[b]
7.62668
4.40748
Cierto
Implementé el cálculo de Bigrams y TF-IDF de acuerdo con la sugerencia de @Henrik Schumacher (ver el código adjunto). Muchas gracias, @Henrik Schumacher.
bigramUniqe = <||>
getbigrams[text_String] := Module[words, res, temp,
words = StringSplit[StringDelete[text, PunctuationCharacter]];
temp = Partition[words, 2, 1];
Scan[(If[MissingQ[bigramUniqe[#]], AssociateTo[bigramUniqe, # -> 1],
AssociateTo[bigramUniqe, # -> (bigramUniqe[#] + 1)]]) &, temp];
res = Counts[temp]
]
bigrama=TF
bigram = Table[getbigrams[data[[i]]], i, 1, [email protected]];
bigramaUniqe=iTF
KeyValueMap[# -> Log[2, [email protected]/bigramUniqe[[Key[#]]]] &, bigramUniqe]
valoraciones y reseñas
Si posees alguna cuestión y disposición de arreglar nuestro escrito eres capaz de dejar una nota y con deseo lo estudiaremos.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)