{"id":460,"date":"2024-06-04T08:08:00","date_gmt":"2024-06-04T06:08:00","guid":{"rendered":"http:\/\/192.168.1.232\/?post_type=docs&#038;p=460"},"modified":"2024-06-12T17:29:34","modified_gmt":"2024-06-12T15:29:34","slug":"beispiel-position-tagger","status":"publish","type":"docs","link":"https:\/\/biffo.de\/index.php\/titel\/nuzung-biffo\/modules\/beispiel-position-tagger\/","title":{"rendered":"Beispiel Position-Tagger"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Beispiel Position-Tagger<\/h2>\n\n\n\n<p>W\u00e4hrend der Entity-Tagger in der Lage ist die Dokumenten-Entit\u00e4t zu ver\u00e4ndern, kann der Position-Tagger nur Informationen auf Basis von einzelnen Fragmenten bereitstellen. Bedeutet, das Dokument besteht unver\u00e4ndert fort.<\/p>\n\n\n\n<p>Das folgende Beispiel wird in den \u00fcbergebenen Texten nach einem Datumswert im Format &#8222;dd.MM.yyyy&#8220; gesucht und bei einem Treffer die Information als Fragment zur\u00fcckgeliefert.<\/p>\n\n\n\n<p>F\u00fcr die Umsetzung der relevanten Funktionalit\u00e4t, wird das Interface &#8222;IDocumentFragments&#8220; ben\u00f6tigt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"893\" height=\"84\" src=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-6.png\" alt=\"\" class=\"wp-image-508\" srcset=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-6.png 893w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-6-300x28.png 300w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-6-768x72.png 768w\" sizes=\"(max-width: 893px) 100vw, 893px\" \/><\/figure>\n\n\n\n<p>Im Vergleich zu dem Entity-Tagger, verwendet und nutzt der Position-Tagger keine Tags. Weitere Annotation&#8217;s wie @ProcessName, @ProcessAuthor und @Description m\u00fcssen aber gesetzt werden.<\/p>\n\n\n\n<p>Der Funktionsumfang bzw. die zu implementierenden Methoden wurden wie folgt verwendet: <\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Funktion<\/td><td>Beschreibung<\/td><\/tr><tr><td>init<\/td><td>Initialisierung prozessrelevanter Variablen, z.B. Festlegung des Patterns f\u00fcr die Datumserkennung<\/td><\/tr><tr><td>doText<\/td><td>Hauptroutine zur Bestimmung der Inhalte. Bei Ausf\u00fchrung werden vom System nur die erste Seite oder alle Dokument-Seiten \u00fcbergeben. In diesem Beispiel wird gezielt nach dem Pattern &#8222;dd.MM.yyyy&#8220; gesucht, der erkannte Wert \u00fcberpr\u00fcft und ein Fragment erstellt. Sollte die Funktion ein Fragment gebildet haben, so wird der Wert &#8222;True&#8220; zur\u00fcckgeliefert.<\/td><\/tr><tr><td>getFragments<\/td><td>Liefert eine Liste mit den erstellten Fragmenten. Wichtig! Die Liste muss bei einer globalen Deklaration (wie hier im Beispiel) bei jedem Durchlauf gel\u00f6scht werden.<\/td><\/tr><tr><td>hasFragments<\/td><td>Falls Fragmente gebildet wurden, wird der Wert &#8222;true&#8220; ansonsten &#8222;false&#8220; zur\u00fcckgegeben.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Der Java-Code wird wie folgt umgesetzt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>package de.biffo.datumtagger;\n\nimport java.io.Serializable;\nimport java.text.SimpleDateFormat;\nimport java.util.Date;\nimport java.util.LinkedList;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\nimport org.biffo.dms.api.Description;\nimport org.biffo.dms.api.IDocumentFragments;\nimport org.biffo.dms.api.IFragmentData;\nimport org.biffo.dms.api.ProcessAuthor;\nimport org.biffo.dms.api.ProcessName;\nimport org.biffo.dms.entity.Fragments.Fragment;\n\n@ProcessName(value = \"Datum Tagger\")\n@ProcessAuthor(author = \"mlange\", url = \"www.biffo.de\", major = 0, minor = 1)\n@Description(\"Sucht nach einem Datum im Format dd.MM.yyyy und liefert entsp. ein Fragment zur\u00fcck.\")\npublic class datumtagger implements IDocumentFragments, Serializable {\n \n\tprivate static final long serialVersionUID = 1L;\n\t\n\tprivate SimpleDateFormat sdf = new SimpleDateFormat(\"dd.MM.yyyy\");\n\t\n\tprivate Pattern ptDatum;\n\tprivate List&lt;Fragment&gt; lstFragments = new LinkedList&lt;Fragment&gt;();\n\n\t\n\t@Override\n\tpublic void init() throws Exception {\n\t\tptDatum = Pattern.compile(\"(\\\\d{2}\\\\.\\\\d{2}\\\\.\\\\d{4})\");\n\t}\n \n\t\n\t\n\t@Override\n\tpublic boolean doText(String inputText) {\n\t\t\/\/ TODO Auto-generated method stub\n\t\tboolean found=false;\n\t\tlstFragments.clear();\n\t\tMatcher datumsSuche = ptDatum.matcher(inputText);\n\t    \n\t    while(datumsSuche.find()) {\n\n            Fragment fragment = new Fragment();\n\t\t\tfragment.setErstelltVon(this.getClass().getSimpleName());\n\t\t\tfragment.setGeaendertVon(fragment.getErstelltVon());\n\t\t\tfragment.setFragmentname(\"DATUM\");\n\t\t\tfragment.setFragmentvalue(datumsSuche.group(0));\n\t\t\tfragment.setFragmenttype(\"IDocumentFragments\");\n\t\t\tfragment.setProbability(0);\n\t\t\tfragment.setPage(-1);\n            try {\n            \tDate d = sdf.parse(datumsSuche.group(0));\n            \tfragment.setFragmentvalue(sdf.format(d));\n            \tfragment.setValid(true);\n            \tfragment.setProbability(1);\n            }catch(Exception e) {\n            \tfragment.setFragmentvalue(datumsSuche.group(0));\n            \tfragment.setValid(false);\n            \tfragment.setProbability(0);\n            }\n            lstFragments.add(fragment);\n            found=true;\n\t    }\n\t\t\n\t\treturn found;\n\t}\n\n\t@Override\n\tpublic List&lt;Fragment&gt; getFragments() {\n\t\treturn lstFragments;\n\t}\n\t\n\t@Override\n\tpublic boolean hasFragments() {\n\t\tif(lstFragments.size()&gt;0) return true;\n\t\treturn false;\n\t}\n\n\t@Override\n\tpublic List&lt;IFragmentData&gt; getData() {\n\t\treturn null;\n\t}\n\t\n\t@Override\n\tpublic boolean hasData() {\n\t\treturn false;\n\t}\n}\n<\/code><\/pre>\n\n\n\n<p>Wie bereits beschrieben, liegt die Besonderheit in der R\u00fcckgabe von Fragmenten, d.h. es werden Textbl\u00f6cke entsp. ihres Vorkommens gebildet. Fragmenten werden je nach vorkommen von der Applikation automatisch \u00fcbernommen und dem jeweiligen Dokument hinzugef\u00fcgt. Daher muss ein Fragment mit folgenden Informationen gebildet werden:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Methode<\/strong><\/td><td><strong>Beschreibung<\/strong><\/td><\/tr><tr><td>setErstelltVon<\/td><td>Wer hat das Fragment erstellt<\/td><\/tr><tr><td>setGeaendertVon<\/td><td>Von wem wurde das Fragment ge\u00e4ndert<\/td><\/tr><tr><td>setFragmentname<\/td><td>Name des Fragments<\/td><\/tr><tr><td>setFragmentvalue<\/td><td>Wert des Fragments<\/td><\/tr><tr><td>setFragmenttype<\/td><td>Type bzw. Interface-Name des Fragments<\/td><\/tr><tr><td>setProbability<\/td><td>Zutreffende Wahrscheinlichkeit. Wichtig! der Wert liegt zwischen 0 und 1<\/td><\/tr><tr><td>setPage<\/td><td>Auf welcher Seite wurde das Fragment gefunden. Anmerkung, hier sollte -1 \u00fcbergeben werden. <\/td><\/tr><tr><td>setValid<\/td><td>Enth\u00e4lt das Fragment valide Informationen. Im Beispiel wird \u00fcberpr\u00fcft, ob es sich wirklich um ein Datum handelt.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Die Bereitstellung in der Applikation ist 1:1 wie beim Entity-Tagger mittels JAR Archiv umzusetzen. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"883\" height=\"440\" src=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-7.png\" alt=\"\" class=\"wp-image-512\" srcset=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-7.png 883w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-7-300x149.png 300w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-7-768x383.png 768w\" sizes=\"(max-width: 883px) 100vw, 883px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"47\" src=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-8-1024x47.png\" alt=\"\" class=\"wp-image-514\" srcset=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-8-1024x47.png 1024w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-8-300x14.png 300w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-8-768x35.png 768w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-8.png 1382w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ob das Modul korrekt arbeite, kann mittels einer Pr\u00fcfung aus der Modulansicht erfolgen. In dem Beispiel wird die bereits verarbeitete &#8222;Vodafone&#8220; Rechnung mit der ID=7 genutzt. Im Block &#8222;Text Input:&#8220; mittels dem Befehl &#8222;<strong>doc[7]<\/strong>&#8220; den Test starten.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"901\" height=\"570\" src=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-9.png\" alt=\"\" class=\"wp-image-515\" srcset=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-9.png 901w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-9-300x190.png 300w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-9-768x486.png 768w\" sizes=\"(max-width: 901px) 100vw, 901px\" \/><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><strong>Bereitgestellte Funktionen von &#8222;IFragmentEntity&#8220; und deren Nutzung:<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">init()<\/h3>\n\n\n\n<p>Wird beim Laden des Moduls in den Hauptspeicher ausgef\u00fchrt. Hier\u00fcber k\u00f6nnen z.B. dynamisch OpenNLP Modelle geladen oder Variablen initialisiert werden.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>None<\/td><td>None<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">doText()<\/h3>\n\n\n\n<p>Routine zur \u00dcberpr\u00fcfung der einzelnen Seitentexte des jeweiligen Dokumentes, auf die das Modul angewendet wurde. Das Modul kann f\u00fcr die Verwendung &#8222;Aller&#8220; oder nur der &#8222;ersten Seite&#8220; in den Moduleinstellungen konfiguriert werden.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>String<\/td><td>boolean<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">getFragments()<\/h3>\n\n\n\n<p>Liefert eine Liste mit generierten Fragmenten, die w\u00e4hrend des Aufrufs der &#8222;doText&#8220; Funktion erstellt wurden. Die generierten Fragmente werden vor Speicherung auf ein m\u00f6gliches Vorhandensein \u00fcberpr\u00fcft und ggf. mit  bestehende Fragmente ersetzt und mit dem Dokument verkn\u00fcpft.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>None<\/td><td>List&lt;Fragment&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">hasFragments()<\/h3>\n\n\n\n<p>Positive R\u00fcckgabe, falls Fragmente dem Ergebnis der &#8222;doText&#8220; Funktion zugeordnet werden k\u00f6nnen. Falls Fragment aufgebaut wurden und die R\u00fcckgabe &#8222;false&#8220; liefert, erfolgt keine Verarbeitung der Fragmente.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>None<\/td><td>boolean<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">getData()<\/h3>\n\n\n\n<p>Die Methode ist vorgesehen um aus Dokumenten strukturierte Informationen zu gewinnen. Hierzu muss das Interface IFragmentData bei der Class-Definition mit implementiert werden. Denkbar ist in der Zukunft mittels REST ein Modul auf Dokumenten zu platzieren und dann strukturierte Daten abzuziehen. Beispiel w\u00e4re die \u00dcberf\u00fchrung von erkannten Rechnungspositionen in die hierzu entsprechende Struktur. <\/p>\n\n\n\n<p class=\"has-accent-3-color has-text-color has-link-color wp-elements-f801e27f0c82413a6aa0313fa481902f\">Wichtig! Die Methode wird derzeit noch nicht verwendet.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"635\" height=\"340\" src=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-10.png\" alt=\"\" class=\"wp-image-518\" srcset=\"https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-10.png 635w, https:\/\/biffo.de\/wp-content\/uploads\/2024\/06\/grafik-10-300x161.png 300w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>None<\/td><td>List&lt;IFragmentData&gt;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">hasData()<\/h3>\n\n\n\n<p>Analog wie bei hasFragments(). Sollten Daten erwirtschaftet worden sein, so erfolgt die R\u00fcckgabe mittels &#8222;true&#8220;.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Eingabe<\/strong><\/td><td><strong>R\u00fcckgabe<\/strong><\/td><\/tr><tr><td>None<\/td><td>boolean<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"featured_media":0,"parent":426,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"positive":"","negative":"","footnotes":""},"docs_category":[],"_links":{"self":[{"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs\/460"}],"collection":[{"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/types\/docs"}],"replies":[{"embeddable":true,"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/comments?post=460"}],"version-history":[{"count":14,"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs\/460\/revisions"}],"predecessor-version":[{"id":883,"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs\/460\/revisions\/883"}],"up":[{"embeddable":true,"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs\/426"}],"wp:attachment":[{"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/media?parent=460"}],"wp:term":[{"taxonomy":"docs_category","embeddable":true,"href":"https:\/\/biffo.de\/index.php\/wp-json\/wp\/v2\/docs_category?post=460"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}