geimist / synOCR

synOCR turns your Synology DiskStation into a paperless office
https://geimist/synOCR
GNU General Public License v3.0
41 stars 4 forks source link

Datumserkennung (Python) mit zweistelliger Jahreszahl #14

Open erd82 opened 1 year ago

erd82 commented 1 year ago

Derzeit hat bei mir die Datumserkennung Probleme mit Datumsangaben mit zweistelligen Jahreszahlen, z.B. image

Wegen der textuellen Monatserkennung verwende ich nun die Erkennung mittels Python (natürlich langsamer als RegEx). image Aber mit der zweistelligen Jahreszahl kommt es noch nicht zurecht. Kann ich noch etwas einstellen, damit dies auch abgedeckt ist?

PS: Ich hätte sogar noch eine weitere Challenge :-o. Aber das ist schon wirklich nicht einfach zu erkennen. image

Viele Grüße, erd

Gthorsten65 commented 1 year ago

Nun ja das erste sollte eigentlich funktionieren. Ich gucke später mal. Das zweite, nun ja, die Frage ist wieviel fehlerhafte erkennungen wir uns erlauben wollen.... Und natürlich langsamer? Ist das ein Problem? Ich habe bisher bei mir da zwar einen Unterschied gesehen, aber jetzt nicht so groß. Das was es wirklich langsam macht: Stephan hat im Beispiel für die Daten die nicht erkannt werden sollen ein ungültiges Datum. Ich glaube 31.02.2022 oder so. Den hatte ich bei mir noch drin... Kopfschütteln. Dasnfihrt wirklich dazu das das parsen dieser Daten mehrere Sekunden dauert. Aber ansonsten ist der Unterschied nicht so groß.

Das andere gucke ich mir an

erd82 commented 1 year ago

Cool danke !!

Naja das zweite Beispiel ("191212") ist schon ziemlich selten.

Aber vielleicht kann die Suche nach solch einem Datum als Optional (also Fallback, wenn kein anderes Datum bisher gefunden wurde) implementiert werden. Dann dauert die Suche auch NUR länger, wenn die ersten Versuche (1. Datum im Zahlenformat wie 19.12.2012, 2. Datum im Textformat wie 19. Dezember 2012) fehlschlagen.

Gthorsten65 commented 1 year ago

Also das mit den zweistelligen Jahreszahlen ist aber deutlich Fehler a fälliger. 30.10. 07 Was ist denn jahr und was ist der Tag. Meiner Meinung nach sollten wir das erst einbauen wenn der User die Möglichkeit hat das Format vorzugeben. Weil so würde mein Algorithmus auch den das 30 als Jahreszahl erkennen. Und wir habe ja keine eindeutige Möglichkeit gefunden die Sprache des users zu erkennen, und damit das Datums Format.

Wenn der User jetzt im. Profil dd.mm.yy vorgeben kann, bzw alle anderem Formate die im wichtig sind, wäre das deutlich zuverlässiger.

m0w1337 commented 1 year ago

Genau über dieses Problem bin ich auch gestolpert. Gibt es in der Zwischenzeit eventuell die Möglichkeit für mich das Python script nach meinen Vorgaben an zu passen? Ist das script irgendwo im DMS-Filesystem zu finden? Das würde mich warscheinlich schon weiterhelfen :)

Gthorsten commented 1 year ago

Klar liegt das im Filesystem. Aber ohne das es über die GUI steuerbar ist, kannst du es ja von außen nicht einstellen

geimist commented 1 year ago

Ist das script irgendwo im DMS-Filesystem zu finden?

Im DSM liegt der Pfad hier: /usr/syno/synoman/webman/3rdparty/synOCR/includes/find_dates.py

Und hier liegt der Sourceocode.

Verbesserungen kannst du ja gerne hier vorschlagen. In Zukunft ist es eh geplant, dass der User die gewünschte Datumsyntax definieren kann. Somit kann man sich dann auch ein gewünschtes Format definieren, welches global für alle zu aggressiv suchen würde.

m0w1337 commented 1 year ago

Ideal, vielen Dank. Als generelle Verbesserung würde ich das so auch nicht einbauen, da stimme ich euch voll und ganz zu, aber für alle, die einen Quickfix für das deutsche Format möchten, bevor die freie Formatwahl kommt hätte ich hier die Lösung, die für mich sehr gut funktioniert:

Einfach die folgenden beiden Zeilen zum Array "regexlist" hinzufügen:

#D.M.y
(r"((\s)|(\())(0[1-9]|[12][0-9]|3[01])(\s?)(\.)(\s?)(0[1-9]|1[0-2])(\s?)(\.)(\s?)(\d{2})((\.|\,|\s|\))|\s*$)", "DMY", True),
#D.M.y
(r"((\s*)|(\())(0[1-9]|[12][0-9]|3[01])(\s?)(\.)(\s?)(0[1-9]|1[0-2])(\s?)(\.)(\s?)(\d{2})((\.|\,|\s|\))|\s*$)", "DMY", False),

Hier die angepasste Datei (leider verweigert Github den Anhang von python scripten, deshalb gezipped) find_dates.zip

Gthorsten65 commented 1 year ago

Ich habe schon mit verschiedenen Versionen der regex herum gespielt. Es gab dann immer Fälle wo es bei dem einen oder anderen nicht ging.... Das ist irgendwie übel. Erhoffe mir von dem User gewählten Format die Lösung. Aber das können wir gerne übernehmen. Stephan soll ich das Einbauen und einem pr machen?

31.08.2023 20:31:59 Moritz Wagner @.***>:

Ideal, vielen Dank. Als generelle Verbesserung würde ich das so auch nicht einbauen, da stimme ich euch voll und ganz zu, aber für alle, die einen Quickfix für das deutsche Format möchten, bevor die freie Formatwahl kommt hätte ich hier die Lösung, die für mich sehr gut funktioniert:

Einfach die folgenden beiden Zeilen zum Array "regexlist" hinzufügen:

#D.M.y (r"((\s)|(())(0[1-9]|[12][0-9]|3[01])(\s?)(.)(\s?)(0[1-9]|1[0-2])(\s?)(.)(\s?)(\d{2})((.|\,|\s|))|\s$)", "DMY", True),

D.M.y

(r"((\s)|(())(0[1-9]|[12][0-9]|3[01])(\s?)(.)(\s?)(0[1-9]|1[0-2])(\s?)(.)(\s?)(\d{2})((.|\,|\s|))|\s$)", "DMY", False), * Hier die angepasste Datei (leider verweigert Github den Anhang von python scripten, deshalb gezipped) find_dates.zip[https://github.com/geimist/synOCR/files/12489159/find_dates.zip]

— Reply to this email directly, view it on GitHub[https://github.com/geimist/synOCR/issues/14#issuecomment-1701562080], or unsubscribe[https://github.com/notifications/unsubscribe-auth/A24BCYJYVGZZ6STTXIIKO3DXYDKB3ANCNFSM6AAAAAAWP37JQU]. You are receiving this because you commented.[Verfolgungsbild][https://github.com/notifications/beacon/A24BCYM5LITIJT23NSJHURDXYDKB3A5CNFSM6AAAAAAWP37JQWWGG33NNVSW45C7OR4XAZNMJFZXG5LFINXW23LFNZ2KUY3PNVWWK3TUL5UWJTTFNPDOA.gif]

geimist commented 1 year ago

Ja, gerne. Da müssen wir uns nur über die Parameter abstimmen und wie ich sie dir übergeben soll.

Folgende Parameter für die vom User zu definierenden Suchmuster kommen mir jetzt in den Sinn:

{DD}    ➜ Tag (Zahl)
{MM}    ➜ Monat (Zahl)
{Month} ➜ Monat (ausgeschrieben)
{Mon}   ➜ Monat (ausgeschrieben Abkürzung)
{YY}    ➜ Jahr (Zahl zweistellig)
{YYYY}  ➜ Jahr (Zahl vierstellig)

Ich würde dir dann etwas in der Form übergeben:

"'{YYYY}-{MM}-{DD}' '{YYYY}/{DD}/{MM}' '{DD}.{MM}.{YY}' '{DD}.{MM}.{YYYY}' '{DD} {Month} {YYYY}' '{DD} {Mon}. {YYYY}'"

Verbesserungsvorschläge?

Gthorsten commented 1 year ago

Ja genau, so sieht es gut aus. Der Parameter wäre dann zb date_format mit dem String von oben. Ich teile mir das dann auf und suche nur noch nach diesen numerischen Formaten

geimist commented 1 year ago

… suche nur noch nach diesen numerischen Formaten

Wie kommst du / Python mit internationalen Bezeichnungen für ausgeschriebene Monate und deren Abkürzungen zurecht? Gibt es da vielleicht schon vordefinierte Arrays?

Gthorsten commented 1 year ago

Also bei ausgeschriebenen Namen inkl Abkürzungen macht das ja ein Python Modul selbstständig. Bei den Trennzeichen habe ich eine Liste due gültig ist . Da sollte der User vlt was vorgeben können....und wir prüfen es gehen erlaubte Werte