Step-By-Step
1. Gathering the data
tool: kitsunekko.net
We hadden eerst een keuze te maken; gaan we voor de originele Japanse ondertiteling of Engelse ondertiteling? Daarna merkten we op dat niet elke ondertiteling per anime zo makkelijk te vinden is. Zo vonden we eerst engelstalige ondertitelingsbestanden of (fan)transcripts op wiki-paginas. Vervolgens kwamen we kitsunekko.net tegen en het was alsof we een goudmijn hadden gevonden. Deze website had een breed aanbod aan anime met de Japanse ondertiteling geupload in de gepaste bestanden en voor alle afleveringen. Hetalia was in een ASS(Advanced SubStation Alpha)-bestand, Rose of Versailles en Princess Principal in SRT (SubRip Subtitle) formaat. ASS formaat is een gevorderde type ondertiteling die veel voorkomt bij anime en die uitgebreidere en complexe tekstopmaak toelaat. SRT formaat is de meest ondersteunde ondertiteling formaat en bekend om haar simpele tekst, die toelaat dat het makkelijk te bewerken is en dus meer compatibel is met videobewerkingssoftware. Dit was slechts een verschil dat voor de volgende stap belangrijk was.
2. Tekst voorbereiden: gesproken tekst extraheren, metadata verwijderen, exporteren
tools: Open Refine; ChatGPT; (Excel)
De bestanden bevatten meer dan enkel de gesproken tekst. Ze bevatten onder andere de timing, tekststijl etc. Wij willen puur de gesproken tekst voor analyse. Dat wilt ook zeggen dat CC zoals bijvoorbeeld: “(zucht)”, ook niet relevant was voor ons onderzoek. De stappen waren als volgt:
- Importeer alle afleveringen tegelijk in OpenRefine.
- Filter de (ir)relevante regels
- Sommige rijen bevatten geen gesproken text. Door text filter te gebruiken filterde ik de onnodige rijen weg en behield ik de relevante regels met gesproken text.
- Nieuwe kolom “spoken text”
- De regels met gesproken tekst bevatten heleboel informatie voordat de effectieve gesproken tekst komt. Daardoor maakte ik een nieuwe kolom met de naam “spoken text” om die apart eruit te halen doormiddel van een GREL-functie. Hiervoor gebruikten we ChatGPT. De GREL-functie verschilt naargelang de opmaak van het ondertitelingsformaat omdat die verschilt.
-
Nieuwe kolom “spoken text extracted”
- In de ruwe gesproken text die we net hebben geextraheerd zijn er nog leestekens, spaties en dergelijke die we wegwillen voor dat we de text tokeniseren. We maakten een derde kolom gebaseerd op de vorige kolom (“spoken text”). Uit gemak vroegen we aan ChatGPT om ons de juiste regex te geven omdat die al bewust zou moeten zijn van welk formaat we gebruikten en dat we in het Japans werkten, want de taal speelt ook een grote rol. Zo is er een verschil tussen het wegfilteren van een vraagteken van een Engels toetsenbord en Japans toetsenbord. Zulke situaties maken het gebruik van AI praktischer omdat het rekening kan houden met een specifieke situaties en voorwaardes. Desondanks kregen we steeds parsing errors doordat we incorrecte regex kregen, of werkte het maar was niet alles weg (bijvoorbeeld de “Japanse” spaties). De regex dat uiteindelijk werkte was value.replace() en elk leesteken apart te behandelen in plaats van alles in 1 string weg te filteren. !
- Zoals vermeld moesten ook de spaties weg. Nog voor dat we dat hadden gedaan, hebben we opgemerkt dat de tokeniser dit meeziet als een token, waardoor het later werd gezien als het meest frequente “woord’ in onze frequentielijst (zie bar chart stap 4). Dit losten we op dezelfde manier op: we voegden een .replace(“ ”, ””) toe en gaven de spatie in via het Japanse toetsenbord.
- Op de vijfde laatste regel zie je dat we per ongeluk de Japanse klinkerverleging mee hebben weggefilterd toen we alle afleveringen tegelijk opkuisten. Na het tokeniseren zagen we woorden die niet leken te kloppen. Zo werd ベラルーシ(Belarus), ベラルシ en werd ニューヨーク(New York), ニュヨク. Dit zorgde ook voor een inaccurate frequentielijst, want リア(Ria, koosnaampje voor Italië) stond boven ドイツ(Duitsland) bij de meest frequerende woorden, maar na het verbeteren, zagen we dat ドイツ de eerste plaats naam.
-

-
Exporteren als CSV-bestand
- Nadat we de derde kolom hebben met de pure gesproken tekst, kunnen we het bestand exporteren als CSV(comma separated value)-bestand. Die hebben we nodig om het hierna in Python te gebruiken. De CSV-bestanden kan je openen via Excel.
- Vrijblijvend: openen in UTF-8 (Japans)
- Als je de Excel-bestand opent, zie je heel wat tekens, en geen Japans. Je kan bij het opslagen van dit bestand het bestandstype veranderen van Excel-bestand (.xlsx) naar All Files (.) of text-file (.csv). Als er een Text Wizard schermpje verschijnt, kan je de encodering daar veranderen naar UTF-8. UTF-8 encodering ondersteunt Japans. Ook dit proces liep niet meteen vlot, dus maakten we gebruik van ChatGPT wanneer de vorige stappen niet werkten ondanks correct uitgevoerd. Ondanks dat we verschillende opties aangeboden kregen en probeerden lukte het niet meteen, dus was het eerder een kwestie van opnieuw proberen en zelf ontdekken waar het aan zou kunnen liggen. Dat laatste zorgt er ook voor dat we gepastere prompts kunnen ingeven maar ook zelf inzichten verwerven.
We gebruikten ChatGPT hiervoor om ons meteen de juiste functie te geven. Het gebruik van ChatGPT bespaart ons zoekwerk of tijd maar het komt ook met wat errors. Zo kregen we niet direct de GREL-functie die voor ons werkte. Maar omgekeerd konden we de parsing errors weer ingeven in ChatGPT die dan meestal wist waarom. We probeerden het wel eerst zelf op te lossen voor we meteen terugvielen bij ChatGPT. Het is constante trial-and-error en zien wat werkt en wat niet. Het blijft natuurlijk een uniek project dus soms weet de chatbot niet wat er buiten de chat zich afspeelt, maar foutieve antwoorden zijn ook niet ongewoon Het is daarom belangrijk om AI verantwoordelijk en aandachtig te gebruiken zodat je ook mee bent met het proces.
3. Tokeniseren van Japanse tekst
tools: Visual Studio Code (VSC); Python: fugashi (een wrapper voor MeCab in Python te gebruiken), Pandas (Python library om CSV-bestanden te lezen), UniDic (Japans woordenboek); ChatGPT; (Excel)
We besloten fugashi te gebruiken, dat een Python-wrapper is voor MeCab. Om Python te gebruiken, hadden we een platform nodig en wij kozen voor Visual Studio Code te gebruiken door haar toegankelijke interface en opties voor extensions.
MeCab is een krachtige Japanse morfologische analyzer geschreven in C++. Het laat je toe om Japanse tekst te splitsen in woorden (tokeniseren), woordsoorten te herkennen en meer. Het is echter redelijk technisch en niet al te praktisch om in Python te gebruiken, zeker voor onervarenen. Door het gebruik van een Python-wrapper, in dit geval fugashi, kunnen we wel gebruik maken van MeCab maar met Python-code. Zoals het woord al hint, is het als een Python-jasje voor MeCab. Door de keuze om Python te gebruiken, hebben we ook gebruik kunnen maken van andere libraries zoals Pandas die toelaat onze vorige bestanden te lezen en die dan te gebruiken. Het tokenisatie-proces ging als volgt:
- Programma’s en libraries downloaden (ook nodig voor stap 4)
- Wij hadden Visual Studio Code (VSC) al maar moesten nog die nieuwste versie van Python downloaden. Belangrijk wanneer je Python download is om bij het installeren “add to PATH” te selecteren, zodat je het van elke terminal kan gebruiken!
- We opende de terminal in VSC (zoals Command Prompt) en downloadde de nodige libraries door het volgende in te geven: "pip install pandas fugashi unidic matplotlib wordcloud”. Dit werkte niet meteen dus gaf ik het in de Command Prompt in. Vervolgens downloadde ik het volledige woordenboek UniDic: “python -m unidic download”.
- Script schrijven en exporteren
- We maken een nieuw bestand en slagen het op als Python-bestand (.py)
- We laden het CSV-bestand van de vorige stap op en maken duidelijk uit welke kolom we de tekst halen (“spoken text clean”). Belangrijk is dat je de exacte naam geeft van de kolom!
- We activeren de Tagger uit fugashi voor het tokeniseren, met behulp van unidic-lite.
- We maken duidelijk welke POS (Part Of Speech) we willen: 名詞 (zelfstandig naamwoorden) en filteren de lijst. In de experimenteerfase hadden we deze stap nog niet toegevoegd en werkten testten we eerst alles uit met de volledige lijst. Eens we verschillende opties hadden verkend, gingen we verder met het filteren per grammaticale woordgroep, we besloten dat enkel zelfstandige naamwoorden het beste reflecteren wat we zochten.
- We zorgen ervoor dat de lijst woorden wordt opgeteld met Counter volgens frequentie.
- Om het te exporteren schrijven we welke naam dat we willen dat ihet nieuw bestand krijgt en voegen “.csv” eraan toe. We specifieren welke encoding we willen zodat we het niet nog eens handmatig in Excel moeten aanpassen.

Ook hier hebben we gebruik gemaakt van ChatGPT voor het geven van de code en regex. We probeerden wel alles te begrijpen en niet zomaar regels over te typen waarvan we niet wisten wat het deed. Zo hadden we opgemerkt dat bij het filteren van de POS we code kregen voor een andere UniDic woordenboek, unidic-lite. Dit hadden we door doordat het filteren niet meteen werkten en toen we om oplossingen vroegen werkten de opties niet. Dat was omdat de bot er plots vanuit ging dat we een andere woordenboek hadden. unidic-lite is de simpelere versie van het volledige UniDic woordenboek. De opties zijn beperkt en het gebruikt categorieën in het Engels. UniDic is veel rijker en laat POS-tagging met meerdere lagen toe en maakt gebruik van Japanse tags. Zo suggereerde het dat ik “名詞” vervang met “NOUN” als een van de oplossingen. Als dat werkten hadden we zeker unidic-lite. Uiteindelijk lag het bij de POS tag syntax. We schreven unidic-lite syntax waar we gebruik maakte van (word.pos), maar (word.feature.pos) werkte wel want dat is de syntax voor UniDic. Je kan nog op regel 9 zien dat we “unidic-lite” hebben geschreven en zijn vergeten te vervangen.
4. Visualisatie
tools: Visual Studio Code (VSC); Python: Pandas (Python library om CSV-bestanden te lezen), Matplotlib (Python library voor visualisatie), wordcloud (Python library voor word clouds); ChatGPT;
Verkend: Voyant; Power BI (Microsoft); Tableau Public; Observable Notebooks
We keken het meeste uit naar de visualisatie. Er werden verschillende platformen voorgesteld tijdens de les die ons erg interessant leken. Ons voorkeur ging naar Tableau vanwege de mooie opmaakkeuzes en intuitiviteit. De optie om (wereld)kaarten te gebruiken trok ons ook aan, zijnde dat Europa ons onderwerp was, maar dat lieten we voor de laatste fase.
Echter, tijdens ons eerder gemelde experimenteerfase hebben we ook al met visualisaties gespeeld. Vanaf dat we onze eerste lijst met tokens hadden ーtoen nog met enkel de eerste aflevering van Hetaliaー hebben we het in Voyant gestoken om de opties daar te verkennen. We waren bewust dat de lijst niet gefilterd was volgens wens en dat zagen we ook. We vernamen dat Voyant niet zo goed werkt met Japans, en aangezien we toen nog in de experimenteerfase zaten, lieten we het voorlopig terzijde. De interface leek wel interessant.

Vervolgens hadden we ondertussen al een lijst met alle tokens van alle afleveringen van Hetalia (dus nog niet enkel zelfstandige naamwoorden). Om snel een visualisatie daarvan te maken hebben we een bar chart in Python gemaakt.

Net zoals bij Voyant deden we dit eerder om deze optie te leren kennen dan voor analyse. Bij het runnen van de code die we is VSC schreven, kwam de visualisatie in beeld dankzij Matplotlib en was die interactief. Zo kon je inzoomen en het ook opslagen als PNG-bestand. Het Japans werd niet in beeld gebracht maar in het interactief schermpje verscheen het wel in de rechterhoek onderaan als je met je cursor over de balk ging. Vanaf dat je de bar chart opsloeg als afbeelding, was het dus niet meer interactief en resteerden de blokjes. Deze optie was nog niet uitgesloten maar we wouden eerst andere platformen proberen.
We zochten Tableau op maar het leek dat het betalend was. Daarna kwam ik bij Power BI Desktop terecht, een gratis tool van Microsoft om data te analyseren. De interface leek ons wat ingewikkeld dus dat werd ook tot het einde gehouden, wanneer we ons volledig gingen richten op visualisatie. Vervolgens herinnerde ik me Observable, maar ook hier leek het betalend of zelf niet toegankelijk. We hebben een demo aangevraagd bij Observable maar zagen dan dat er een gratis maar beperktere mogelijkheid was via Observable Notebooks. Die probeerden we ook even uit om te zien hoe toegankelijk en intuitief deze optie was, maar uiteindelijk hadden we dit ook als laatste optie gehouden.

We richtten ons terug naar Tableau. De website was redelijk onduidelijk wat betreft de gratis en openbare versie van Tableau, Tableau Public maar uiteindelijk is het ons gelukt om ook de software te downloaden. Om de interface te begrijpen was het wel nodig om eerst wat kennis op te doen en tutorials te bekijken. Wij blijven wel nieuwsgierig naar wat deze krachtige platformen te bieden hebben en houden het zeker in het!
Deze verkenningsproces speelde zich voornamelijk af tijdens de experimenteerfase. Tegellijkertijd dachten we om naast de bar chart ook een word cloud te maken via Python, een optie waar we aan dachten maar even leken te zijn vergeten. Dit lukte en gaf ons een verrassend mooi, maar vooral duidelijk resultaat. Het vereistte ook niet dat we een ander platform zouden gebruiken. Het was allemaal mogelijk vanuit ons vertrouwde VSC platform en via Python. Het was zo overtuigend dat we de vorige opties, die nog veel voorbereidingswerk vergde, achterwegen lieten. We besloten de bar chart ook achterwegen te laten voor ons eigenlijke resultaat, maar het zal altijd een interessante bijdrage zijn voor verdere visualisatie.
Ondanks dat we de tokens filterden tot enkel zelfstandig naamwoorden, hielden we een hoop woorden over. Zeker bij Rose of Versailles was dit opvallend want het had bijna 3-4 keer meer afspeeltijd dan de twee andere anime. We zijn ook geinteresseerd in de meest dominante thematiek dus er zou veel ruis zijn als we alle woorden zouden gebruiken, tenzij we het op een andere manier zouden kunnen filteren. We besloten om enkel met de woorden te werken die een minimum frequentie van 9 hadden. Bij Hetalia kwam dit uit bij ongeveer de top 100 (99 exact), bij Rose of Versailles de top 536 en bij Princess Principal de top 129 woorden. Je kan hier al de sterke aanwezigheid van Rose of Versailles opmerken.
Voor elke anime maakten we een bestand met de code voor de wordcloud. We schreven het script als volgt:
- We laden het document met enkel zelfstandige naamwoorden als tokens op doormiddel va Pandas.
- We begrenzen de lijst door enkel woorden met een minimum frequentie 9 te gebruiken.
- We zorgen ervoor dat de tokens gesorteerd staan per hoeveelheid frequentie.
- We downloaden een font en zetten die op de juiste path zodat de wordcloud de Japanse tekens juist in beeld brengt.
- Wij hebben NotoSansCJKjp-Regular gedownload en die steeds in dezelfde map gehouden waar ons Pythonbestand staat opgeslagen.
- We geven de word cloud eigenschappen. De eigenschappen die we hebben ingegeven waren suggesties vanuit ChatGPT, waar we uiteindelijk geen bezwaar tegen hadden.
- Bij colormap staat “tab20”. Dit zorgt ervoor dat het programma zelf een willekeurige combinatie kleuren geeft. Belangrijk om de word cloud op te slagen wanneer je tevreden bent! Dit hebben we zelf ondervonden toen we een leuke versie niet hadden opgeslagen, dus toen we het programma weer lieten lopen werd de PNG vervangen door de volgende willekeurige combinatie. Je kan wel de randomisatie controleren door er een regeltje code bij toe te voegen:
Op regel 30 kan je random_state toevoegen gevolgd door een willekeurig nummer naar keuze. Elk getal stelt een bepaalde opmaak voor. In plaats van telkens het programma te laten lopen om een nieuwe optie te zien, kan je ook een reeks tegelijk laten verschijnen met het (random_state=i). Hier komt nog wat aanpassingen bij kijken in de code maar het zorgt er wel voor dat de resultaten reproduceerbaar kunnen zijn.
- Bij colormap staat “tab20”. Dit zorgt ervoor dat het programma zelf een willekeurige combinatie kleuren geeft. Belangrijk om de word cloud op te slagen wanneer je tevreden bent! Dit hebben we zelf ondervonden toen we een leuke versie niet hadden opgeslagen, dus toen we het programma weer lieten lopen werd de PNG vervangen door de volgende willekeurige combinatie. Je kan wel de randomisatie controleren door er een regeltje code bij toe te voegen:
- We geven de voorwaarden voor de visualisatie in Matplotlib aan en zorgen ervoor dat het bestand word opgeslagen onder een bestandsnaam naar keuze.

Ook hier hebben wij gebruik gemaakt van ChatGPT voor het script van de visualisatie. We konden de afmetingen en dergelijke ook aanpassen maar we waren tevreden met de gegevens die we hadden. Door het verliezen van een bepaalde layout, hebben we geleerd hoe dat de “tab20” verder kan worden gemanipuleerd met random state. Voor vragen zijn we weer naar ChatGPT gegaan. Bij hetalia hadden we initieel een foutje in het script. We hadden initieel gedacht aan woorden met een minimum frequentie 3 maar besloten daarna dat minimum frequentie 9 beter is. Dit werd aangepast in de code behalve bij regel 9.

Hierdoor kregen we voor Hetalia een word cloud met 416 woorden, wat ook erg interessant was.

Dit zijn uiteindelijk de drie visualisaties voor elke anime:
Hetalia: Axis Powers

Rose of Versailles

Princess Principal

We besloten ook om de drie anime in 1 word cloud te zetten. We deden dit als volgt:
- de drie bestanden uploaden en combineren.
- de gecombineerde lijst weer filteren op woorden met een minimum frequentie 9.
- word cloud maken


We merkten dat door de sterke aanwezigheid van Rose of Versailles, de word cloud hierdoor sterk beïnvloed was. Maar dit gaf ons nieuwe ideeen over hoe we dit zouden kunnen aanpakken naar de toekomst toe voor een duidelijker beeld.
We zouden de lijsten per anime kunnen beperken tot frequentie 9, en daarna de verkorte lijsten combineren, in plaats de lijsten eerst te combineren en dan pas het te beperken tot minimum frequentie 9. Dit zou een verschil kunnen maken doordat woorden die onder het minimum van 9 bij de ene anime, de top meest gebruikte woorden bij een andere niet kunnen versterken. Ook kan je de lijsten eerst normaliseren zodat ze relatief evenwichtig zijn.
Ondanks onze nieuwsgierigheid om andere platformen uit te proberen, zijn we erg tevreden met de word clouds en het proces daarachter, zeker voor dit onderwerp! Word clouds zijn een geschikte manier om indrukken weer te geven, en dat sluit goed aan bij hoe we ons beeld op het leven vaak vormen — op basis van indrukken en gevoelens. Eurofilie is immers ook een ontastbaar concept dat juist draait om indrukken en het verlangen ergens bij te horen. Wat in een word cloud als eerste opvalt, roept direct een gevoel op, vergelijkbaar met hoe mensen het gevoel willen ervaren van "zijn in" of "thuishoren in" Europa. De gekozen anime verbeelden dat op hun eigen manier, alsook het gecombineerde beeld van de word clouds. Het model is gebaseerd op drie anime die verschillen in speelduur, verhaallijn, setting en mate van Europese invloeden. Het toont een basisidee, maar kan interessanter worden wanneer er meer titels aan worden toegevoegd. Wel is het aan te raden om in de toekomst nog meer woorden te filteren om scherpere thema's zichtbaar te maken.
Om het onderzoek verder te zetten en de thematiek verder te ontdekken, onder andere met sentiment analysis of topic modelling, dachten we aan
- de lijst tokens verder filteren volgens een lijst gedefinieerde (kern)woorden binnen het thema en in een barchart of word cloud zetten.
- woorden binnen een bepaald thema groeperen in clusters
- overeenkomende woorden en unieke woorden tussen de anime apart groeperen/oplijsten
- sentiment analysis van taalgebruik in positieve en/of negatieve context
- en nog zo veel meer!