Seite 1 von 1

Automatische Groß- und Kleinschreibung von Texten

Verfasst: 30.01.2020 17:16
von Michael Vogel
Ich habe Unmengen an deutschen und englischen Buchtiteln etc. aus einer alten Datenbank, die alle in Großbuchstaben gespeichert sind. Diese sollen nun in "normale" Groß-/Kleinschreibung umgewandelt werden, damit am Ende nur noch ein paar Korrekturen notwendig sind.
Ein Ansatz wäre, eine Liste der am häufigsten verwendeten kleinzuschreibenden Wörter zu finden (der, die, das, the, ein, a, an, und, and,....), vielleicht gibt es aber eine bessere Idee?

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 30.01.2020 17:30
von NicTheQuick
Wenn du unterscheiden kannst, ob es Englisch oder Deutsch ist, wäre Englisch schon mal am einfachsten, da dort alles klein geschrieben wird, solange es kein Eigenname ist. Ansonsten würde ich behaupten, dass die Lösung mit eine Wortliste wohl am einfachsten und schnellsten zu implementieren ist, sodass du am Ende tatsächlich nur noch sehr wenige Korrekturen machen musst.

Unter Linux findest du Wortlisten meist auch vorinstalliert, z.B. habe ich eine Liste mit deutschen Wörtern in /usr/share/dict/ngerman mit 356008 Wörtern. Daneben gibt es auch die Dateien 'american-english' und 'british-english' für die englischen Wörter. Du solltest solche Wortlisten auch auf Github und Co finden können. Ein bisschen Googeln sollte schon helfen.

Du kannst dir auch ganze Dictionaries für den privaten Gebrauch laden: https://www1.dict.cc/translation_file_request.php?l=e
Oder Grundwortlisten: https://www1.ids-mannheim.de/kl/projekt ... erewo.html

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 30.01.2020 17:31
von Derren
Da wirst du um einen Vergleich mit einem Wörterbuch nicht drum rum kommen.

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 30.01.2020 19:23
von Sommertv
Auf der Linux Shell geht das so:

echo $string | tr '[:upper:]' '[:lower:]'
oder
echo $String | tr "[A-Z]" "[a-z]"
und mit sed
echo $foo | sed 's/./\u&/' (bzw \U für Grossbuchstaben)

Schöne Grüsse
Kurt

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 31.01.2020 02:31
von NicTheQuick
@Kurt: Das, hat aber weder mit Purebasic, noch mit der Lösung des Problems zu tun. Er will ja nicht einfach alles groß oder klein schreiben.

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 31.01.2020 07:30
von PureLust
Hallo Michael,

Ich hab mir gedacht, wenn Du schon Buchtitel umwandeln willst - warum dazu nicht den Buchtitel auf einer der Internet-Plattformen suchen und das Ergebnis mit Deinem Buchtitel abgleichen.

Ist also nicht unbedingt eine universelle Lösung für korrekte Groß-/Kleinschreibung, aber für Buchtitel ja vielleicht ganz gut geeignet. :wink:

Code: Alles auswählen

EnableExplicit
InitNetwork()
Global Check_Result, Check_AlternativeTitle$

#Q = Chr(34)  ; Anführungszeichen / Chicken Shit
#Check_NoEntry				= -1
#Check_ERROR				= 0
#Check_OK					= 1
#Check_AlternativeTitle	= 2

#SearchEngine_Amazon	= 1
#SearchEngine_Google	= 2
#SearchEngine_Thalia	= 3

Global NewList Buecher.s()
Global SearchEngine = #SearchEngine_Thalia

Procedure.s	HTML2Text(Text$, AuchZeilenumbrueche = #False)		; converts all HTML-Codes for German Umlaute into ASCii
	Text$ = ReplaceString(Text$, "ä", "ä")
	Text$ = ReplaceString(Text$, "ö", "ö")
	Text$ = ReplaceString(Text$, "ü", "ü")
	Text$ = ReplaceString(Text$, "Ä", "Ä")
	Text$ = ReplaceString(Text$, "Ö", "Ö")
	Text$ = ReplaceString(Text$, "Ü", "Ü")
	Text$ = ReplaceString(Text$, "ß","ß")
	Text$ = ReplaceString(Text$, "€", "€")
	Text$ = ReplaceString(Text$, "“", "'")
	Text$ = ReplaceString(Text$, "”", "'")
	Text$ = ReplaceString(Text$, "&", "&")
	If AuchZeilenumbrueche
		Text$ = ReplaceString(Text$, " ", Chr(160))
		Text$ = ReplaceString(Text$, "²", Chr(178))
		Text$ = ReplaceString(Text$, "<br />", #CR$)
		Text$ = ReplaceString(Text$, "</br>", #CR$)
		Text$ = ReplaceString(Text$, "<br>", #CR$)
	EndIf
	ProcedureReturn Text$
EndProcedure


Procedure LoadBookTitles()					; Hier wird als Beispiel eine CSV-Liste mit Büchertiteln aus dem Web geladen  (Quelle: https://antolin.westermann.de/all/info/titel-listen.jsp )
	
	Protected ActBook.s, LastBook.s, myBookList.s = GetTemporaryDirectory()+"myBookList.csv"
	
	If FileSize(myBookList) < 1			; Prüfen, ob Bücherliste ggfl. bereits heruntergeladen wurde (Read Only once, to minimize Traffic)
		ReceiveHTTPFile("https://antolin.westermann.de/all/downloads/antolingesamt-utf8.csv", myBookList)
	EndIf
	
	If ReadFile(0, myBookList, #PB_UTF8)
		ReadString(0)	; ignoriere erste Zeile (enthält nur Spaltentitel)
		While Not Eof(0)
			ActBook = ReadString(0)
			ActBook = UCase(StringField(ActBook,2,#Q+";"+#Q))		; Buchtitel filtern und in Gro0buchstaben umwandeln, um vorher/nachher Vergleich zu haben
			If ActBook <> LastBook
				AddElement(Buecher())
				Buecher() = ActBook
				LastBook = Buecher()
			EndIf
			
		Wend
		CloseFile(0)
	Else
		Debug "Keine Bücherliste gefunden"
		End
	EndIf
EndProcedure

Procedure.s CheckProduktName(ProduktName.s)
	Protected *Buffer, Search.s, Pos, Result.s, HTML.s
	Check_Result = #Check_ERROR
	
	Search = ReplaceString(ProduktName, " ", "+")			; Alle Leerzeichen durch "+" ersetzen, für Amazon-Suche
	
	If SearchEngine = #SearchEngine_Amazon					;---------------------  Search per Amazon  ------------------------------
		
		; removed
		
	ElseIf SearchEngine = #SearchEngine_Google			;--------------------  Google Suche  -----------------------------------------
		
		; removed
		
	ElseIf SearchEngine = #SearchEngine_Thalia			;--------------------  Thalia Suche  -----------------------------------------
		
		Search = ReplaceString(Search, #Q, "")
		Search = ReplaceString(Search, "++", "+")
		Search = ReplaceString(Search, "ä", "ae",#PB_String_NoCase)
		Search = ReplaceString(Search, "ö", "oe",#PB_String_NoCase)
		Search = ReplaceString(Search, "ü", "ue",#PB_String_NoCase)
		Search = ReplaceString(Search, "Ä", "AE",#PB_String_NoCase)
		Search = ReplaceString(Search, "Ö", "OE",#PB_String_NoCase)
		Search = ReplaceString(Search, "Ü", "UE",#PB_String_NoCase)
		Search = ReplaceString(Search, "ß", "ss",#PB_String_NoCase)
		
		*Buffer = ReceiveHTTPMemory("https://www.thalia.de/suche?filterPATHROOT=&sq="+Search)
		
		Repeat			; Dummy-Repeat um eine definierte Exit-Möglichkeit zu haben
			If *Buffer
				HTML.s = HTML2Text(PeekS(*Buffer, MemorySize(*Buffer), #PB_UTF8|#PB_ByteLength))		; Suchergebis von Talia Webseite abrufen
				FreeMemory(*Buffer)
			Else
				Break
			EndIf
			
			Pos = FindString(HTML, "<div class="+#Q+"productList socs_product_list"+#Q,1,#PB_String_NoCase)			; Position des Suchtextes einschränken um ungewollte Einträge auszuschließen
			Pos = FindString(HTML, "<div class="+#Q,Pos+100,#PB_String_NoCase)
			
			Pos = FindString(HTML, ProduktName, Pos, #PB_String_NoCase)
			If Pos > 0 And Pos < FindString(HTML,"<div class="+#Q+"socs_paginierung"+#Q+">")
				Result = Mid(HTML, FindString(HTML, ProduktName, Pos, #PB_String_NoCase), Len(ProduktName))
				Check_Result = #Check_OK
			EndIf
			
			; Erstes Suchergebnis filtern und als alternatives Ergebnis anbieten
			
			Define HTML_Tag.s = StringField(HTML, 2, "<div class="+#Q+"productList socs_product_list"+#Q)
			HTML_Tag.s = StringField(HTML_Tag, 2, "title="+#Q)
			HTML_Tag.s = StringField(HTML_Tag, 1, #Q)
			
			Check_AlternativeTitle$ = HTML_Tag
			
			If Len(Check_AlternativeTitle$) > 0 And Check_Result = #Check_ERROR
				Result = Check_AlternativeTitle$						; Wenn der exakte Titel zuvor nicht gefunden wurde, gebe alternativtitel zurück und setze Flag
				Check_Result = #Check_AlternativeTitle
			EndIf
			
		Until #True		; Ende des Dummy-Repeat
		
		If Check_Result = #Check_ERROR And FindString(HTML, "keine Treffer")
			Check_Result = #Check_NoEntry
		EndIf
		
	EndIf
	If Check_Result = #Check_ERROR	: Debug "Fehler bei Suche nach: "+Search : EndIf
	If Check_Result = #Check_NoEntry	: Debug "Kein Eintrag gefunden zu: "+ProduktName : EndIf
	
	ProcedureReturn Result
EndProcedure

AddElement(Buecher())
Buecher() = "Das Herz der Nation"

LoadBookTitles()

Define BookName.s, Row.s, Quit

OpenWindow(0,0,0,960,400,"Büchersuche per Amazon", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
ListIconGadget(0,0,0,960,400,"Such-Name", 300)
AddGadgetColumn(0,1,"Status",55)
AddGadgetColumn(0,2,"korigierter Name",200)
AddGadgetColumn(0,3,"alternativer Buchtitel",390)

SelectElement(Buecher(), 3975)		; Mit irgendeinem Buch anfangen
AddWindowTimer(0,0,2000)

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_Timer
			RemoveWindowTimer(0,0)
			
			BookName.s =  CheckProduktName(Buecher())		; Suchanfrage für ein Buch starten
			
			If Check_Result = #Check_OK									; Ergenis prüfen - #Check_OK bedeutet, der exakte Buchname wurde gefunden
				
			AddGadgetItem(0,#PB_Any,Buecher() + #LF$ + row + "ok" + #LF$ + BookName + #LF$ + Check_AlternativeTitle$)
				
			ElseIf Check_Result = #Check_AlternativeTitle			; #Check_AlternativeTitle bedeutet, das der exakte Name nicht gefunden werden konnte und statt dessen der erste angebotene Buchtitel zurückgegeben wurde.
				
			AddGadgetItem(0,#PB_Any,Buecher() + #LF$ + row + "alternativ" + #LF$ + #LF$ + Check_AlternativeTitle$)
				
			EndIf

			If NextElement(Buecher())  And CountGadgetItems(0) < 40			; Nächsten Abruf mit hilfe eines Timer-Events einleiten
				AddWindowTimer(0,0,100)
			EndIf
			
		Case #PB_Event_CloseWindow
			Quit = #True
	EndSelect
Until Quit
Für die Demo wird eine Bücher-Liste aus dem Internet herunter geladen und die Buchtitel in die Liste Buecher() eingetragen.
Hier müsstet Du statt dessen also Deine Titel einpflegen.

Über die globale Variable Check_Result kannst Du abfragen, ob Dein Buchtitel zu 100% gefunden (#Check_OK) wurde, oder ob statt dessen ein Alternativ-Titel zurück gegeben wurde (#Check_AlternativeTitle).

Hoffe Du kannst was damit anfangen. :)

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 31.01.2020 08:04
von Michael Vogel
Hey, danke für euren Input, mein Ziel ist jedenfalls eine (einigermaßen treffsichere) Offline-Lösung (auch wenn der Internetcheck für aktuelle Buchtitel schon sehr elegant ist).

Ganz so streng nehme ich es ohnehin nicht, zumal bei englischen (Lied-)Titeln auch viele Wörter groß geschrieben werden (https://grammar.yourdictionary.com/capi ... songs.html)...

Vielleicht reichen rund 100 Wörter pro Sprache, um ganz gute Ergebnisse zu liefern. Allein, ich habe bis jetzt nirgends eine Liste der am Häufigsten verwendeten Wörter gefunden...

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 31.01.2020 08:20
von PureLust
Michael Vogel hat geschrieben:Allein, ich habe bis jetzt nirgends eine Liste der am Häufigsten verwendeten Wörter gefunden...
Vielleicht kannst Du ja auch einfach die Bücher-Liste (die ich in meinem DemoCode herunter lade) als Referenz nehmen (Quelle).

Hier sind ja rund 96.000 Buchtitel drin - somit solltest Du also jede Menge Wörter zum vergleichen haben.

Re: Automatische Groß- und Kleinschreibung von Texten

Verfasst: 31.01.2020 11:06
von NicTheQuick
Michael Vogel hat geschrieben:Vielleicht reichen rund 100 Wörter pro Sprache, um ganz gute Ergebnisse zu liefern. Allein, ich habe bis jetzt nirgends eine Liste der am Häufigsten verwendeten Wörter gefunden...
Dann hast du nicht richtig gesucht. Bei mir war es nämlich der erste Treffer:
Deutsch: http://www.languagedaily.com/learn-germ ... rman-words
Englisch: https://1000mostcommonwords.com/1000-mo ... ish-words/