AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Text bereinigen: kurze Wörter löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Text bereinigen: kurze Wörter löschen

Ein Thema von erich.wanker · begonnen am 16. Mai 2017 · letzter Beitrag vom 18. Mai 2017
Antwort Antwort
Seite 2 von 2     12   
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Text bereinigen: kurze Wörter löschen

  Alt 17. Mai 2017, 14:55
Keine Wörterbuchliste sondern eine Wörterliste.
Also im einfachsren Fall eine Stringliste mit Wörtern.
Eventuell aber auch zwei Listen, eine Black- und eine White-Liste.
Die lädst du bei Programmstart aus Textdateien und speicherst diese wieder bei Programmende.
Beim Parsen schlägst du jedes Wort in deinem Text erst in der White-Liste nach, wenn dort vorhanden, bleibt es im Text.
Dann in der Blackliste, wenn dort vorhanden, fliegt es raus.
Ansonsten fragst du den Anwender, nach seiner Entscheidung fügst du das Wort in eine der Listen ein.
  Mit Zitat antworten Zitat
hanvas

Registriert seit: 28. Okt 2010
157 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Text bereinigen: kurze Wörter löschen

  Alt 17. Mai 2017, 15:26

Rohdaten sind aus "Tesseract OCR"

- ich verwende ghostscript, um PDF´s (bestehend meist aus gescannte A4 Seiten) in TIFF umzuwandeln...
- und ich verwende tesseract OCR, um TIFF´s in TXT umzuwandeln
- dann lade ich mir die TXT rein ... lösche "Füllwörter"
Tesseract kann das eigentlich deutlich besser. Wie verwendest Du Tesseract denn, über die Kommandozeile oder als DLL mit der CAPI?

Bei Interesse kann ich eine Portierung der C API hier hochladen damit man Tesseract als DLL einbinden kann.

Unabhängig davon, schau die mal [1][2] und [3] an. Die Methoden funktionieren mit der API Version ebenso wie mit der Komandozeile.

Ja ... Ein Wörterbuch drüberlaufen lassen wäre natürlich perfekt - aber das überschreitet meine Fähigkeiten
Das hat Tesseract schon eingebaut. Du kannst sowohl mit der Komandozeile wie auch der CAPI Version eigene Wörterbücher mitgeben. Das ist eine der Maßnahmen um das Erkennungsergebnis an sich deutlich zu verbessern. Aber Achtung ! Ein Wörterbuch auf Tesseract Ebene schränkt die Erkennungsergebnisse weitgehend ein. Das wirkt wie eine Whitelist.

Wie soll ich z.b: Aus "Autm0bll" ein "Automobil" machen ...
Indem Du eine Liste der erlaubten Wörter aufstellst, ein Maß für die Abweichung zwischen zwei Wörtern definierst. (Beispielsweise 0-1 wobei 0 keine Übereinstimmung und 1 eine max. Übereinstimmung bedeutet). Dein gefundenes Wort mit dieser Liste vergleichst, und das Paar mit der kleinsten Abweichung ermittelst. Ist die Abweichung in einem Rahmen den Du noch erlaubst nimmst du den gefundenen wert her, ist die Abweichung zu groß dann hast Du Müll.

Die üblichen "Ähnlichkeitsmaße" sind bei OCR Daten übrigens meistens nicht so toll, da es sich nicht um Tippfehler (wie bei Levenstein) oder phoenetisch gleiche Begriffe (wie bei Müller und Mueller) sondern um visuelle Ähnlichkeiten handelt. Unter den Standard-Algorithmen ist der Jaro Winkler / Dice noch am besten geeignet, oder Du arbeitest mit Homoglyph Tabellen. Eine kleine Hilfe ist vielleicht das Nachfolgende (den größten Teil aus [4] entnommen)

[SOURCE]

uses
SysUtils, Math;

type
TBigram = string[2];
TBigrams = array of TBigram;


function TokenizeString(Str: String; IgnoreCase: Boolean): TBigrams;
var
i : Integer;
l : Integer;
begin
i:=0;
l:=Length(Str);

if IgnoreCase then
Str:=AnsiUpperCase(Str);

SetLength(Result, Ceil(l/2));

if l=0 then
Exit;

while i<=High(Result) do
begin
Result[i]:=TBigram(copy(Str, (2*i)+1, 2));
inc(i);
end;
end;

function StringSimilarityRatio(const Str1, Str2: String; IgnoreCase: Boolean): Double;
var
commonTerms: Integer;
Bigrams1,
Bigrams2 : TBigrams;
idx : Integer;
begin
commonTerms:=0;
Bigrams1:=TokenizeString(Str1, IgnoreCase);
Bigrams2:=TokenizeString(Str2, IgnoreCase);

for idx := 0 to Min(High(Bigrams1), High(Bigrams2)) do
begin
if Bigrams1[idx]=Bigrams2[idx] then
Inc(commonTerms);
end;

Result:=2 * commonTerms / (Length(Bigrams1) + Length(Bigrams2));
end;

// Beispiel wie du das einbauen kannst.

function CheckDict (const searchFor : String; Dictionary : TStrings; var s : String ) : Double;
var i : Integer;
r : String;
d : Double;
begin
result := 0.0;
s := '';
for i := 0 to Dictionary.Count-1 do
begin
d := StringSimilarityRatio(dictionary[i],searchFor);
if d>result then
begin
s := dictionary[i];
result := d;
end;
end;
end;

[/SOURCE]


Und: Es sind viele Familiennamen und Regions-namen in den Texten - die findet man nicht in einer Wörterbuchliste - und die sind eigentlich meine wichtigsten Indikatoren
[/QUOTE]

Die Arbeit die Listen zu erstellen nimmt die aber niemand ab. Sind ja nur ganz normale Textdateien, und Material findest Du im Internet zu hauf [5][6] und viele mehr.

cu Ha-Jö

[1] https://github.com/tesseract-ocr/tes...ImproveQuality
[2] http://stackoverflow.com/questions/2...seract-library
[3] https://mazira.com/blog/optimal-imag...-tesseract-ocr
[4] https://github.com/chaosben/theunkno...ringSimilarity
[5] http://www.namepedia.org/de/lastname/
[6] http://www.namenforschung.net/dfd/woerterbuch/liste/
[7] https://gedbas.genealogy.net/names/list
  Mit Zitat antworten Zitat
Benutzerbild von erich.wanker
erich.wanker

Registriert seit: 31. Jan 2008
Ort: im schönen Salzburger Land
454 Beiträge
 
Delphi XE4 Professional
 
#13

AW: Text bereinigen: kurze Wörter löschen

  Alt 18. Mai 2017, 09:23
Hallo und schöne Grüße aus dem Salzburger-Land

VIELEN DANK für die Infos !


Zitat:
Tesseract kann das eigentlich deutlich besser. Wie verwendest Du Tesseract denn, über die Kommandozeile oder als DLL mit der CAPI?
Via Kommandozeile zuerst:

RunProcess(MainForm.datenpfad+'ghostscript\bin\gswin32c.exe -dNOPAUSE -sDEVICE=tiffgray -r300x300 -dBATCH -sPAPERSIZE=a4 -sOutputFile='+tiffname+'Image-%d.tiff '+destname , SW_MINIMIZE, false, ProcID);
Danach:

RunProcess(exepfad+'tesseract\tesseract.exe '+quelle+' '+ziel+' -l deu' , SW_MINIMIZE, true, ProcID);
Die "StringSimilarityRatio" werd ich mir am Wochenende genauer anschauen

Vielen Dank
Erich
Erich Wanker - for life:=1971 to lebensende do begin ..
O
/H\
/ \
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz