Saltar al contenido

Cálculo de bigramas y TF-IDF

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *