Hoe wij uitspraken opsplitsen op argumentniveau (en wat jij daaraan hebt)

Het is een herkenbaar verschijnsel voor advocaten: de structuur van verschillende jurisprudentie is erg divers, waardoor het soms lijkt of de rechters allemaal maar wat anders doen. Dit is natuurlijk niet het geval, er is gewoon veel vrijheid voor de structuur van uitspraken en het is lastig elke uitspraak in dezelfde structuur te publiceren. Dit kan voor advocaten onduidelijk zijn en zorgt ervoor dat je meer moet zoeken, maar het heeft ook implicaties op de mate waarin computers de tekst kunnen begrijpen. In deze blog leg ik uit hoe wij ervoor zorgen dat de slecht gestructureerde uitspraken tóch goed te analyseren zijn.
Waarom uitspraken gesegmenteerd moeten worden
Zoals algemeen bekend en beschreven in mijn vorige blog bestaat een uitspraak uit verschillende hoofdstukken en zijn niet alle hoofdstukken even belangrijk in je zoekopdracht. Dit maakt het noodzakelijk om de belangrijke van de minder belangrijke hoofdstukken te scheiden. Om uitspraken op feit- of arguments niveau met elkaar te vergelijken moeten we echter een stap verder gaan. Bovendien bevat een paragraaf regelmatig meer dan één overweging, om dit te faciliteren moeten we nog een stap verder gaan.
Deze twee stappen in het structureren van uitspraken zijn: het segmenteren van uitspraken op paragraaf niveau en het segmenteren van paragrafen in zinnen. Dit zal ervoor zorgen dat de computer herkent dat elke uitspraak bestaat uit een aantal hoofdstukken, elk hoofdstuk uit een aantal paragrafen en elke paragraaf uit een aantal zinnen. Wanneer de uitspraken goed gesegmenteerd zijn, kunnen vergelijkbare uitspraken gevonden worden op basis van één overweging. Dit zal ervoor zorgen dat een advocaat nog makkelijker een collectie van relevante ondersteunende uitspraken vindt.
Hoe we het aanpakken: paragraaf-overgangen
Het doel voor het machine learning model is om het begin en einde van paragrafen te vinden. Een paragraaf is een op zichzelf staand stuk tekst waarin een bepaald punt of idee wordt behandeld. Met andere woorden: aan het begin van iedere paragraaf is er een verandering van onderwerp, deze verandering moet worden gevonden door de computer. Voor jurisprudentie houdt dit concreet in: er begint een nieuw feit, een nieuwe overweging of een nieuwe beoordeling.
Om het model te trainen gebruiken we uitspraken waarin paragrafen goed te herkennen zijn: ze hebben een genormaliseerde lengte en bevatten nummering. We maken deze data minder gestructureerd (verwijderen bijvoorbeeld de nummering) en trainen hier het model mee. Dit vervuilen van de data doen we omdat anders het model de eenvoudigste route pakt: begint een tekstblok met een nummer, dan begint er een nieuwe paragraaf. Dit klinkt handig, maar het model werkt dan alleen voor de goed gestructureerde uitspraken.
Nu we een training dataset hebben, bepalen we hoe we dit aan een model voeden. We kiezen ervoor om het laatste stuk tekst voor, en het eerste stuk tekst na een mogelijk ‘paragraaf-overgang’ aan het model te voeden met een label: is een ‘paragraaf-overgang’ of is geen ‘paragraaf-overgang’. Een ‘paragraaf-overgang’ is de plek in de tekst waar de vorige paragraaf eindigt en een nieuwe begint. Nadat we dit hebben gedaan, hebben we een model dat kan herkennen wanneer er een verandering van onderwerp is en dus een nieuw feit, overweging of beoordeling begint.
En die zinnen?
Om uitspraken te structureren waar een paragraaf meerdere overwegingen bevat moeten we de uitspraken verder opsplitsen in zinnen. Voor het opsplitsen van zinnen zou je allereerst denken: splits de tekst op, op basis van leestekens en bijbehorende hoofdletters. In de praktijk ligt het echter wat moeilijker: hoe ga je bijvoorbeeld om met afkortingen en opsommingen. Deze uitzonderingen met hard-coded regels omschrijven is een foutgevoelig monnikenwerk (en daar houden wij niet van). Een betere methode is het gebruiken van ‘parse trees’. Je weet nog wel van vroeger: een zin bestaat uit zelfstandig naamwoorden, werkwoorden, bijwoorden et cetera. Daarnaast zijn er relaties tussen deze categorieën (grammatica). De grammatica van tekst gebruiken voor het segmenteren van tekst is een robuuste methode om zinnen te isoleren. Om dit te implementeren kunnen bestaande pakketten worden gebruikt, bijvoorbeeld Spacy.
Wat wordt hiermee gedaan?
Het feit dat wij uitspraken beter kunnen segmenteren in individuele onderdelen is heel leuk, maar heeft geen direct effect voor de gebruiker van onze applicatie. Het gaat erom wat we hiermee doen. Allereerst verbetert dit onze ‘vind vergelijkbare concepten’ functionaliteit. Ten tweede maakt het het de weg vrij om modellen te gaan ontwikkelen die verschillende leerstukken in een uitspraak uit elkaar te halen en verbanden tussen uitspraken kan leggen die hetzelfde leerstuk bevatten. Daarnaast is het goed segmenteren een stap in de richting van ons doel op dit vlak: het volledig begrijpen van jurisprudentie en goede verbanden kunnen leggen tussen uitspraken.