VC nube de palabras en la rodilla

Recientemente, quería descubrir con qué frecuencia la palabra "café" se encuentra en el público de mi amigo, así como construir una hermosa nube de palabras, en función de la frecuencia de su aparición en las publicaciones.
Si está interesado en cómo hacerlo literalmente de rodillas usando C #, entonces, debajo de cat.

Nota
Porque Esta aplicación fue escrita sobre mis rodillas y la única tarea era divertir mi curiosidad, se decidió dividirla en 2 etapas: obtener las palabras y guardarlas en un archivo, limpiar todas las preposiciones con bolígrafos y luego construir una nube a partir del archivo recibido.
Para alguna tarea más seria, vale la pena usar diccionarios de preposiciones, finales u otras opciones alternativas.

Obteniendo datos de VK


Primero, instale la biblioteca apropiada. Creamos la aplicación VK.

var services = new ServiceCollection(); var vkApi = new VkApi(services); 

Autorizaremos, aunque esta etapa se puede omitir, pero la cantidad de "muros" disponibles en VK disminuirá drásticamente.

  vkApi.Authorize(new ApiAuthParams { AccessToken = " ",Settings = Settings.All}); 

o:

 vkApi.Authorize(new ApiAuthParams { Login = "Login", Password = "Password", Settings = Settings.All }); 

Obtenemos las últimas 100 publicaciones en el muro seleccionado.

 var posts=vkApi.Wall.Get(new WallGetParams { OwnerId = (long)Id,//   id    - Count = 100 }); 

De la colección existente hacemos una gran línea.

 foreach (var post in posts.WallPosts) { if (!string.IsNullOrEmpty(post.Text)) data += post.Text; } 

Además, puede borrar la línea seleccionada de los signos de puntuación.

  data = Regex.Replace(data, "\\!|\\?|\\(|\\)|\"|\\#|\\,|»|«|-", string.Empty); 

Bueno, consigamos una colección de palabras.

  var words = data.Split(default(Char[]), StringSplitOptions.RemoveEmptyEntries).ToList(); 

En la penúltima etapa, componimos un diccionario con la frecuencia de las palabras.

 var wordsDictionary = new Dictionary<string, int>(); foreach (var word in words) { if (wordsDictionary.ContainsKey(word.ToLower())) wordsDictionary[word.ToLower()] += 1; else { wordsDictionary.Add(word.ToLower(),1); } } 

Al final, lo clasificamos y, si lo desea, lo guardamos en un archivo.

 wordsDictionary = wordsDictionary.OrderByDescending(x => x.Value) .ToDictionary(x => x.Key, x => x.Value); 

Pasando a crear una nube de palabras


Para hacer esto, debe agregar la dependencia System.Drawing al proyecto y este paquete .

Agregue dependencia a nuestra aplicación.

 using WordCloudGen = WordCloud.WordCloud; 

Y formamos la imagen.

  var wc = new WordCloudGen(1024, 1024); wc.Draw(wordsDictionary.Keys.ToList(), wordsDictionary.Values.ToList()) .Save("cloudwords.jpg"); Console.WriteLine("pict create"); 

En conclusión, quiero agradecer al usuario worldbeater y recordar que la biblioteca para VK tiene un gran soporte en tg . Por cierto, la palabra "café" para 100 publicaciones ocurrió 142 veces.

Source: https://habr.com/ru/post/458524/


All Articles