Automatische Groß- und Kleinschreibung von Texten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Michael Vogel
Beiträge: 72
Registriert: 16.03.2006 11:20

Automatische Groß- und Kleinschreibung von Texten

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag von Derren »

Da wirst du um einen Vergleich mit einem Wörterbuch nicht drum rum kommen.
Signatur und so
Sommertv
Beiträge: 68
Registriert: 26.04.2019 10:31
Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
Wohnort: Mühldorf am Inn

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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. :)
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Michael Vogel
Beiträge: 72
Registriert: 16.03.2006 11:20

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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...
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Automatische Groß- und Kleinschreibung von Texten

Beitrag 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/
Antworten