Как стать автором
Обновить

Облака слов из ВК на колене

Время на прочтение 2 мин
Количество просмотров 2.9K
Недавно мне резко захотелось узнать, как часто слово «кофе» встречается в паблике моей знакомой, а так же построить красивое облако слов, опираясь на частоту их появления в постах.
Если вас заинтересовало, как это сделать буквально на колене, используя C#, то прошу под кат.

Примечание
Т.к. данное приложение писалось на коленочке и единственной задачей было потешить мое любопытство, то было решено разделить его на 2 этапа: получить слова и сохранить в файл, вычистить из него все предлоги ручками, а после по полученному файлу построить облако.
Для какой-то более серьезной задачи стоит использовать словари предлогов, окончаний или какие-либо еще альтернативные варианты.

Получение данных из вк


Для начала устанавливаем соответствующую библиотеку. Создаем приложение VK.

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

Авторизуемся, хотя этот этап можно пропустить, но тогда количество доступных «стен» в вк резко уменьшится.

 vkApi.Authorize(new ApiAuthParams
                { AccessToken = "ваш токен",Settings = Settings.All});

или:

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

Получаем 100 последних постов на выбранной стене.

var posts=vkApi.Wall.Get(new WallGetParams
            {
                OwnerId = (long)IdНужнойСтены,// для сообществ id должно начинаться с -
                Count = 100
            });

Из имеющейся коллекции составим одну большую строку.

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

Дальше, можно очистить выбранную строку от знаков препинания.

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

Ну и извлечем коллекцию слов.

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

На предпоследнем этапе составим словарь с частотностью слов.

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);
            }
        }

В конце отсортируем его и при желании сохраним в файл.

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

Переходим к созданию облака слов


Для этого нужно обязательно добавить в проект зависимость System.Drawing и вот этот пакет.

Добавляем зависимость в наше приложение.

using WordCloudGen = WordCloud.WordCloud;

И формируем изображение.

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

В заключение хочется сказать спасибо пользователю worldbeater и напомнить, что у библиотеки для вк есть замечательная поддержка в тг. Кстати, слово «кофе» за 100 постов встретилось 142 раза.
Теги:
Хабы:
+4
Комментарии 3
Комментарии Комментарии 3

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн