<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NLP &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/nlp/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 12:23:30 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>NLP &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Haystack &#8211; NLP framework for document search and QA</title>
		<link>https://www.smalsresearch.be/haystack-nlp-framework-for-document-search-and-qa/</link>
		
		<dc:creator><![CDATA[Katy Fokou]]></dc:creator>
		<pubDate>Tue, 10 Jan 2023 10:15:46 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Quick reviews]]></category>
		<category><![CDATA[Haystack]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/haystack-nlp-framework-for-document-search-and-qa/</guid>

					<description><![CDATA[Haystack est une librairie Python open-source qui permet la construction de systèmes de questions-réponses (QA) et de systèmes de recherche sémantique de documents basé sur des modèles de langage type Transformer. Cette librairie intègre d&#8217;autres projets open-source tels que Elasticsearch, FAISS et HuggingFace. Haystack is een open-source Python library die toelaat om question answering en [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Haystack est une librairie Python open-source qui permet la construction de systèmes de questions-réponses (QA) et de systèmes de recherche sémantique de documents basé sur des modèles de langage type Transformer.
Cette librairie intègre d&#8217;autres projets open-source tels que Elasticsearch, FAISS et HuggingFace.</p>




<p>Haystack is een open-source Python library die toelaat om question answering en semantische systemen voor het ophalen van documenten te bouwen. Deze library is gebaseerd op taalmodellen van het type Transformer.
De Haystack library integreert andere open-source projecten zoals Elasticsearch, FAISS en HuggingFace.</p>







            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2023/01/QR-Haystack.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of QR-Haystack."></object>
                <a id="wp-block-file--media-63fd623f-6d84-4ff6-9727-acfce81fc5f6" href="https://www.smalsresearch.be/wp-content/uploads/2023/01/QR-Haystack.pdf">QR-Haystack</a><a href="https://www.smalsresearch.be/wp-content/uploads/2023/01/QR-Haystack.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-63fd623f-6d84-4ff6-9727-acfce81fc5f6">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Natural Language Processing &#8211; Calcul de similarité entre deux textes</title>
		<link>https://www.smalsresearch.be/natural-language-processing-calcul-de-similarite-entre-deux-textes/</link>
		
		<dc:creator><![CDATA[Katy Fokou]]></dc:creator>
		<pubDate>Thu, 21 Apr 2022 10:00:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">/?p=17250</guid>

					<description><![CDATA[Une grande quantité de documents est traitée tous les jours dans les administrations. Sans surprise, beaucoup de use cases qui nous sont présentés relèvent du traitement automatique de documents. L’un des besoins exprimé par les clients est de disposer d’un système de filtrage de documents dans le cadre de l’analyse de dossiers. L’implémentation d’un système [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Une grande quantité de documents est traitée tous les jours dans les administrations. Sans surprise, beaucoup de use cases qui nous sont présentés relèvent du traitement automatique de documents. L’un des besoins exprimé par les clients est de disposer d’un système de filtrage de documents dans le cadre de l’analyse de dossiers. L’implémentation d’un système de filtrage s’appuie sur plusieurs éléments&nbsp;:</p>
<ul>
<li>La recherche sur les métadonnées (information structurée). Les documents sont associés à des métadonnées définis manuellement par un agent. Celles-ci peuvent être enrichies automatiquement grâce à des techniques telles que <a href="/named-entity-recognition-une-application-du-nlp-utile/">l’extraction d’entités</a> (NER) ou le <em>topic modeling</em> qui consiste à extraire les principaux thèmes traités dans les documents.</li>
<li>La recherche sur le contenu (information non-structurée). Typiquement, la recherche se fait à partir d’une requête introduite par un utilisateur sur des contenus indexés. Un cas particulier de la recherche sur le contenu est de retrouver des documents dont le contenu est similaire. Ceci permet de retrouver et de consulter les traitements de dossiers portant sur des sujets similaires.</li>
</ul>
<p>C’est ce dernier scénario que nous allons aborder ci-dessous en présentant une expérience que nous avons réalisée sur le calcul de similarité entre deux textes.</p>
<p>Il y a deux façons d’aborder la similarité entre textes :</p>
<ul>
<li>La similarité lexicale. Les textes sont considérés comme un ensemble de mots, la similarité entre deux textes est caractérisée par le degré de recouvrement entre les ensembles de mots relatifs aux textes considérés. La similarité lexicale présente cependant quelques inconvénients&nbsp;: l’ordre des mots dans la phrase ainsi que les relations entre les mots ne sont pas pris en compte. Deux documents peuvent avoir peu de recouvrements entre leurs vocabulaires et parler de sujets similaires car le langage naturelle comprend de nombreuses façons d’exprimer une même idée.</li>
<li>La similarité sémantique. Cette méthode est une extension de la précédente qui intègre la sémantique des mots notamment via la vectorisation de texte avec des techniques comme le <a href="https://fr.wikipedia.org/wiki/Word_embedding#:~:text=Le%20word%20embedding%20(%C2%AB%20plongement%20de,plus%20proprement%20%C3%A0%20cette%20m%C3%A9thode."><em>word embeddings </em></a>ou l’utilisation de <em>transformers</em> tels que <a href="https://ai.googleblog.com/2018/11/open-sourcing-bert-state-of-art-pre.html">BERT</a>.</li>
</ul>
<p>L’expérience s’est faite en trois étapes&nbsp;: le prétraitement du contenu, la représentation numérique de texte (vectorisation) et enfin le calcul de similarité. </p>



<h1 class="has-vivid-cyan-blue-color has-text-color wp-block-heading">Le prétraitement des textes à comparer</h1>



<p>Tout traitement automatique de textes (ou corpus) commence toujours par une étape de «&nbsp;nettoyage&nbsp;». Cela implique la normalisation de texte pour enlever les caractères spéciaux,&nbsp;la division du texte en plus petites unités (typiquement des mots) , la conversion des mots en minuscule et/ou en lemme, la suppression de la ponctuation, des mots les plus fréquents, etc. Le traitement à appliquer sera déterminé par le problème que l’on veut résoudre et la qualité du corpus.</p>



<figure class="wp-block-image size-full is-resized"><a href="/wp-content/uploads/2022/04/image.png"><img fetchpriority="high" decoding="async" src="/wp-content/uploads/2022/04/image.png" alt="" class="wp-image-17254" width="701" height="171" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image.png 701w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-300x73.png 300w" sizes="(max-width: 701px) 100vw, 701px" /></a><figcaption>Exemple de prétraitement de texte: le texte est divisé en mots, les mots sont convertis en lemme et la date et l&#8217;url sont remplacés par des termes génériques.</figcaption></figure>



<h1 class="has-vivid-cyan-blue-color has-text-color wp-block-heading">Représentation vectorielle des textes</h1>



<p>La plupart des algorithmes utilisent des données numériques comme input et le texte dans sa forme brute ne peut être utilisé tel quel. Il faut donc passer par une étape de transformation de données textuelles en données numériques représentées sous forme de vecteurs sur lesquelles on peut appliquer des opérations vectorielles. Ces vecteurs doivent être tels que les propriétés linguistiques du texte soient conservées.</p>



<p>Nous allons aborder ici les techniques les plus courantes de représentation vectorielle des textes, le choix de l’une ou de l’autre de ces techniques affecte le calcul de similarité comme nous le verrons dans l’expérience décrite ci-dessous.</p>



<h2 class="wp-block-heading"><strong>Bag of Words (collection de mots)</strong></h2>



<p>Chaque document est représenté par un vecteur de taille fixe égal au nombre de mots du vocabulaire du corpus V (ensemble de mots présents dans le corpus) dont chaque élément représente le nombre d’occurrence d’un mot m<sub>i&nbsp; </sub>dans le document. Les mots sont considérés individuellement et l’ordre dans lesquelles ils apparaissent dans une phrase n’est pas pris en compte.</p>



<h2 class="wp-block-heading"><strong>Term Frequency – Inverse Document Frequency (TF-IDF)</strong></h2>



<p>Le TF-IDF est une variation du BoW. Dans la méthode précédente les mots sont considérés de même importance dans chaque document. Cependant les mots récurrents dans un document d et rares dans le reste du corpus sont plus informatifs sur ce document que les mots apparaissants de façon équivalente dans tous les documents du corpus. La méthode TF-IDF permet donc d’ajuster le poids d’un mot dans un document en fonction de sa fréquence dans le document et dans le reste corpus.</p>



<p>La valeur de chaque élément (t) du vecteur représentant le document (d) est déterminée par la formule suivante&nbsp;:</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="/wp-content/uploads/2022/04/image-1.png"><img decoding="async" src="/wp-content/uploads/2022/04/image-1.png" alt="" class="wp-image-17258" width="465" height="172" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image-1.png 789w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-1-300x111.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-1-768x284.png 768w" sizes="(max-width: 465px) 100vw, 465px" /></a></figure>



<p>Les représentations BoW et TF-IDF produisent des vecteurs larges et clairsemés (contenant beaucoup de 0) et capturent mal la sémantique des mots. Une des solutions possible à ce problème de vecteurs larges est la réduction de dimension avec des méthodes telles que <a href="https://fr.wikipedia.org/wiki/Analyse_s%C3%A9mantique_latente">l’analyse sémantique latente</a> (LSA). Cet algorithme vise à réduire le texte à ses concepts principaux.</p>



<h2 class="wp-block-heading"><strong>Word embeddings (Word2Vec, Glove,&nbsp; fastText)</strong></h2>



<p>Les <em>words embeddings</em> tentent de corriger les inconvénients des méthodes décrites ci-dessous en produisant <strong>pour chaque mot</strong> un vecteur compact et dense tel que des mots ayant une signification similaire sont représentés par des vecteurs proches dans l’espace vectoriel. Chaque élément du vecteur représente un aspect de la signification du mot. Les modèles type « word vector » les plus populaires sont Word2Vec, Glove et fastText.</p>



<p>La représentation vectorielle du document tout entier peut-être calculée en prenant la moyenne des vecteurs de chaque terme présent dans le documents.</p>



<h2 class="wp-block-heading"><strong>Transformers</strong></h2>



<p>Les <em>transformers</em> sont les modèles de représentation textuelle les plus avancés dans le domaine du NLP. Ils prennent en compte le fait qu’un mot, selon le contexte, aura un sens différent. Dans ce modèle, le mot est représenté par des vecteurs différents selon le contexte (<a href="/nlp-modeles-de-langue/">voir plus de détails sur les <em>transformes</em> dans ce blog</a>).</p>



<h1 class="has-vivid-cyan-blue-color has-text-color wp-block-heading">Mesure de similarité</h1>



<h2 class="wp-block-heading"><strong>Similarité Jaccard (similarité syntaxique)</strong></h2>



<p>C’est la forme la plus basique de calcul de similarité entre deux textes car elle ne nécessite pas d’avoir une représentation numérique des textes. L’indice de Jaccard est mesuré en divisant le nombre de mots partagés par les deux textes par le nombre total de mots. Cependant, plus les documents sont longs plus le nombre de mots partagés sera élevé sans pour autant que ces documents soient similaires.</p>



<h2 class="wp-block-heading"><strong>Distance euclidienne</strong></h2>



<p>C’est la distance entre deux vecteurs représentants les documents. Cette mesure est utilisée spécifiquement par l’algorithme K-means.</p>



<h2 class="has-black-color has-text-color wp-block-heading"><strong>Similarité cosinus</strong></h2>



<p>A la différence de la distance euclidienne, c’est l’angle entre les vecteurs et non la taille des vecteurs qui est pris en compte, ce qui a pour effet de réduire l’impact de la taille des documents sur le calcul de similarité. Cette méthode est la plus couramment utilisée car simple et efficace d’un point de vue computationnel.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="/wp-content/uploads/2022/04/image-3.png"><img decoding="async" src="/wp-content/uploads/2022/04/image-3.png" alt="" class="wp-image-17263" width="756" height="424" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image-3.png 975w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-3-300x169.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-3-768x432.png 768w" sizes="(max-width: 756px) 100vw, 756px" /></a></figure>



<h1 class="has-vivid-cyan-blue-color has-text-color wp-block-heading">Comparaison de plusieurs approches de calcul de similarité</h1>



<p>Le but de l’exercice consiste à retrouver dans un corpus de 400 documents, les 5 documents les plus similaires à un document donné qui constitue notre&nbsp;requête. Des utilisateurs experts ont classé les documents de test en 8 catégories et 36 sous-catégories. On considère que des documents sont similaires s’ils appartiennent à la même catégorie et sous-catégorie que le document requête.</p>



<p>Nous avons essayé plusieurs combinaisons de représentation vectorielle et mesure de similarité cependant c’est l’étape de vectorisation de texte qui est déterminante pour l’efficacité de la recherche de documents similaires. Nous nous limitons donc à comparer les différentes représentations vectorielles en utilisant la similarité cosinus comme mesure de similarité avec l’algorithme kNN pour retrouver les 5 documents les plus proches du document requête.</p>



<p>Les différentes représentations vectorielles implémentées sont&nbsp; les suivantes:</p>



<ul class="wp-block-list"><li>TF-IDF</li><li>TF-IDF + LSA</li><li>Word embeddings – fastText (source: <a href="https://fasttext.cc/docs/en/crawl-vectors.html">Word vectors for 157 languages · fastText</a>)</li><li>Word embeddings – fastText amélioré (<em>fine-tuned</em>) en intégrant des données du domaine</li><li>Word embeddings – Word2vec entrainé sur des données du domaine uniquement</li></ul>



<h2 class="wp-block-heading"><strong>Première évaluation des différents <em>word embeddings</em></strong></h2>



<p>Pour nos premiers tests, nous utilisons des <em>word embeddings</em> libre d’accès et entrainés sur des millions de documents. Néanmoins, les textes utilisés pour entrainer ces modèles sont éloignés de notre domaine et les représentations produites pour des textes contenant un vocabulaire propre à la sécurité sociale sont moins précises.</p>



<p>En recherchant les mots les plus similaires (proches dans l’espace vectorielle) aux mots «&nbsp;cotisation&nbsp;» et «&nbsp;Dmfa&nbsp;» on obtient les résultats suivants&nbsp;:</p>



<figure class="wp-block-image size-full is-resized"><a href="/wp-content/uploads/2022/04/image-4.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2022/04/image-4.png" alt="" class="wp-image-17272" width="508" height="265" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image-4.png 881w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-4-300x157.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-4-768x401.png 768w" sizes="auto, (max-width: 508px) 100vw, 508px" /></a></figure>



<p>Ces résultats illustrent les spécificités de chacun des modèles Word2Vec et fastText&nbsp;: le modèle fastText capture les différentes formes morphologiques des mots tandis que le modèle Word2Vec capture les relations entre les mots apparaissant dans un même contexte. Autre point d’attention, pour le mot «&nbsp;cotisation&nbsp;» les mots similaires donnés par le modèle Word2Vec tels que <a href="https://www.rafp.fr/">rafp</a> et <a href="https://www.urssaf.fr/portail/home/employeur/calculer-les-cotisations/les-taux-de-cotisations/la-csg-crds.html">csg-crds</a> sont parfaitement logiques dans un contexte français mais ne sont pas d’utilité dans le contexte de la sécurité sociale belge.</p>



<p>Avec la librairie python Gensim, il est possible d’entrainer ou d’affiner des modèles de word embeddings et nous disposons pour cela d’un corpus très limité de 3500 documents. Nous utilisons ce corpus pour affiner le modèle fastText précédemment décrit et pour entrainer «&nbsp;from scratch&nbsp;» un modèle word2vec ce qui donne les résultats suivants.</p>



<figure class="wp-block-image size-full is-resized"><a href="/wp-content/uploads/2022/04/image-5.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2022/04/image-5.png" alt="" class="wp-image-17274" width="478" height="325" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image-5.png 773w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-5-300x204.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-5-768x522.png 768w" sizes="auto, (max-width: 478px) 100vw, 478px" /></a></figure>



<p>Le modèle fastText s’est amélioré, le terme «&nbsp;dmfa&nbsp;» a une représentation vectorielle cependant les termes similaires à ce terme se réfèrent pour la plupart à des institutions de sécurité sociale étrangères. Quant au modèle Word2Vec, bien qu’ayant été entrainé avec très peu de textes, on constate qu&#8217;il donne déjà des résultats satisfaisants.</p>



<h2 class="wp-block-heading"><strong>Évaluation des différentes représentations de textes sur les documents de test</strong></h2>



<p>Les différentes représentations vectorielles implémentées sont&nbsp;les suivantes:</p>



<ul class="wp-block-list"><li>TF-IDF</li><li>TF-IDF + LSA</li><li>Word embeddings – fastText (source: <a href="https://fasttext.cc/docs/en/crawl-vectors.html">Word vectors for 157 languages · fastText</a>)</li><li>Word embeddings – fastText amélioré (<em>fine-tuned</em>) en intégrant des données propres à notre domaine</li><li>Word embeddings – Word2Vec entrainé avec des données du domaine uniquement</li></ul>



<p>Pour chacune d’elles, on recherche les 5 documents les plus similaires d’un document requête et on calcule la proportion de documents similaires qui appartiennent à la même catégorie et la même sous-catégorie que ce document requête.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2022/04/image-6.png"><img loading="lazy" decoding="async" width="1024" height="325" src="/wp-content/uploads/2022/04/image-6-1024x325.png" alt="" class="wp-image-17276" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/04/image-6-1024x325.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-6-300x95.png 300w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-6-768x244.png 768w, https://www.smalsresearch.be/wp-content/uploads/2022/04/image-6.png 1174w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Résultats de la recherche des 5 documents les plus proches d&#8217;un document requête</figcaption></figure>



<p>Les modèles TF-IDF et Word2Vec sont ceux qui donnent les meilleurs résultats. Les documents retrouvés par les deux modèles appartiennent tous à la bonne catégorie et sous-catégorie cependant seuls 2 documents sur 5 sont communs aux deux sets de résultats (TF-IDF et Word2Vec). En analysant de près les résultats, on constate que le modèle Word2Vec a privilégié des documents se référant à des entreprises de restauration. Le document requête concerne lui aussi une entreprise de restauration.</p>



<p><strong>Conclusion</strong></p>



<p>Nous avons vu comment déterminer si deux textes sont similaires. On constate que le choix du type de représentation vectorielle est important pour cette tâche. Sans surprise les modèles qui intègrent la sémantique d’un mot donnent, dans notre use case, des résultats plus pertinents. Ils existent des représentations type&nbsp;<em>word embedding</em> prêtes à l’emploi (Word2Vec, fastText, GloVe). Cependant si on traite des textes qui relèvent d’un domaine ayant un vocabulaire spécifique, il est préférable d’entrainer son propre <em>word embedding</em> «&nbsp;from scratch&nbsp;».</p>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SDV &#8211; Synthetic Data</title>
		<link>https://www.smalsresearch.be/sdv-synthetic-data/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 08 Mar 2022 08:01:29 +0000</pubDate>
				<category><![CDATA[Quick reviews]]></category>
		<category><![CDATA[anonimisatie]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[synthetic data]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/sdv-synthetic-data/</guid>

					<description><![CDATA[SDV (Synthetic Data Vault)is een populaire open source library voor het genereren van een nieuwe synthetische dataset naar het model van een zelf opgegeven dataset. Ze is gemakkelijk te integreren in een data processing workflow op basis van Python. De library is nog in alfa-status en actief in ontwikkeling, Ze is gratis en vrij beschikbaar [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SDV (Synthetic Data Vault)is een populaire open source library voor het genereren van een nieuwe synthetische dataset naar het model van een zelf opgegeven dataset. Ze is gemakkelijk te integreren in een data processing workflow op basis van Python. De library is nog in alfa-status en actief in ontwikkeling, Ze is gratis en vrij beschikbaar onder MIT licensie.</p>




<p>SDV (Synthetic Data Vault) est une bibliothèque open source populaire permettant de générer un nouvel ensemble de données synthétiques modélisé sur un ensemble de données spécifié. Il s&#8217;intègre facilement dans un flux de traitement de données basé sur Python. La bibliothèque est toujours en version alpha et en développement actif. Elle est gratuite et librement disponible sous licence MIT.</p>




<p>&nbsp;</p>




<p>&nbsp;</p>







            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2022/03/QR-SDV.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of QR-SDV."></object>
                <a id="wp-block-file--media-b583eaae-5e86-46a8-947a-aa4c34edce87" href="https://www.smalsresearch.be/wp-content/uploads/2022/03/QR-SDV.pdf">QR-SDV</a><a href="https://www.smalsresearch.be/wp-content/uploads/2022/03/QR-SDV.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-b583eaae-5e86-46a8-947a-aa4c34edce87">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Webinar SAI &#8211; Natural Language Generation</title>
		<link>https://www.smalsresearch.be/webinar-sai-natural-language-generation/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Thu, 17 Feb 2022 13:13:52 +0000</pubDate>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NLG]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/webinar-sai-natural-language-generation/</guid>

					<description><![CDATA[Slides van de webinar voor SAI op 17/02/2022&#160; Natural Language Generation (NLG) gaat over het automatisch cre&#235;ren van correcte en inhoudelijk betekenisvolle tekst. Dit kan vandaag ook met behulp van Artifici&#235;le Intelligentie, net zoals men realistische foto&#8217;s en zelfs video&#8217;s kan namaken. Wat is de stand van zaken van deze technologie, wat zijn de opportuniteiten [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Slides van de <a href="https://www.sai.be/event/details/191/natural-language-generation/">webinar voor SAI</a> op 17/02/2022&nbsp;</strong></p><p>Natural Language Generation (NLG) gaat over het automatisch cre&euml;ren van correcte en inhoudelijk betekenisvolle tekst. Dit kan vandaag ook met behulp van Artifici&euml;le Intelligentie, net zoals men realistische foto&#8217;s en zelfs video&rsquo;s kan namaken. Wat is de stand van zaken van deze technologie, wat zijn de opportuniteiten en de gevaren? Artifici&euml;le Intelligentie is echter niet zaligmakend, en we bekijken in dit webinar ook alternatieven voor het automatisch genereren van tekst die eenvoudiger of robuuster kunnen zijn.</p><p>We stofferen alles met voldoende voorbeelden en ervaringen geput uit experimenten die Smals Research het voorbije jaar heeft uitgevoerd. Tot slot peilen we naar toepassingen binnen een overheidscontext. We hopen u met dit webinar te inspireren om de mogelijkheden van NLG binnen uw organisatie te ontdekken.</p>







                <h1 class="wp-block-heading">Presentation</h1>
            
            


            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2022/02/20220217-sai-nlg.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of 20220217-sai-nlg."></object>
                <a id="wp-block-file--media-c82f0a7a-7275-4604-bf07-ecb884c0bf17" href="https://www.smalsresearch.be/wp-content/uploads/2022/02/20220217-sai-nlg.pdf">20220217-sai-nlg</a><a href="https://www.smalsresearch.be/wp-content/uploads/2022/02/20220217-sai-nlg.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-c82f0a7a-7275-4604-bf07-ecb884c0bf17">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Natural Language Generation</title>
		<link>https://www.smalsresearch.be/natural-language-generation/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Thu, 28 Oct 2021 09:47:31 +0000</pubDate>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NLG]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/natural-language-generation/</guid>

					<description><![CDATA[Slides van de webinar voor Smals Academy op 28/10/2021 (texte fran&#231;ais&#160;: voir ci-dessous) Natural Language Generation (NLG) gaat over het automatisch cre&#235;ren van correcte en inhoudelijk betekenisvolle tekst. Dit kan vandaag ook met behulp van Artifici&#235;le Intelligentie, net zoals men realistische foto&#8217;s en zelfs video&#8217;s kan namaken. Wat is de stand van zaken van deze [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Slides van de webinar voor Smals Academy op 28/10/2021
</strong>(texte fran&ccedil;ais&nbsp;: voir ci-dessous)<strong>
</strong></p><p>Natural Language Generation (NLG) gaat over het automatisch cre&euml;ren van correcte en inhoudelijk betekenisvolle tekst. Dit kan vandaag ook met behulp van Artifici&euml;le Intelligentie, net zoals men realistische foto&rsquo;s en zelfs video&rsquo;s kan namaken. Wat is de stand van zaken van deze technologie, wat zijn de opportuniteiten en de gevaren? Artifici&euml;le Intelligentie is echter niet zaligmakend, en we bekijken in dit webinar ook alternatieven voor het automatisch genereren van tekst die eenvoudiger of robuuster kunnen zijn.
</p>


<hr class="wp-block-separator has-alpha-channel-opacity">


<p></p><p>
Le Natural Language Generation (NLG) ou, en fran&ccedil;ais, la G&eacute;n&eacute;ration Automatique de Textes (GAT), consiste en la cr&eacute;ation automatique de textes corrects et significatifs. Aujourd&rsquo;hui, cela peut &eacute;galement se faire au moyen de l&rsquo;intelligence artificielle, tout comme il est possible de recr&eacute;er des photos et m&ecirc;me des vid&eacute;os r&eacute;alistes. O&ugrave; en est cette technologie, quels sont ses dangers et opportunit&eacute;s&nbsp;? L&rsquo;intelligence artificielle n&rsquo;est toutefois pas la panac&eacute;e. Lors de ce webinaire, nous examinons &eacute;galement les alternatives &agrave; la g&eacute;n&eacute;ration automatique de textes qui peuvent &ecirc;tre plus simples ou plus robustes.</p><p>&nbsp;</p>







                <h1 class="wp-block-heading">Presentation</h1>
            
            


            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2021/10/Natural-Language-Generation.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of Natural-Language-Generation."></object>
                <a id="wp-block-file--media-39eb4432-9eb1-4af2-94cd-a6f710cf9414" href="https://www.smalsresearch.be/wp-content/uploads/2021/10/Natural-Language-Generation.pdf">Natural-Language-Generation</a><a href="https://www.smalsresearch.be/wp-content/uploads/2021/10/Natural-Language-Generation.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-39eb4432-9eb1-4af2-94cd-a6f710cf9414">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Leximancer &#8211; Tekstuele analyse</title>
		<link>https://www.smalsresearch.be/leximancer-tekstuele-analyse/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 19 Oct 2021 14:09:37 +0000</pubDate>
				<category><![CDATA[Quick reviews]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[Leximancer]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/leximancer-tekstuele-analyse/</guid>

					<description><![CDATA[Leximancer is een commerciële tool die uit een grote hoeveelheid tekst de belangrijkste onderwerpen identificeert, deze groepeert in gerelateerde concepten, en de relaties ertussen visualiseert. De gebruiker kan bij elke tussenstap de resultaten verfijnen. Mogelijke toepassingsdomeinen zijn digitaal forensisch onderzoek of inspectie, analyse van grootschalige bevragingen, of pers- of literatuurreviews. &#160; Leximancer est un outil [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Leximancer is een commerciële tool die uit een grote hoeveelheid tekst de belangrijkste onderwerpen identificeert, deze groepeert in gerelateerde concepten, en de relaties ertussen visualiseert. De gebruiker kan bij elke tussenstap de resultaten verfijnen. Mogelijke toepassingsdomeinen zijn digitaal forensisch onderzoek of inspectie, analyse van grootschalige bevragingen, of pers- of literatuurreviews.</p>




<p>&nbsp;</p>




<p>Leximancer est un outil commercial qui dans une grande quantité de texte, identifie les sujets les plus importants, les regroupe en concepts connexes, et visualise les relations entre eux. L&#8217;utilisateur peut affiner les résultats à chaque étape intermédiaire. Parmi les domaines d&#8217;application possibles se trouvent la criminalistique ou l&#8217;inspection numérique, l&#8217;analyse des questionnaires à grande échelle ou encore les revues de presse/littérature.</p>







            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2021/10/QR-Leximancer.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of QR-Leximancer."></object>
                <a id="wp-block-file--media-e50b418b-e665-46cb-bf2b-dac0359e4205" href="https://www.smalsresearch.be/wp-content/uploads/2021/10/QR-Leximancer.pdf">QR-Leximancer</a><a href="https://www.smalsresearch.be/wp-content/uploads/2021/10/QR-Leximancer.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-e50b418b-e665-46cb-bf2b-dac0359e4205">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>RosaeNLG &#8211; Natural Language Generation</title>
		<link>https://www.smalsresearch.be/rosaenlg-natural-language-generation/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Sun, 04 Jul 2021 06:40:11 +0000</pubDate>
				<category><![CDATA[Quick reviews]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NLG]]></category>
		<category><![CDATA[NLP]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/rosaenlg-natural-language-generation/</guid>

					<description><![CDATA[RosaeNLG is een Natural Language Generation templating engine, gebouwd op de Pug templating engine voor node.js. In RosaeNLG kan je templates definiëren om JSON objecten om te zetten in een beschrijving in natuurlijke taal. RosaeNLG maakt daarbij in de achtergrond gebruik van woordenboeken om de correcte grammaticale regels toe te passen voor lidwoorden, vervoegingen, verbuigingen [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>RosaeNLG is een Natural Language Generation templating engine, gebouwd op de Pug templating engine voor node.js. In RosaeNLG kan je templates definiëren om JSON objecten om te zetten in een beschrijving in natuurlijke taal. RosaeNLG maakt daarbij in de achtergrond gebruik van woordenboeken om de correcte grammaticale regels toe te passen voor lidwoorden, vervoegingen, verbuigingen en naamvallen. Er worden momenteel 5 talen ondersteund: Engels, Frans, Duits, Spaans en Italiaans.</p>




<p>RosaeNLG est un moteur de génération de langage naturel, construit sur le moteur de modèles Pug pour node.js. Dans RosaeNLG, vous pouvez définir des modèles pour convertir les objets JSON en une description en langage naturel. RosaeNLG utilise des dictionnaires pour appliquer les règles grammaticales correctes pour les articles, les conjugaisons, les inflexions et les cas. Actuellement, 5 langues sont supportées&nbsp;: anglais, français, allemand, espagnol et italien.</p>







            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2021/07/QR-RosaeNLG.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of QR-RosaeNLG."></object>
                <a id="wp-block-file--media-6d4eea6f-9f67-447d-9271-705c2cb02634" href="https://www.smalsresearch.be/wp-content/uploads/2021/07/QR-RosaeNLG.pdf">QR-RosaeNLG</a><a href="https://www.smalsresearch.be/wp-content/uploads/2021/07/QR-RosaeNLG.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-6d4eea6f-9f67-447d-9271-705c2cb02634">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De AI als auteur: een blik op Natural Language Generation</title>
		<link>https://www.smalsresearch.be/de-ai-als-auteur/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Tue, 29 Jun 2021 10:14:42 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[computational creativity]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[NLG]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Productivity]]></category>
		<guid isPermaLink="false">/?p=16259</guid>

					<description><![CDATA[In deze blogpost kijken we naar twee categorieën van NLG systemen. De eerste moet het hebben van templates en grammaticale regels, en geeft een strikt deterministische output. De tweede is gebaseerd op machine learning met een scheut randomness, en benadert zo meer wat we "creatief schrijven" zouden kunnen noemen.]]></description>
										<content:encoded><![CDATA[
<p><em>Het zijn twee korte verhalen die een hele andere kijk geven op hoe technologie de toekomst kan veranderen. De eerste is er op gericht om mensen van een nieuwe techniek te helpen en om nieuwe ideeën te ontwikkelen. De tweede, die wordt gekenmerkt door meer inzicht in wat de toekomstige mogelijkheden zullen zijn en ook wat de nadelen en valkuilen zijn.</em></p>



<p>Bovenstaand paragraafje werd geschreven door een <a href="https://gpt2.ml6.eu/nl">GPT-2 taalmodel dat in het Nederlands werd getraind</a> door de Gentse startup ML6. Volgens hun taalmodel is dit een plausibele aanvulling op de titel van dit stuk. En het mag gezegd: qua stijl, woordkeuze en coherentie tussen opeenvolgende zinnen is dit zeker niet slecht. Of het ook inhoudelijk consistent en betekenisvol is, is nog iets anders: de aandachtige lezer besluipt toch nog een gevoel van &#8220;woordenbrij&#8221;, al is het maar omdat een echt correcte tekst zou verwijzen naar de verhalen als &#8220;<em>Het</em> eerste&#8221; en &#8220;<em>Het</em> tweede&#8221;.</p>



<p>Dit geeft wel een idee van waar we vandaag staan qua Natural Language Generation (NLG) in het Nederlands. De agile <a href="https://blog.ml6.eu/dutch-gpt2-autoregressive-language-modelling-on-a-budget-cff3942dd020">manier waarop ML6 dit heeft uitgewerkt</a> is trouwens een uitstekende illustratie van wat we <a href="/natural-language-processing-in-het-nederlands/">in een eerdere blogpost al concludeerden</a>: het tweaken van bestaande NLP systemen met je eigen datasets en voor je eigen doeleinden is het afgelopen jaar veel gemakkelijker geworden &#8211; al blijft beschikbaarheid van voldoende grote datasets wel een voorwaarde voor degelijke resultaten, en dat is moeilijker voor minder courante talen.</p>



<figure class="wp-block-image size-large is-resized"><a href="/wp-content/uploads/2021/06/Rita_2021-06-29-17_29_58-The-Sorting-Hat-Bot-@SortingBot-_-Twitter.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2021/06/Rita_2021-06-29-17_29_58-The-Sorting-Hat-Bot-@SortingBot-_-Twitter.png" alt="Creatieve toepassingen van tekstgeneratoren: het maken van rijmpjes in jambische tetrameter." class="wp-image-16312" width="662" height="261" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_29_58-The-Sorting-Hat-Bot-@SortingBot-_-Twitter.png 662w, https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_29_58-The-Sorting-Hat-Bot-@SortingBot-_-Twitter-300x118.png 300w" sizes="auto, (max-width: 662px) 100vw, 662px" /></a><figcaption>Creatieve toepassingen van tekstgeneratoren: deze twitterbot rijmt in jambische tetrameter [&#8220;Sorting Bot&#8221;, Darius Kazemi, 2015]</figcaption></figure>



<p>De geschiedenis van tekstgeneratoren gaat een heel eind terug. De <a href="https://plato.stanford.edu/entries/turing-test/">Turing Test</a> vereist al dat een computer een realistisch klinkend antwoord op een gestelde vraag moet kunnen samenstellen. De <a href="https://en.wikipedia.org/wiki/ELIZA">eerste chatbots</a> waren, ondanks hun eenvoud, opvallend goed in staat om een conversatie te simuleren. Recenter zagen verschillende generatoren voor langere teksten gaande van <a href="https://pdos.csail.mit.edu/archive/scigen/">academische papers</a> tot <a href="https://sebpearce.com/bullshit/">new-age bullshit</a> het licht. Op basis van de laatste evoluties in <a href="https://en.wikipedia.org/wiki/Deep_learning#Natural_language_processing">deep learning voor Natural Language Processing</a>, is het aansturen van je eigen <a href="https://play.aidungeon.io/main/home">adventure game</a> slechts een van de vele <a href="https://github.com/elyase/awesome-gpt3">creatieve toepassingen</a>. Met wat goede wil is ook <a href="https://en.wikipedia.org/wiki/Machine_translation">automatische vertaling</a> een vorm van NLG &#8211; we genereren immers een equivalent van de oorspronkelijke tekst, maar dan in een andere taal. En als we code ook als tekst beschouwen, valt het generatieve luik van  <a href="https://www.gartner.com/reviews/market/enterprise-low-code-application-platform">Low Code Application Platforms</a> er ook onder. </p>



<p>Hier kijken we naar twee categorieën van NLG systemen die fundamenteel verschillen van elkaar en op een heel andere manier tot resultaten komen. De eerste categorie moet het hebben van templates en grammaticale regels, en produceert een strikt deterministische output. De tweede categorie is gebaseerd op machine learning met een scheut randomness, en benadert zo meer wat we &#8220;creatief schrijven&#8221; zouden kunnen noemen. We beperken ons hier louter tot het genereren van tekst, waarbij je al weet wat je zou willen zeggen of welke richting je uit wil. Het <a href="https://en.wikipedia.org/wiki/Natural-language_understanding">begrijpen van vragen </a>of het <a href="https://en.wikipedia.org/wiki/Information_retrieval">opzoeken van informatie</a>, zoals bij <a href="/tag/chatbot/">chatbots</a> en <a href="https://en.wikipedia.org/wiki/Question_answering">question answering</a> systemen, kan aan het genereren van een tekst voorafgaan, maar zijn afzonderlijke concepten die buiten de scope van dit artikel vallen.</p>



<figure class="wp-block-image size-large is-style-default"><a href="/wp-content/uploads/2021/06/GPT3-failures-lacker.io-2021-06-30-08_28_57-Giving-GPT-3-a-Turing-Test.png"><img loading="lazy" decoding="async" width="366" height="308" src="/wp-content/uploads/2021/06/GPT3-failures-lacker.io-2021-06-30-08_28_57-Giving-GPT-3-a-Turing-Test.png" alt="Vraag en antwoord van GPT-3." class="wp-image-16318" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-failures-lacker.io-2021-06-30-08_28_57-Giving-GPT-3-a-Turing-Test.png 366w, https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-failures-lacker.io-2021-06-30-08_28_57-Giving-GPT-3-a-Turing-Test-300x252.png 300w" sizes="auto, (max-width: 366px) 100vw, 366px" /></a><figcaption>Er zijn spectaculaire GPT-3 demo&#8217;s, maar het systeem is nog steeds niet intelligent en genereert net zo gemakkelijk absurde output. [(c) Kevin Lacker, &#8220;Giving GPT-3 a Turing Test&#8221;, Jul 6, 2020]</figcaption></figure>



<h2 class="wp-block-heading">Grammaticale template engines</h2>



<p>De &#8220;klassieke&#8221; manier om teksten te genereren is met templates. De meesten onder ons gebruiken die wel eens in Word en Powerpoint, en wie evenementen organiseert heeft misschien ervaring met <a href="https://mailchimp.com/help/all-the-merge-tags-cheat-sheet/">MailChimp</a>. Een template is zoals een formulier: een deel is vooraf geschreven en ligt vast, de rest moet je nog aanvullen met eigen gegevens of inhoud. Die inhoud kan je zelf schrijven, of halen uit een database. Maar zo&#8217;n rechtstreekse copy-paste uit een database heeft beperkingen: dat wat je invoegt moet immers ook grammaticaal passen in de omliggende vaste tekst. Dat wordt moeilijker als we in detail willen gaan of enigszins willen variëren.</p>



<p>Retailers of grote online handelaars bieden soms duizenden producten aan op hun website, elke dag verschijnen en verdwijnen er dingen uit het assortiment. Voor elk product moet een wervend tekstje op de website komen zodra het aan de database wordt toegevoegd. Om niet telkens dezelfde tekst te doen verschijnen, wil je &#8220;<em>met onze blauwe suède schoenen</em>&#8221; al eens afwisselen met &#8220;<em>Deze schoen is blauw en gemaakt van suède,</em>&#8221; en hetzelfde moet ook werken voor &#8220;<em>rode lederen laarzen</em>&#8221; of &#8220;<em>grote Amerikaanse koelkasten</em>&#8220;. </p>



<p>Het doel van zulke <a href="https://nlpprogress.com/english/data_to_text_generation.html">data-to-text NLG</a> is om op basis van een database met mogelijk gevarieerde inhoud, toch correcte teksten te kunnen genereren. Daarvoor moeten voornaamwoorden, meervouden, verbuigingen en vervoegingen flexibel aangepast kunnen worden al naargelang het beschreven object en haar eigenschappen. In het Frans moet het <em>accord de l&#8217;adjectif</em> correct zijn, in het Duits de naamvallen, in het Nederlands de lidwoorden. Idealiter wordt er ook elegant met ontbrekende gegevens omgegaan, kunnen we de zinsvolgorde al eens veranderen, en tegelijk zorgen dat we ook niets onnodig herhalen.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator.png"><img loading="lazy" decoding="async" width="1024" height="317" src="/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator-1024x317.png" alt="Een scenario geschreven door een tekstgenerator" class="wp-image-16311" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator-1024x317.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator-300x93.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator-768x238.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/06/Rita_2021-06-29-17_25_41-Godard-Generator.png 1432w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>In 1963 suggereerde Umberto Eco dat tegen 1993 iedereen zijn eigen filmscenario à la carte zou kunnen samenstellen. Hij voegde er een patroon voor Godard-achtige films bij, hier gerealiseerd met de RiTa NLG templating engine. [&#8220;Godard Film Generator&#8221;, Mark Sample, naar een idee uit &#8220;Diario Minimo&#8221;, Umberto Eco]</figcaption></figure>



<p>Echte NLG template engines maken gebruik van een woordenboek en een grammaticale <em>rule engine</em> om dat allemaal correct te kunnen genereren. Verschillende bedrijven zijn actief in deze markt, vaak voorzien zij grafische interfaces en integraties die het gebruiksgemak heel wat kunnen verhogen. Er zijn ook open-source oplossingen waaronder <a href="https://github.com/simplenlg/simplenlg">SimpleNLG</a>, <a href="https://rednoise.org/rita/">RiTa</a> en <a href="https://rosaenlg.org/rosaenlg/3.0.0/index.html">RosaeNLG</a>. Een NLG template in die laatste ziet eruit als volgt: </p>



<pre class="wp-block-preformatted">| #[+subjectVerbAdj('enquête', {verb: 'être', tense: 'PASSE_COMPOSE', aux: 'AVOIR'}, 'ouvert', {det:'INDEFINITE'})]
| concernant
| #[+value('réclamation', {det:'POSSESSIVE', adj: 'contesté', adjPos: 'AFTER', number:'P' })]</pre>



<p>Dit genereert: &#8220;<em>Une enquête a été ouverte concernant ses réclamations contestées</em>&#8220;. De meeste parameters in dit voorbeeld, zoals de woorden &#8216;<em>enquête</em>&#8216;, &#8216;<em>ouvert</em>&#8216;, &#8216;<em>réclamation</em>&#8216;, &#8216;<em>contesté</em>&#8216;, kunnen vlot vervangen worden door andere woorden (van dezelfde woordsoort) en dan zal deze template een even correcte zin produceren. Parameters zoals werkwoordstijd en type voornaamwoord zijn eveneens gemakkelijk aanpasbaar.</p>



<p>Het gebruik van NLG op basis van grammaticale template engines heeft een paar duidelijke voordelen:</p>



<ul class="wp-block-list"><li>De hoge parametriseerbaarheid maakt dat je met 1 goed ontwikkelde NLG template teksten kan genereren over relatief heterogene collecties van gegevens.</li><li>Je hebt volledige controle over de output, alle output is gegarandeerd conform het template.</li><li>Slim gebruik van synoniemen, alternatieve beschrijvingen, wisselende zinsvolgorde, gelinkte voornaamwoorden etc. kunnen veel variatie van de output opleveren. </li></ul>



<p>Het belangrijkste nadeel is dat zulke grammaticale templates erg snel erg complex worden. Als ook variatie en synoniemen ingebouwd moeten worden, is zo&#8217;n template al snel vele malen langer dan de tekst die ze genereert. NLG templates ontwikkelen die goed geparametriseerd en breed inzetbaar zijn, is tijdrovend secuur werk en vereist bovendien een uitstekende kennis van grammatica. Als een klassieke substitutie-oplossing waarin je slechts hoeft te copy-pasten al tot een voldoende kwalitatief resultaat leidt, dan bieden NLG templating engines weinig meerwaarde.</p>



<h2 class="wp-block-heading">Creatief schrijven met neurale netwerken</h2>



<p>Een volledig andere manier om teksten te genereren werd mogelijk dankzij machine learning en met name deep learning, waarmee op basis van enorme hoeveelheden bestaande tekst (denk ter grootte van een paar keer de  volledige wikipedia) een taalmodel getraind kan worden dat &#8220;weet&#8221; welke woorden in welke context het meest geschikt zijn. Zulke <a href="https://jalammar.github.io/how-gpt3-works-visualizations-animations/">taalmodellen &#8220;voorspellen&#8221;</a> het meest plausibele volgende, of ontbrekende, woord. Doe dat vele keren na elkaar en je genereert uiteindelijk ook een tekst.</p>



<p>Kleine taalmodelletjes zitten al een tijdje in onze smartphone, waar toetsenbord-apps suggesties geven voor het volgende woord in een tekstbericht. De taalmodellen van vandaag zijn vele malen groter en kunnen veel beter rekening houden met context, zeker sinds de opkomst van de zogenaamde <a href="https://jalammar.github.io/illustrated-transformer/">transformer architectuur</a>. Die zit achter verschillende taalmodellen die furore hebben gemaakt in de laatste paar jaren, zoals BERT, T5 en GPT. <a href="https://arxiv.org/abs/2005.14165">GPT-3</a> is dusdanig groot dat eenzelfde model inzetbaar is voor <a href="https://beta.openai.com/examples">verschillende taken</a>. De geselecteerde derde partijen die van OpenAI aan de slag mochten met het model maakten al <a href="https://www.youtube.com/watch?v=G6Z_S6hs29s">indrukwekkende</a> <a href="https://www.youtube.com/watch?v=cpWEXQkpBFQ">applicaties</a>. </p>



<p>Het kost heel wat <a href="https://www.theregister.com/2020/11/04/gpt3_carbon_footprint_estimate/">geld, hardware en tijd</a> om zelf zulke taalmodellen te trainen. Wie niet zulke financiële resources heeft, moet vertrekken van een bestaand model dat ter beschikking wordt gesteld door de grote spelers, en trachten dat te verfijnen. Daarmee ben je wel afhankelijk van de dataset die gebruikt werd om het originele model te trainen. Met die trainingsdata, die niet altijd openlijk beschikbaar is, zijn verschillende problemen. Ze zijn deels gescraped van allerlei internetfora, wat maakt dat er nogal wat <a href="https://ai.googleblog.com/2020/12/privacy-considerations-in-large.html">persoonlijke gegevens in terechtkomen die kunnen uitlekken</a>. Het overgenomen discours van minder appetijtelijke fora leidt dan weer tot sterke <a href="https://thenextweb.com/news/gpt-3-has-consistent-and-creative-anti-muslim-bias-study-finds">bias in de gegenereerde teksten</a>. </p>



<p></p>



<figure class="wp-block-image size-full is-resized"><a href="/wp-content/uploads/2021/06/rita_bookshelfwriter_bibleapachespiderman.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2021/06/rita_bookshelfwriter_bibleapachespiderman.png" alt="NLG systemen schrijven tekst op basis van wat ze tijdens de trainingsfase hebben gezien." class="wp-image-16313" width="512" height="384" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/06/rita_bookshelfwriter_bibleapachespiderman.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/06/rita_bookshelfwriter_bibleapachespiderman-300x225.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/06/rita_bookshelfwriter_bibleapachespiderman-768x576.png 768w" sizes="auto, (max-width: 512px) 100vw, 512px" /></a><figcaption>NLG systemen schrijven tekst op basis van wat ze tijdens de trainingsfase hebben gezien. [&#8220;Bookshelf Writer&#8221;, Andreas Refsgaard, Kåre Magnus Sand Solvåg, Riccardo Cereser (c) Copenhagen Institute of Interaction and Design]</figcaption></figure>



<p>Mede daarom wordt de toegang tot GPT-3 angstvallig bewaakt door OpenAI. Voorganger GPT-2 is wel vrij beschikbaar en de oefening om dat ook eens te trainen in het Nederlands werd al gedaan door onder andere de <a href="https://research.rug.nl/en/publications/as-good-as-new-how-to-successfully-recycle-english-gpt-2-to-make-">Universiteit van Groningen</a> [<a href="https://github.com/wietsedv/gpt2-recycle">code</a>] en de <a href="https://blog.ml6.eu/dutch-gpt2-autoregressive-language-modelling-on-a-budget-cff3942dd020">Gentse AI-startup ML6</a> [<a href="https://colab.research.google.com/drive/1Y31tjMkB8TqKKFlZ5OJ9fcMp3p8suvs4?usp=sharing">code</a> en <a href="https://gpt2.ml6.eu/">demo</a>]. Beiden maken andere keuzes voor de manier waarop ze trainen, en gebruiken bovendien verschillende datasets: het Groningse GroNLP model is getraind op voornamelijk wikipedia, e-books en nieuwswebsites, terwijl ML6 zich baseert op <a href="https://oscar-corpus.com/">OSCAR</a>, een subset van de <a href="https://commoncrawl.org/">CommonCrawl </a>webscraping dataset. Beide hebben hun eigen voor- en nadelen: tekst gegenereerd door het GroNLP model gaat al snel lijken op een stationsromannetje, terwijl de OSCAR dataset heel wat bankrekeningnummers, bestaande adresgegevens en zelfs erotiek bevat. </p>



<p>GPT taalmodellen werken als volgt: men geeft een aanzet (een <em>prompt</em>) en laat dan het model vrij aanvullen. Dat aanvullen kan je verder vrij weinig sturing geven, je draait bij wijze van spreken gewoon de woordenkraan open. Eventueel kan je een gebruiker laten kiezen uit verschillende mogelijkheden, of de output alsnog filteren (als je bepaald taalgebruik wil weren), maar dat moet je zelf toevoegen. </p>



<p>Een fictieve biografie van ondergetekende uit een parallel universum, gegenereerd door GroNLP, klinkt als volgt (tekst in vet gegeven als aanzet):</p>



<p><em><strong>Joachim Ganseman is informaticus en heeft gestudeerd aan de Universiteit van Antwerpen. </strong>Levensloop. Hij begon zijn opleiding in het Koninklijk Belgisch Staatsinstituut voor Landbouw (KOCO) te Brussel, waar hij ook een landbouwdiploma kreeg. Hij werkte daar onder andere als assistent-accountant bij Yves Van den Bucket uit 1988 tot 1997. In 1996 was hij adjunct-adjunct-directrice met wie hij contact zocht tussen verschillende Europese landen over hun beleid inzake voedselveiligheid.</em></p>



<p>Dezelfde aanzet bij ML6 genereert de volgende biografie &#8211; ik heb duidelijk een carrière in de agro-sector gemist:</p>



<p><em><strong>Joachim Ganseman is informaticus en heeft gestudeerd aan de Universiteit van Antwerpen.&nbsp;</strong> Als onderzoeker werkte hij veel in het bedrijf van de jonge kunstenaar en producent van het meest uiteenlopende werk: de tuin, het terras, de terras- en het terrasrestaurant. Tijdens zijn werkzaamheden werd hij de expert en de eerste specialist in het werk van Ganseman. Hij specialiseerde zich in de tuinontwerp. Zijn onderzoek naar tuinontwerp is gebaseerd op de vele verschillende tuinontwerpen en is te vinden op diverse sites zoals: websites, mobiele applicaties, apps en sites van partijen.</em></p>



<p>De repetitiviteit blijft moeilijk te controleren. Je wil dat de output bij hetzelfde thema blijft maar dat geeft een risico op in herhaling vallen, terwijl veel vrijheid dan weer riskeert dat de tekst plots een heel andere richting uitgaat. Deze Nederlandstalige GPT-2 modellen zijn ook nog relatief klein, de context van de aanzet is vaak na een drietal zinnen al vergeten en dan zie je soms rare sprongen in de thematiek gebeuren. </p>



<p>Uit de aanzet die je geeft zal het model bepaalde aannames afleiden over de stijl, taalgebruik en inhoud van wat moet volgen. Zo genereer je met hetzelfde model zowel deze serieus klinkende (inhoudelijk absurde) quasi-wettekst, als het daaropvolgende (oneetbare) quasi-recept:</p>



<ul class="wp-block-list"><li><em><strong>Artikel 478, eerste lid, Gerechtelijk wetboek bepaalt dat </strong>degene die bij of krachtens deze wet wordt vervolgd wegens een strafbaar feit in de eerste aanleg bij de aanvang van de terechtzitting is verschenen, onverwijld zal worden vervangen door een gewezen rechter-commissaris.</em></li><li><em><strong>2 eieren , 500g boter , 500g suiker , 100g bloem , 1 stokje vanille. Recept:  </strong>Voeg de kaneel, kaneel en vanille toe aan de mix, voeg nog een beetje vanille, voeg 1 theelepel vanille toe. Meng met een lepel de suiker en klop door tot hij zacht genoeg is om dit een eierdooistokje te maken. Voeg vervolgens de melk, kaneel en vanille toe en voeg dit nog een beetje bij het product. Klop alles goed door elkaar en bestrooi de mix erover.</em></li></ul>



<p>Via een goed doordachte prompt kunnen we het model dus heel verschillende output laten produceren. Voor echt gespecialiseerde taken zoals het genereren van een machinevertaling of programmeercode, zal het finetunen van het model op een speciaal daarvoor gemaakte dataset misschien wel nog robuustere resultaten geven, zoals bij <a href="https://huggingface.co/mrm8488/t5-base-finetuned-wikiSQL">deze omzetting van Engelse tekst naar SQL queries</a>.</p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem.png"><img loading="lazy" decoding="async" width="1024" height="822" src="/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem-1024x822.png" alt="Om GPT-3 in te zetten als codegenerator moet je geschikte voorbeelden geven als prompt." class="wp-image-16324" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem-1024x822.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem-300x241.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem-768x617.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/06/GPT3-prompt-codegenerator-sharifshameem.png 1360w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>Om GPT-3 in te zetten als codegenerator moet je geschikte voorbeelden geven als prompt. [bron: Twitter, @sharifshameem, Jul 13, 2020]</figcaption></figure>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Het gebruik van NLG templating engines is aangewezen wanneer er een duidelijke meerwaarde is ten opzichte van de klassieke substitutie-templates (copy-paste), en wanneer de gegenereerde teksten bedoeld zijn voor de buitenwereld. Toepassingen zijn onder andere:</p>



<ul class="wp-block-list"><li>Het maken van regelmatige tekstuele rapporten of notificaties over constant binnenstromende gegevens, zoals weerberichten, de financiële markten, de sportuitslagen, maar ook statusrapporten van IT systemen, sensorgegevens van IoT devices, etc.</li><li>Het aanmaken van sterk gepersonaliseerde teksten, over bvb. de inhoud van een winkelmandje, of van een persoonlijk dossier, hetgeen per gebruiker erg kan verschillen.</li><li>Het maken van gevarieerde teksten voor omvangrijke productdatabases bij grote retailers, deelplatformen etc.</li></ul>



<p>Het gebruik van deep learning taalmodellen voor het genereren van tekst is veel riskanter. Zeker als de training van die modellen niet volledig onder eigen controle is gebeurd, is een manuele validatie en correctie van de output altijd aangewezen. Je accepteert immers ook niet blind de suggesties van je smartphonetoetsenbord. Deze aanpak vindt dus vooral intern zijn nut, binnen de organisatie, op plaatsen waar creatief schrijven vandaag veel tijd opeist. We denken onder andere aan:</p>



<ul class="wp-block-list"><li>Assistentie bij het schrijven of als tool tegen writer&#8217;s block, door het suggereren van plausibele aanvullingen.</li><li>Het aanmaken van realistisch ogend maar toch fictief opleidingsmateriaal. Dit is nuttig wanneer het niet wenselijk zou zijn dat personen in opleiding echte dossiers inkijken, bvb. omwille van privacyredenen.</li><li>Het maken van examenvragen.</li><li>Het maken van (tekstuele) <a href="/synthetic-data/">synthetische datasets</a> &#8211; mits kwaliteitscontrole, filtering en validatie van de output.</li><li>In UX analyse, voor het verzinnen van willekeurige persona&#8217;s, fictieve biografieën en gebruiksscenario&#8217;s.</li></ul>



<p>De kwaliteit van de vandaag beschikbare Nederlandstalige generatieve modellen, blijft nog wel wat achter bij dat wat de media haalt in het Engels &#8211; wat ook <a href="https://www.standaard.be/cnt/dmf20210319_05008561">De Standaard</a> opmerkte toen zij aan het testen gingen. Om dat ten gronde te verbeteren zal ook werk gemaakt moeten worden van zorgvuldiger samengestelde Nederlandstalige trainingsdatasets.</p>



<p>Voor specifieke toepassingen zoals codegeneratie, verwachten we dat gespecialiseerde modellen relatief snel hun weg zouden kunnen vinden in de bestaande professionele IDEs. Microsoft heeft <a href="https://venturebeat.com/2021/05/25/microsoft-uses-gpt-3-to-add-ai-features-to-power-apps/">recent aangekondigd</a> een deel van de functionaliteit van GPT-3 in te bouwen in hun Power Apps low-code platform, en <a href="https://copilot.github.com/">Github lanceert met CoPilot</a> een &#8220;AI Pair Programmer&#8221; als plugin voor de Visual Studio Code editor. Ongetwijfeld zullen anderen volgen, en zo vinden we suggesties van krachtiger tekstgeneratoren misschien binnenkort al terug als plugin in de gangbare developer tools. </p>



<p>______________________</p>



<p><em>Dit is een ingezonden bijdrage van Joachim Ganseman, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Starten met NLP in het Nederlands</title>
		<link>https://www.smalsresearch.be/starten-met-nlp-in-het-nederlands/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Thu, 01 Apr 2021 12:34:34 +0000</pubDate>
				<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[NER]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Open Source Software]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/starten-met-nlp-in-het-nederlands/</guid>

					<description><![CDATA[Slides van de webinar voor InfoSecurity op 31/03/2021 Natural Language processing technologie&#235;n gebruiken we ondertussen dagelijks, in de vorm van chatbots en virtuele assistenten &#8211; denk Siri of Google Assistant &#8211; of in tools gaande van autocomplete tot automatische vertaling. In het Engels werkt dat vrij goed; Nederlands blijft moeilijker maar er is toch ook [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><strong>Slides van de webinar voor InfoSecurity op 31/03/2021</strong></p><p>Natural Language processing technologie&euml;n gebruiken we ondertussen dagelijks, in de vorm van chatbots en virtuele assistenten &ndash; denk Siri of Google Assistant &ndash; of in tools gaande van autocomplete tot automatische vertaling. In het Engels werkt dat vrij goed; Nederlands blijft moeilijker maar er is toch ook snelle vooruitgang. Hoe kan je nu zelf een systeem maken voor herkenning van entiteiten in Nederlandstalige documenten? Met een focus op tekst (spraak is voor een andere keer), werken we een praktisch voorbeeld uit waarvoor we gebruik maken van openlijk beschikbare documenten en open source componenten.</p><p>Les technologies de traitement du langage naturel sont d&eacute;sormais utilis&eacute;es quotidiennement, sous la forme de chatbots et d&#8217;assistants virtuels &#8211; pensez &agrave; Siri ou Google Assistant &#8211; ou dans des outils allant de l&#8217;autocompl&eacute;tion &agrave; la traduction automatique. En anglais, cela fonctionne assez bien; le n&eacute;erlandais reste plus difficile mais les progr&egrave;s sont rapides. Alors comment faire un syst&egrave;me de reconnaissance des entit&eacute;s dans les documents n&eacute;erlandais&nbsp;? En nous concentrant sur le texte (la parole est pour une autre fois), nous &eacute;laborons un exemple pratique en utilisant des documents librement disponibles et des composants open source.</p>







                <h1 class="wp-block-heading">Presentation</h1>
            
            


            <div data-wp-interactive="core/file" class="wp-block-file">
                <object data-wp-bind--hidden="!state.hasPdfPreview" hidden class="wp-block-file__embed" data="https://www.smalsresearch.be/wp-content/uploads/2021/04/DutchNLP-infosecurity.pdf" type="application/pdf" style="width:100%;height:600px" aria-label="Embed of DutchNLP-infosecurity."></object>
                <a id="wp-block-file--media-b82c4d71-54a6-45a3-8b93-0392448b9d0c" href="https://www.smalsresearch.be/wp-content/uploads/2021/04/DutchNLP-infosecurity.pdf">DutchNLP-infosecurity</a><a href="https://www.smalsresearch.be/wp-content/uploads/2021/04/DutchNLP-infosecurity.pdf" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-b82c4d71-54a6-45a3-8b93-0392448b9d0c">Download</a>
                </div>
            ]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Natural Language Processing in het Nederlands</title>
		<link>https://www.smalsresearch.be/natural-language-processing-in-het-nederlands/</link>
		
		<dc:creator><![CDATA[Joachim Ganseman]]></dc:creator>
		<pubDate>Wed, 31 Mar 2021 09:23:39 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[automatic translation]]></category>
		<category><![CDATA[big data]]></category>
		<category><![CDATA[Natural Language Processing]]></category>
		<category><![CDATA[NER]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Parsing]]></category>
		<guid isPermaLink="false">/?p=15508</guid>

					<description><![CDATA[We lezen dan wel met de regelmaat van de klok over spectaculaire vooruitgang met NLP in het Engels - herinner u GPT-3 - maar over andere, minder courant gesproken talen, horen we weinig. Iemand die NLP probeert toe te passen op het Nederlands, kan dan ook nog een paar obstakels tegenkomen. ]]></description>
										<content:encoded><![CDATA[
<p>We publiceerden eerder al verschillende artikels over de computationele verwerking van taal, in het vakjargon bekend als Natural Language Processing (NLP):</p>



<ul class="wp-block-list"><li><a href="/facetten-van-natural-language-processing-deel-1/">Facetten van Natural Language Processing: deel 1</a> &amp; <a href="/facetten-van-natural-language-processing-deel-2/">deel 2</a></li><li><a href="/nlp-modeles-de-langue/">NLP &amp; Modèles de langue (FR)</a></li><li><a href="/named-entity-recognition-une-application-du-nlp-utile/">Named Entity Recognition: une application pratique du NLP (FR)</a> </li><li><a href="/apis-voor-computervertaling-de-praktijk/">API&#8217;s voor computervertaling</a> &amp; <a href="/apis-voor-computervertaling-de-praktijk/">in de praktijk</a></li></ul>



<p>NLP is een belangrijke component in toepassingen zoals <a href="/chatbot-studentwork-lessons-learned/">chatbots</a> en <a href="/uitdagingen-bij-voicebots/">voicebots</a>. Het kan ook ingezet worden om data te annoteren en bv. een <a href="/les-graphes-de-connaissance-quelques-applications/">knowledge graph</a> te verrijken, wat dan weer beter <a href="/graph-db-vs-rdbms/">kennisbeheer</a> en <a href="/sept-bonnes-raisons-dutiliser-une-graph-database/">-ontsluiting</a> mogelijk maakt.</p>



<p>Het is niet zo moeilijk voor iemand met wat programmeervaardigheden om met NLP te experimenteren. Veel code is open source, en er zijn talloze <a href="https://www.fast.ai/2019/07/08/fastai-nlp/">goede tutorials</a> te vinden, compleet met educatieve <em>notebooks</em> in Jupyter of Google Colab en duidelijke instructievideo&#8217;s. Maar deze beperken zich veelal tot het Engels, of heel af en toe een andere grote wereldtaal. </p>



<p>We lezen dan wel met de regelmaat van de klok over spectaculaire vooruitgang met NLP in het Engels &#8211; herinner u <a href="https://en.wikipedia.org/wiki/GPT-3">GPT-3</a> &#8211; maar over minder courant gesproken talen horen we weinig. Iemand die NLP probeert toe te passen op het Nederlands, komt dan ook plots een paar obstakels tegen. Ook <a href="https://www.standaard.be/cnt/dmf20210319_05008561">De Standaard</a> merkte dit recent op, en wist daarbij te vertellen dat de trainingsdata van GPT-3 voor 92% uit Engelse tekst bestaat en voor 0,35% uit Nederlandse &#8211; toch een stevige grootteorde verschil.</p>



<p>(Noot: de evoluties in het domein van NLP en de beschikbare tools gaan snel; dit artikel is dus accuraat op het moment van schrijven maar de situatie kan volgend jaar al helemaal anders zijn.)</p>



<p><a href="https://spacy.io/">SpaCy</a> is een bekende open-source Python library voor NLP. Ze is gebruiksvriendelijk en abstraheert veel van de onderliggende complexiteit van NLP of de achterliggende Machine Learning frameworks zoals PyTorch of Tensorflow weg. Sinds versie 3.0 ondersteunen ze ook de <em><a href="https://huggingface.co/transformers/index.html">transformer</a></em> deep learning architecturen, die aan de basis liggen van de meest succesvolle recente taalmodellen. We gebruiken deze versie van SpaCy voor al wat volgt. Alternatieven voor SpaCy zijn o.a. <a href="https://stanfordnlp.github.io/stanza/">Stanza </a>en <a href="https://github.com/flairNLP/flair">Flair</a>.</p>



<h2 class="wp-block-heading">Entiteiten herkennen</h2>



<p>Een ingebouwde functionaliteit van hun taalmodellen is Named Entity Recognition (NER), het herkennen van entiteiten in een tekst. In de <a href="https://spacy.io/models/en">documentatie</a> bij elk taalmodel zien we in het <em>label scheme</em> o.a. alle categorieën die het model kan herkennen: DATE, TIME, PERCENT etc., maar ook PERSON (eigennamen), PRODUCT of WORK_OF_ART. Het is gemakkelijk dit zelf uit te proberen op een klein stukje tekst, geïnspireerd op <a href="https://course.spacy.io/en/chapter1">hun tutorial</a>:</p>



<pre class="wp-block-preformatted">import spacy
from spacy import displacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("Apple buys a French company for $1 billion.")
displacy.render(doc, style="ent")</pre>



<figure class="wp-block-image size-large is-style-default"><a href="/wp-content/uploads/2021/03/en_core_web_sm_demo_2.png"><img loading="lazy" decoding="async" width="474" height="34" src="/wp-content/uploads/2021/03/en_core_web_sm_demo_2.png" alt="" class="wp-image-15660" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/en_core_web_sm_demo_2.png 474w, https://www.smalsresearch.be/wp-content/uploads/2021/03/en_core_web_sm_demo_2-300x22.png 300w" sizes="auto, (max-width: 474px) 100vw, 474px" /></a></figure>



<p>We merken dat <em>Apple</em> wordt herkend als ORG (organisatie), <em>French</em> als NORP (nationaliteit of religieuze/politieke groep) en <em>$1 billion</em> als een geldhoeveelheid. Proberen we echter hetzelfde in het Nederlands:</p>



<pre class="wp-block-preformatted">import spacy
from spacy import displacy
nlp = spacy.load("nl_core_news_sm")
doc = nlp("Apple koopt een Frans bedrijf voor $1 miljard.")
displacy.render(doc, style="ent")</pre>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/03/nl_core_news_sm_demo_2.png"><img loading="lazy" decoding="async" width="522" height="35" src="/wp-content/uploads/2021/03/nl_core_news_sm_demo_2.png" alt="" class="wp-image-15661" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_demo_2.png 522w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_demo_2-300x20.png 300w" sizes="auto, (max-width: 522px) 100vw, 522px" /></a></figure>



<p>In het Nederlands wordt <em>Apple</em> plots aanzien als persoon en wordt <em>1</em> aangeduid als simpel telwoord! Eerlijkheid gebiedt ons te zeggen dat de grote versie van het taalmodel dit wel correct annoteert, op het dollarteken na. De kleine taalmodellen die we hier hebben gebruikt illustreren echter wel een belangrijk punt: er is geen garantie dat wat werkt in de ene taal, daarom ook even goed zou werken in een andere taal, ook al lijkt het dat de taalmodellen slechts verschillen qua taalcode. Het repliceren van Engelstalige NLP-succesverhalen in een andere taal, is dus geen kwestie van even snel copy-pasten.</p>



<h2 class="wp-block-heading">Waarom dat verschil?</h2>



<p>Een blik op de onderliggende automatische grammaticale analyse maakt een en ander duidelijk:</p>



<pre class="wp-block-preformatted">displacy.render(list(doc.sents), style="dep")</pre>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/03/en_core_web_sm_dependencies.png"><img loading="lazy" decoding="async" width="975" height="265" src="/wp-content/uploads/2021/03/en_core_web_sm_dependencies.png" alt="" class="wp-image-15664" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/en_core_web_sm_dependencies.png 975w, https://www.smalsresearch.be/wp-content/uploads/2021/03/en_core_web_sm_dependencies-300x82.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/03/en_core_web_sm_dependencies-768x209.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></a></figure>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/03/nl_core_news_sm_dependencies.png"><img loading="lazy" decoding="async" width="975" height="262" src="/wp-content/uploads/2021/03/nl_core_news_sm_dependencies.png" alt="" class="wp-image-15665" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_dependencies.png 975w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_dependencies-300x81.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_dependencies-768x206.png 768w" sizes="auto, (max-width: 975px) 100vw, 975px" /></a></figure>



<p>De betekenis van alle afkortingen voor woordsoorten en -functies kan je terugvinden op de website van <a href="https://universaldependencies.org/">Universal Dependencies.</a> Wat blijkt:</p>



<ul class="wp-block-list"><li><em>billion</em> wordt aanzien als telwoord, <em>miljard</em> als zelfstandig naamwoord.</li><li><em>$</em> wordt in het Engels als symbool, in het Nederlands als naamwoord geannoteerd.</li><li>In het Engels is <em>&#8220;for $1 billion&#8221;</em> afhankelijk van het werkwoord (een bijwoordelijke bepaling), in het Nederlands wordt <em>&#8220;voor $1 miljard&#8221;</em> als afhankelijk van het naamwoord <em>bedrijf</em> beschouwd.</li><li><em>Apple</em> wordt in beide talen correct aangeduid als eigennaam en onderwerp, dus de grammaticale analyse alleen is niet genoeg om het onderscheid te verklaren.</li></ul>



<p><a href="https://spacy.io/">SpaCy</a>&#8216;s taalmodel voor het Nederlands ziet de zaken dus anders dan dat voor het Engels. De <a href="https://spacy.io/models/nl">documentatie</a> ervan laat zien dat de componenten <em>tagger</em> en <em>parser</em>, die de zinsontleding voor hun rekening nemen, ook heel anders georganiseerd zijn in het Nederlands en veel complexer (of fijnmaziger?) lijken dan die voor het Engels. Ook lezen we elders dat de dataset waarop de grammaticale analyse is getraind, anders is: <a href="https://catalog.ldc.upenn.edu/LDC2013T19">OntoNotes 5</a> voor het Engels, en <a href="https://github.com/UniversalDependencies/UD_Dutch-LassySmall">LassySmall 2.5</a> en <a href="https://github.com/UniversalDependencies/UD_Dutch-Alpino">Alpino</a> uit <a href="https://universaldependencies.org/">Universal Dependencies</a> voor het Nederlands.</p>



<h2 class="wp-block-heading">Lassy, Alpino en OntoNotes</h2>



<p><a href="https://www.let.rug.nl/~vannoord/Lassy/">Lassy</a> heeft haar oorsprong in de academische wereld van de computationeel taalkundigen. Er bestaat een kleine versie en een grote versie: LassyKlein met ongeveer 1 miljoen woorden, is manueel geverifieerd; LassyGroot met ongeveer 700 miljoen woorden, is automatisch geannoteerd met het programma <a href="https://www.let.rug.nl/~vannoord/alp/Alpino/">Alpino</a> . Ze gebruikten een eigen XML-annotatieformaat geïnspireerd op het eerdere project <a href="https://lands.let.ru.nl/cgn/">Corpus Gesproken Nederlands</a>. Dit formaat verschilt nogal van het <a href="https://www.conll.org/">CoNLL</a> formaat dat vaak gebruikt wordt voor opslag van dit soort gegevens, en dat de standaard is voor de <a href="https://universaldependencies.org/">Universal Dependencies</a> datasets. Na omzetting met een <a href="https://rug-compling.github.io/">convertor</a> kon wel een subset van LassyKlein daarin opgenomen worden als <a href="https://universaldependencies.org/">UD_Dutch-LassySmall</a>. Men is daarbij wel heel selectief geweest: enkel een subset uit Wikipedia is bewaard, met daarin <strong>7388</strong> zinnen van in totaal 98163 woorden. </p>



<p>Een andere dataset gebaseerd op voornamelijk nieuwsartikels is ook beschikbaar: <a href="https://github.com/UniversalDependencies/UD_Dutch-Alpino">UD_Dutch-Alpino</a>, met daarin <strong>13578</strong> zinnen met 208601 woorden. Wie enkele van de zinnen leest, merkt dat ze vooral verzameld zijn in de vroege jaren 2000. Onderwerpen die ter sprake komen zijn bijvoorbeeld Brussel-Halle-Vilvoorde, Justine Henin-Hardenne en Wim Kok als premier van Nederland. </p>



<p><a href="https://paperswithcode.com/dataset/ontonotes-5-0">OntoNotes 5.0</a> is het Engelstalige bronmateriaal voor SpaCy&#8217;s grammaticale analyse. Het bevat naar schatting 2 miljoen woorden in <strong>+/- 300000</strong> zinnen uit gevarieerde bronnen: het merendeel uit nieuwsartikels waarvan een deel ook uit vertaalde internationale bronnen, en dan nog een klein deel uit blogs en stukken uit de Bijbel. De dataset kan gezien worden als een opvolger van de <a href="https://catalog.ldc.upenn.edu/docs/LDC95T7/cl93.html">Penn Treebank</a> , een van de eerste grote datasets voor automatische syntactische analyse. Ook OntoNotes is niet in het CoNLL formaat en vereist dus een <a href="https://conll.cemantix.org/2012/data.html">omzetting</a>.</p>



<p>Om een model te kunnen trainen, moet SpaCy de CoNLL-data nog <a href="https://spacy.io/api/cli#convert">converteren</a> in haar eigen interne formaat.</p>



<h2 class="wp-block-heading">Nederlandstalige datasets: werk aan de winkel</h2>



<p>Het valt op dat er zowat 10 keer minder trainingsdata beschikbaar is voor het Nederlands dan voor het Engels. Daarbij komt ook  het uitgebreidere label schema in de woordsoort-tagger, dus minder voorbeelden per label, en een beperkte variatie in het bronmateriaal &#8211; enkel oude nieuws- en Wikipedia-artikelen. Dan is het geen verrassing dat zelfs het <a href="https://spacy.io/models/nl#nl_core_news_lg">beste (ingebouwde) Nederlandse taalmodel</a> in SpaCy qua accuraatheid in detectie van woordsoort (<em>part-of-speech</em> <em>tags</em>, <strong>95%</strong>), zinsstructuur (<em>labeled dependencies</em>, <strong>82%</strong>) en entiteiten (F-score <strong>77%</strong>) achterblijft op hun <a href="https://spacy.io/models/en#en_core_web_sm">slechtste Engelse taalmodel</a> (resp. <strong>97%, 90%, 84%</strong>) &#8211; laat staan dat het in de buurt komt van het <a href="https://spacy.io/models/en#en_core_web_trf">beste Engelse taalmodel</a> (resp. <strong>98%, 94%, 90%</strong>). Dat laatste is weliswaar een gloednieuw <em>transformer</em>-model, en het valt te verwachten dat we dit type binnenkort ook voor het Nederlands zullen mogen verwachten in SpaCy, gezien er al enkele beschikbaar zijn in de <a href="https://huggingface.co/models?filter=nl">transformers model hub</a>.</p>



<p>Wil men de achterstand echt structureel inhalen, dan zal men op een bepaald moment toch werk moeten maken van grotere Nederlandstalige datasets voor het trainen van taalmodellen. Dat vergt veel middelen en tijd, maar misschien kan een gedeeltelijke automatisering met behulp van wat vandaag al bestaat qua automatische annotatie, aangevuld met crowdsourcing voor bv. de validatie, de zaken wat versnellen. In de zijlijn: voor het trainen van <a href="https://en.wikipedia.org/wiki/Word_embedding">word embeddings / vectors</a> hoeft de tekst niet geannoteerd te zijn. Daarvoor bestaan dus, ook in het Nederlands, wel erg grote datasets, o.a. Wikipedia dumps of <a href="https://commoncrawl.org/">Common Crawl</a>. Ook gebeurt er onderzoek naar <a href="https://research.aimultiple.com/few-shot-learning/">few-shot learning</a>, waarvoor slechts enkele geannoteerde voorbeelden voldoende zouden zijn, maar er is nog volop debat over <a href="https://gpt3experiments.substack.com/p/is-gpt-3-really-doing-few-shot-learning">wanneer en onder welke voorwaarden dat wel of niet kan werken</a>. </p>



<p>Ondertussen zijn de bestaande taalmodellen zeker niet nutteloos: we kunnen ze gemakkelijk tweaken voor onze eigen toepassingen.</p>



<h2 class="wp-block-heading">Een taalmodel verbeteren</h2>



<p>Wat kunnen we vandaag al doen om fouten te reduceren? Gelukkig is SpaCy als library modulair opgezet en iedere component van de tekstverwerkingspijplijn is naar believen aan te passen. We zagen dat het Engelse <em>billion</em> wel als getal werd gezien, maar het Nederlandse <em>miljard</em> niet.</p>



<p>Laat ons eerst kijken naar de <a href="https://spacy.io/usage/linguistic-features#language-data">taalspecifieke uitzonderingen</a> die SpaCy definieert. Daarin zien we dat in de <a href="https://github.com/explosion/spaCy/blob/master/spacy/lang/nl/lex_attrs.py">lexicale attributen</a> het woord miljard wel degelijk als getal wordt aangemerkt, <a href="https://github.com/explosion/spaCy/blob/master/spacy/lang/en/lex_attrs.py">net zoals in het Engels</a>. Alleen samengestelde getallen (&#8220;drieëntwintig&#8221;) worden op moment van schrijven nog niet zo geannoteerd in het Nederlands &#8211; hiermee hebben we al direct een eerste plek gevonden waar ruimte voor verbetering is qua analyse van het Nederlands in SpaCy! </p>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/03/spacy-pipeline.png"><img loading="lazy" decoding="async" width="1024" height="173" src="/wp-content/uploads/2021/03/spacy-pipeline-1024x173.png" alt="The SpaCy NLP pipeline." class="wp-image-15730" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/spacy-pipeline-1024x173.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2021/03/spacy-pipeline-300x51.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/03/spacy-pipeline-768x130.png 768w, https://www.smalsresearch.be/wp-content/uploads/2021/03/spacy-pipeline.png 1155w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption>De SpaCy NLP pipeline. De Morphologizer is een Tagger component.</figcaption></figure>



<p>De woordsoorten worden toegekend door een <em>Morphologizer </em>in de pijplijn, dit is een component die getraind is en waarvan de uitkomst dus afhangt van de trainingsdata. En inderdaad , als we de inhoud van <a href="https://github.com/UniversalDependencies/UD_Dutch-LassySmall">UD_Dutch-LassySmall </a>en <a href="https://github.com/UniversalDependencies/UD_Dutch-Alpino">UD_Dutch-Alpino</a> erop nalezen, zijn woorden zoals <em>miljoen</em> en <em>miljard</em> er enkele keren in terug te vinden, consistent geannoteerd als NOUN.</p>



<p>Je kan desgewenst een eigen versie van de trainingsdata maken waarin dat anders is en proberen een geheel nieuwe Morphologizer component te trainen. Voor een kleine aanpassing zoals dit is een elegant alternatief ook om een op maat gemaakte component toe te voegen aan de pijplijn, die de automatische annotatie door zo&#8217;n standaard taalmodel aanpast of aanvult waar nodig of gewenst. In dit geval kunnen we een zelfgeschreven <em>AttributeRuler </em>invoegen achter de Morphologizer, die de woordsoort aanpast van  NOUN naar NUM voor NOUNs waarbij &#8220;<em>token.like_num == True</em>&#8220;:</p>



<pre class="wp-block-preformatted">ruler = nlp.add_pipe("attribute_ruler", name="fix_num", after="morphologizer")
detect = [[{"POS": "NOUN", "LIKE_NUM": True}]]  
assign = {"POS": "NUM"}  
ruler.add(patterns=detect, attrs=assign)</pre>



<figure class="wp-block-image size-large is-resized"><a href="/wp-content/uploads/2021/03/nl_core_news_sm_numfixed.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2021/03/nl_core_news_sm_numfixed.png" alt="" class="wp-image-15686" width="580" height="38" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_numfixed.png 856w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_numfixed-300x20.png 300w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_numfixed-768x51.png 768w" sizes="auto, (max-width: 580px) 100vw, 580px" /></a></figure>



<h2 class="wp-block-heading">NER updaten</h2>



<p>De Named Entity Recognition component, die het nodig vond om <em>Apple</em> een persoon te noemen, is ook een aparte component in de pijplijn die we kunnen aan- of uitschakelen, bijtrainen of desgewenst in zijn geheel vervangen. Het is niet mogelijk om een lijstje van patronen te maken waarmee alle mogelijke bedrijfsnamen herkend zouden kunnen worden, dus trainen op voorbeelden is hier onvermijdelijk. De NER-component kan hier blijkbaar enkele voorbeeldzinnen over bedrijfsacquisities gebruiken, om te leren dat niet enkel personen iets kunnen kopen.</p>



<p>SpaCy heeft sinds kort een hele <a href="https://spacy.io/usage/projects">projectarchitectuur</a> uitgebracht die het beheer en het uitvoeren van trainingsprojecten voor taalmodellen sterk vereenvoudigt. We hoeven maar een van de <a href="https://github.com/explosion/projects">templateprojecten</a> te klonen en aan te passen aan onze noden:</p>



<pre class="wp-block-preformatted">python -m spacy project clone pipelines/ner_demo_update</pre>



<p>Dit commando downloadt een kant-en-klaar project dat out-of-the-box werkt. In het bestand <em>project.yml</em> maken we de nodige aanpassingen aan de configuratie: de taal en het basismodel wijzigen naar het Nederlands, eventueel kan ook de GPU ingeschakeld worden, etc. Het <em>project.yml</em> bestand werkt zoals een <a href="https://en.wikipedia.org/wiki/Makefile">Makefile</a>: het definieert verschillende commando&#8217;s voor de voorbereiding van het data, het samenstellen van de trainingsconfiguratie, het uitvoeren van de training, het exporteren en packagen van het resulterende model en het schoonmaken van de bestandsstructuur. Je kan daar zelf naar believen onderdelen aan toevoegen. Er zijn ook mogelijkheden om het resultaat te visualiseren of via een API te publiceren, middels <a href="https://github.com/explosion/projects/tree/v3/integrations">integraties</a> met libraries zoals <a href="https://streamlit.io/">streamlit</a>, <a href="https://fastapi.tiangolo.com/">FastAPI</a>, <a href="https://wandb.ai/site">weights&amp;biases</a> en <a href="https://ray.io/">ray</a>.</p>



<p>Dan moeten we enkel nog trainingsdata in de map <em>assets</em>  zetten. Er zijn allerlei tools beschikbaar om tekst of andere data te annoteren: die van <a href="https://universaldependencies.org/tools.html">UD</a> zelf, <a href="https://labelbox.com/">LabelBox</a>, <a href="https://doccano.github.io/doccano/">Doccano</a>, &#8230; maar buiten SpaCy&#8217;s eigen <a href="https://prodi.gy/">Prodigy</a> bieden weinigen directe ondersteuning voor SpaCy. Het kan nog nodig zijn om een eigen script te maken om data te converteren naar een ondersteund formaat, en dat is met een extra lijntje code in <em>project.yml</em> snel ingevoegd. Gelukkig is het formaat gebruikt in het demoproject relatief eenvoudig en kunnen we snel manueel een JSON-file schrijven. We nemen bijvoorbeeld enkele titels van recente artikels op <a href="https://tweakers.net/">Tweakers.net</a>:</p>



<pre class="wp-block-preformatted">[
["OnePlus 9 Pro met nieuwe Sony-sensor verschijnt eind maart voor 899 euro.", {"entities":[[0,7,"ORG"],[25,29,"ORG"],[64,72,"MONEY"]]}],
["Gerucht: Discord voert gesprekken met Microsoft over mogelijke overname.",{"entities":[[9,16,"ORG"],[38,47,"ORG"]]}],
...
]</pre>



<p>Om te illustreren dat de context bepalend is om een woord als een bepaalde entiteit te markeren, vermeldt geen enkele van de voorbeeldzinnen die we gebruikten <em>Apple</em>. Eens alle onderdelen van het project zijn gedefinieerd, is de trainingsupdate met één commando uit te voeren en het resultaat al even snel te visualiseren: </p>



<pre class="wp-block-preformatted">spacy project run all
spacy project run visualize-model</pre>



<figure class="wp-block-image size-large"><a href="/wp-content/uploads/2021/03/nl_core_news_sm_retrained.png"><img loading="lazy" decoding="async" width="620" height="85" src="/wp-content/uploads/2021/03/nl_core_news_sm_retrained.png" alt="" class="wp-image-15689" srcset="https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_retrained.png 620w, https://www.smalsresearch.be/wp-content/uploads/2021/03/nl_core_news_sm_retrained-300x41.png 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></a></figure>



<p>Dit geeft dus een gemengd beeld. Het goede nieuws is dat <em>Apple</em> nu wel wordt herkend als een bedrijf. Het systeem lijkt ook extra aandacht te hebben voor cijfers gevolgd door woorden, die in commerciële context wel eens een geldbedrag zouden kunnen zijn. Maar plots worden ook mensen en nationaliteiten aanzien als organisaties &#8211; en dat was vroeger niet zo. Wat is hier gebeurd? </p>



<p>Het fenomeen staat bekend als <a href="https://explosion.ai/blog/pseudo-rehearsal-catastrophic-forgetting">Catastrophic Forgetting</a>: in de ijver om de herkenning van een bepaalde categorie van entiteiten te verfijnen, zijn de andere entiteiten in het model bij het bijtrainen veel te ver naar de achtergrond gedrukt. De standaard oplossing hiervoor is om er voor te zorgen dat genoeg voorbeelden zijn toegevoegd in de trainingsdata die ook nog over al die andere entiteiten gaan, zodat je bijtraint met een gezonde mix aan voorbeelden die alle gevraagde entiteiten bevat. Het blijft dus belangrijk dat trainingsdata, ook als het enkel om een update gaat, goed gebalanceerd blijft.</p>



<h2 class="wp-block-heading">Custom NER</h2>



<p>Naast het updaten van een NER component kan je hem ook integraal vervangen door een andere die je zelf traint. Misschien vindt je de 17 entiteiten aangeboden in de huidige trainingsdata overkill, en heb je genoeg aan wat bijvoorbeeld het <a href="https://spacy.io/models/de">Duitse taalmodel</a> biedt: <em>Person</em>, <em>Organisation</em>, <em>Location </em>en <em>Miscellaneous</em>, zoals gedefinieerd in de <a href="https://metatext.io/datasets/wikiner">WikiNER</a> dataset, en die ook beschikbaar is voor het Nederlands en het Frans.</p>



<p>Dan doe je exact hetzelfde als voordien, maar, je haalt de mosterd bij het kant-en-klare <a href="https://github.com/explosion/projects/tree/v3/pipelines/ner_wikiner">SpaCy WikiNER project</a> dat je ook eenvoudig kan klonen:</p>



<pre class="wp-block-preformatted">python -m spacy project clone pipelines/ner_wikiner </pre>



<p>Dan is het een kwestie van de <a href="https://github.com/dice-group/FOX/tree/master/input/Wikiner">trainingsdata van WikiNER</a> te downloaden en te converteren naar het juiste inputformaat. Die datavoorbereiding is waarschijnlijk nog het meeste werk. Eens het model getraind en bewaard is, kan je de NER component ervan eenvoudig inpluggen in een andere analysepijplijn, op dezelfde manier als we al eerder een stukje hadden toegevoegd aan de Morphologizer.</p>



<p>Het wordt vooral interessant als we zelf nieuwe categorieën van entiteiten gaan definiëren. Er is immers geen reden om ons te beperken tot dat wat voorzien is in een of andere dataset. Voor <a href="https://paperswithcode.com/task/medical-named-entity-recognition">e-health toepassingen</a> kan het zeer nuttig zijn om ziektes, behandelingen en medicijnen in een tekst als dusdanig te markeren. In <a href="https://xuanwang91.github.io/BioNER/">biomedische tekst</a> kan het gaan over namen van genen of proteïnen. En in <a href="https://2019.semantics.cc/fine-grained-named-entity-recognition-legal-documents">juridische tekst </a> is de herkenning van wetsartikelen ongetwijfeld ook nuttig.</p>



<p>Zolang je er trainingsdata voor kan aanmaken, en je zorgt dat er een goede balans is tussen alle entiteiten die je wil herkennen, is het allemaal mogelijk. Met wetsartikelen hadden we dat bij Smals Research <a href="/facetten-van-natural-language-processing-deel-2/">al eens uitgeprobeerd</a>, met het oog op <a href="https://www.youtube.com/watch?v=8u57WSXVpmw">entity linking</a> &#8211; in dit geval, linken naar de eigenlijke wettekst via de <a href="https://eur-lex.europa.eu/eli-register/about.html">ELI</a>: </p>



<p><img loading="lazy" decoding="async" width="800" height="283" class="wp-image-12648" style="width: 800px;" src="/wp-content/uploads/2019/02/entityrecognitioncassatie_anonymized.png" alt="Entity Recognition van locaties, organisaties en wetsverwijzingen op een juridisch document" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/02/entityrecognitioncassatie_anonymized.png 999w, https://www.smalsresearch.be/wp-content/uploads/2019/02/entityrecognitioncassatie_anonymized-300x106.png 300w, https://www.smalsresearch.be/wp-content/uploads/2019/02/entityrecognitioncassatie_anonymized-768x272.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></p>



<p>Het aanhouden van de projectstructuur van SpaCy, met een workflow definitie in <em>project.yml </em>en een trainingsconfiguratie in <em>config.cfg</em> , maakt dit alles veel gemakkelijker te beheren. We staan bij Smals Research dan ook graag open om verdere experimenten te doen met Named Entity Recognition. We kunnen snel een proof-of-concept aanleveren aan iedereen die een geannoteerde trainingsdataset heeft liggen. </p>



<h2 class="wp-block-heading">Conclusie</h2>



<p>Er is vandaag nog wat achterstand wat betreft Nederlandstalige NLP, maar het veld verandert zeer snel. Het ontbreken van grote trainingsdatasets zet een rem op de performantie. Maar met de opkomst van transfomer modellen, ook in het Nederlands, kunnen we in de nabije toekomst zeker verbetering verwachten. </p>



<p>Ondertussen zijn de bestaande taalmodellen misschien niet perfect, maar zeker niet slecht. Ze zijn bovendien erg gemakkelijk om te tweaken en te optimaliseren voor eigen toepassingen. Wie vandaag al begint met computationele analyse van taal, zal dus gemakkelijk kunnen meesurfen met de opeenvolgende verbeteringen die we de komende maanden en jaren zeker zullen zien.</p>



<p>______________________</p>



<p><em>Dit is een ingezonden bijdrage van Joachim Ganseman, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
