Българският Reddit (r/bulgaria) е относително малко кътче в Интернет пространството, но пък в него често се дискутират актуални събития за страната и би било интересно да се проследят трендовете за различните теми, хора и събития, които се обсъждат.
Заради проект, свързан с анализа на големи текстови корпуси на български език, исках да премина през целия процес по създаването на приложение, подобно на 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 година, защото тогава започват да се натрупват достатъчно данни за смислен модел, без прекалено много колебания.
Подготовката на данните отне най-много време, тъй като не бях работил с данни от Reddit и не знаех какво точно да очаквам. PRAW
, на който е базиран скрипта за сваляне на данните, дава коментарите в Markdown формат, затова преди всичко друго трябваше да преобразувам текста на всички коментари от Markdown към plain text.
След това премахнах всичко излишно :
хиперлинкове от коментарите и постовете (http, https, и т.н.)
емоджита (🥸)
изтритите коментари
Накрая идваше ред на подготовката за 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 инфлацията става все по-популярна в коментарите.
С крайните си, често скандални позиции и действия, „ПП Възраждане” определено се превърнаха в сензация за последните 5 месеца и се вижда, че в Reddit стават по-често споменавани от другите партии. Можем да отдадем това най-вече на политическите нагласи на членовете на r/bulgaria, които почти сигурно не са поддръжници на партията и често критикуват последните изяви на „Възраждане” и членовете ѝ.
Би било интересно да се анализират настроенията и нагласите на коментарите, свързани с „Възраждане”, но това би означавало да създадем NLP модел за sentiment analysis – отново извън мащабите на този проект с цел тест. Вместо това можем да опитаме просто да придобием бегла представа, използвайки малки трикове, като например да сравним честотата на „Копейкин”, „Костя” и „Костадин Костадинов”. Чисто практически, дори без да гледаме конкретните коментари, можем да заключим, че всеки коментар, в който се споменава фразата „Копейкин” или „Костя”, ще бъде негативен – никой от неговите последователи не използва тези прякори, те се използват от хора, които не му симпатизират (меко казано 😀 ). От своя страна фразата „Костадин Костадинов” вероятно е използвана в коментари с позитивни, неутрални или негативни нагласи. Типичният потребител на Reddit вероятно е мъж на средна възраст с прогресивни възгледи, образован и проевропейски настроен, така че тези резултати са напълно очаквани (ако приемем подобни „трикове” за валиден метод). Естествено мога и да греша за това, но считам, че е логично предположение.
Следващите два резултата са тясно свързани с войната между Украйна и Русия, както и с все по-честите дискусии за бъдещето на ЕС.
По-добре обмислен списък със stopwords. Това би премахнало някои излишни думи и фрази.
При създаването на N-gram модела може да се използва POS (Part of Speech) tagging, което от една страна би позволило да направим точно моделиране на фразите с повече от една дума. Ето една статия, в която са обяснени предимствата на този вариант.
В момента ползвам статични данни (csv файлове), вместо да вземам данните от база данни. Причината е, че данните не са чак толкова големи, за да си заслужава да се занимавам с конфигурации на бази данни в AWS.
Опитах да филтрирам всички езици, различни от българския, като английски и македонски, но така и не намерих лесен (и безплатен) начин да направя това. Spacy Language Detector определено работи добре с английски, но не и с български или македонски, а варианти като това да ползвам API-то на DeepL се оказаха доста скъпи за проект с толкова много коментари. Голяма част от коментарите в първите години от създаването на subreddit-a са на английски и са на хора, които не живеят в България, а се интересуват от някакъв аспект на българската култура и първата ми интуиция беше да ги премахна и да оставя само българските. После се замислих, че това би било грешка, защото коментиращите в този subreddit явно използват английски думи и фрази в коментарите си, така че това би изкривило резултатите.