За какво и кого говори българският Reddit? (мини проект)

Българският Reddit (r/bulgaria) е относително малко кътче в Интернет пространството, но пък в него често се дискутират актуални събития за страната и би било интересно да се проследят трендовете за различните теми, хора и събития, които се обсъждат.

Ивайло Сакелариев true
2022-06-20

Заради проект, свързан с анализа на големи текстови корпуси на български език, исках да премина през целия процес по създаването на приложение, подобно на Google Books Ngram Viewer – страхотен инструмент за проследяването на еволюцията и трендовете в използването на всички думи за няколко различни езика – английски, немски, френски, китайски, руски, италиански. Приложението позволява визуализирането и сравняването на различни думи (т.нар. N-грами) през годините, като освен единични думи позволява и сравняването на отделни фрази или имена на личности, като например „Чарлз Дарвин” с „Грегор Мендел”.

Това е изключително полезно за лингвистични или езикови изследвания. За жалост няма български корпус.

Избор на данни

За да създам нещо подобно на приложението на Google ми трябваше текстови корпус. В българското онлайн пространство има няколко интересни източника, които можех да се ползват за създаването на този корпус, като например – форума BG-Mamma, коментарите на български в Twitter, коментарите под статиите в dnevnik.bg или dir.bg и други.Tъй като това беше просто тест, приоритет за мен беше възможно най-лесно да мога да сваля данните и да ги преобразувам в състояние подходящо за моделиране. Можеше да напиша scraper за някой от изброените по-горе уебсайтове, но реших вместо това да спестя време и избрах да работя с коментари от Reddit.

Българският Reddit (r/bulgaria) е относително малко кътче в Интернет пространството, но пък в него често се дискутират актуални събития за страната и би било интересно да се проследят трендовете за различните теми, хора и събития, които се обсъждат.

Свалянето на всички коментари и постове от създаването на subreddit-a (2008 година) до края на май месец 2022 година беше изключително лесно, благодарение на този скрипт и отне общо около 8 часа. Събрах приблизително 735 000 коментара, от които около 20 000 бяха изтрити (в данните коментарът се вижда като deleted). За модела и приложението реших да селектирам само коментари направени след януари 2016 година, защото тогава започват да се натрупват достатъчно данни за смислен модел, без прекалено много колебания.

Изчистване на данни и N-gram модел

Подготовката на данните отне най-много време, тъй като не бях работил с данни от Reddit и не знаех какво точно да очаквам. PRAW, на който е базиран скрипта за сваляне на данните, дава коментарите в Markdown формат, затова преди всичко друго трябваше да преобразувам текста на всички коментари от Markdown към plain text.

След това премахнах всичко излишно :

Накрая идваше ред на подготовката за n-gram модела, която представлява премахване на всички stopwords и токенизиране. Оказа се, че за българския език няма свободно достъпен лист от stopwords, затова комбинирах stopwords листа на Spacy, заедно с мой лист. По принцип практиката на използването на фиксирани списъци със stopwords не е най-оптималната и има по-добри алтернативи като например тази методология базирана на теория на информацията.

За съжаление нямах време да пробвам нещо различно за този проект, който е просто тестови и разчитах на фиксирани списъци, избрани на базата на вградения списък за български на Scrapy (който съвсем не е изчерпателен) и моя селекция.

Накрая просто преброих използването на всяка фраза от една или две думи за всяка една дата от корпуса с помощта на Pandas.

Линк към Jupyter notebook с кода за изчистване и подготовка на данните.

Създаване на приложението

За създаване на уеб приложението избрах да работя с Plotly Dash и Python, защото добре познавам технологиите, deploy-ването е доста по-лесно в сравнение с R Shiny и освен това исках да видя дали ще мога да направя нещо, което да се доближава до Google Ngram Viewer визуално. Оказа се, че Dash се справя с всички задачи, които имах при визуализирането на линейната графика, с едно-две съвсем малки изключения.

Например при посочване с мишката върху дадена точка от графиката, отделните фрази вместо да се подреждат по стойността за дадения месец, стоят винаги фиксирани в реда, по който са зададени цветовете.

Като изключим дребните проблеми, изглежда, че Dash може да бъде използван и с много по-голям набор от данни, без да има големи загуби в скоростта. В момента използвам доста наивен и най-вече мързелив вариант, в който данните просто се четат от csv файлове в локалното пространство на приложението в AWS. Също така тествах и варианти с MongoDB и PostgreSQL, които работеха безпроблемно, но хостването при тях включваше допълнителни конфигурации и разходи в AWS, които винаги предпочитам да избегна.

Кодът е напълно отворен и може да бъде разгледан тук. (CC BY-SA 4.0 лиценз)

Резултати

Резултатите не бяха кой знае колко интересни и данните не са много постоянни, но пък определено се вижда как в българското Reddit пространство често се обсъждат събития, които са актуални и ключови за българското общество. Ето няколко примера :

Инфлация и кредит

От декември 2021 до май 2022 инфлацията става все по-популярна в коментарите.

Възраждане все по-популярни в Reddit

С крайните си, често скандални позиции и действия, „ПП Възраждане” определено се превърнаха в сензация за последните 5 месеца и се вижда, че в Reddit стават по-често споменавани от другите партии. Можем да отдадем това най-вече на политическите нагласи на членовете на r/bulgaria, които почти сигурно не са поддръжници на партията и често критикуват последните изяви на „Възраждане” и членовете ѝ.

Би било интересно да се анализират настроенията и нагласите на коментарите, свързани с „Възраждане”, но това би означавало да създадем NLP модел за sentiment analysis – отново извън мащабите на този проект с цел тест. Вместо това можем да опитаме просто да придобием бегла представа, използвайки малки трикове, като например да сравним честотата на „Копейкин”, „Костя” и „Костадин Костадинов”. Чисто практически, дори без да гледаме конкретните коментари, можем да заключим, че всеки коментар, в който се споменава фразата „Копейкин” или „Костя”, ще бъде негативен – никой от неговите последователи не използва тези прякори, те се използват от хора, които не му симпатизират (меко казано 😀 ). От своя страна фразата „Костадин Костадинов” вероятно е използвана в коментари с позитивни, неутрални или негативни нагласи. Типичният потребител на Reddit вероятно е мъж на средна възраст с прогресивни възгледи, образован и проевропейски настроен, така че тези резултати са напълно очаквани (ако приемем подобни „трикове” за валиден метод). Естествено мога и да греша за това, но считам, че е логично предположение.

Войната в Украйна

Следващите два резултата са тясно свързани с войната между Украйна и Русия, както и с все по-честите дискусии за бъдещето на ЕС.

Какво може да се подобри