Worthäufigkeit eines Textes bestimmen

  • Hallo zusammen,
    ich bin gerade dabei ein Worthäufigkeitsbestimmungstool für Texte zu erstellen, mir fehlt aber noch eine gute Methode um die Häufigkeit zu bestimmen. :( Vielleicht weiß ja jemand eine(vlt. regex...) Hier mal das "Umfeld":

    Aktuelle Version:

    Spoiler anzeigen
    [autoit]

    #Include <GUIConstants.au3>
    #include <array.au3>
    #Region GUI
    $Form1 = GUICreate("Textworthäufigkeit Analysator 1.0.0", 338, 247, 193, 125)
    $Edit1 = GUICtrlCreateEdit("", 8, 8, 321, 209, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    $MenuDatei = GUICtrlCreateMenu("Datei")
    $MenuItem_laden = GUICtrlCreateMenuItem("Text laden...", $MenuDatei)
    $MenuItem4 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_analyse = GUICtrlCreateMenuItem("Analysieren...", $MenuDatei)
    $MenuItem5 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_as = GUICtrlCreateMenuItem("Auswertung speichern", $MenuDatei)
    $Quit = GUICtrlCreateMenuItem("Beenden", $MenuDatei)
    $MenuInfo = GUICtrlCreateMenu("&Info")
    $MenuItemUber = GUICtrlCreateMenuItem("Über...", $MenuInfo)
    GUISetState(@SW_SHOW)
    #EndRegion GUI

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $MenuItem_laden
    $pfad = FileOpen(FileOpenDialog("Bitte zu analsysierende Textdatei auswählen:", @MyDocumentsDir, "Textdatei (*.txt)"), 0)
    If $pfad <> -1 Then
    If MsgBox(64 + 4, "Meldung", "Die Textdatei wurde erfolgreich geladen. Soll zur Analyse fortgeschritten weren?") = 6 Then
    If GUICtrlRead($Edit1) <> "" Then
    If MsgBox(48 + 4, "Achtung!", "Ihre alte Auswertung wird gelöscht werden! Fortfahren?") = 6 Then Woerteranalyse(FileRead($pfad))
    Else
    Woerteranalyse(FileRead($pfad))
    EndIf
    EndIf
    Else
    MsgBox(32, "Meldung", "Das Laden der Textdatei ist fehlgechlagen")
    EndIf
    Case $msg = $MenuItemUber
    MsgBox(64, "Über...", "Programm Name: Textworthäufigkeit Analysator 1.0.0" & @CRLF & "Programm Version : 1.0.0" & @CRLF & @CRLF & "Autor: Vinschni")
    Case $msg = $MenuItem_analyse
    Woerteranalyse(FileRead($pfad))
    Case $msg = $MenuItem_as
    If Not GUICtrlRead($Edit1) = "" Then FileWrite(FileOpenDialog("Datei zum Speichern der Auswertung wählen:", @DesktopCommonDir, "Textdatei (*.txt)"), GUICtrlRead($Edit1))
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Quit
    ExitLoop
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Woerteranalyse($text)
    Dim $haeufigkeit
    Dim $i = 1
    $text = StringStripWS($text, 4)
    $text = StringStripCR($text)
    $wortarray = StringSplit($text, " ")
    While $i <= $wortarray[0]
    If StringInStr(GUICtrlRead($Edit1), $wortarray[$i]) = 0 Then
    $haeufigkeit = _getCountOf($text, $wortarray[$i])
    If $haeufigkeit > 1 Then GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & $wortarray[$i] & ": " & $haeufigkeit & @CRLF)
    EndIf
    $i = $i + 1
    WEnd
    EndFunc ;==>Woerteranalyse

    [/autoit] [autoit][/autoit] [autoit]

    Func _getCountOf($string, $search)
    Local $re = StringRegExp($string, $search, 3)
    If @error Then Return 0
    Return UBound($re)
    EndFunc ;==>_getCountOf

    [/autoit]


    edit: Update

    Mit freundlichem Gruß,

    Vinschni

    3 Mal editiert, zuletzt von Vinschni (20. Dezember 2007 um 20:13)

    • Offizieller Beitrag

    Hi,

    [autoit]

    Global $str = '100911 1191 23432432432432994111132133111'

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite(_getCountOf($str, '1') & @CRLF)
    ConsoleWrite(_getCountOf($str, '9') & @CRLF)
    ConsoleWrite(_getCountOf($str, 'a') & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite(_getCountOf1($str, '1') & @CRLF)
    ConsoleWrite(_getCountOf1($str, '9') & @CRLF)
    ConsoleWrite(_getCountOf1($str, 'a') & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func _getCountOf($string, $search)
    Local $re = StringRegExp($string, $search, 3)
    If @error Then Return 0
    Return UBound($re)
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _getCountOf1($string, $search)
    StringReplace($string, $search, $search, 0, 1)
    Return @extended
    EndFunc

    [/autoit]

    So long,

    Mega

  • Wenn Du die Häufigkeit eines Wortes in einem String bestimmen willst,
    könntest Du doch die Funktion "StringReplace" benutzen. In der Variablen
    "@extended"
    steht nach der Ausführung (laut der AutoIt-Hilfe) die Anzahl
    der Ersetzungen.

    Und wenn Du nichts ersetzen möchtest, ersetzt Du das gesuchte Wort
    durch sich selbst.

    Gruß
    Micha_he

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Ja,
    aber nur, wenn man weiß wie machen ;) (das "Pattern"-Zeug bei Regex hat mich verwirrt).

    Nun wird die Worthäufigkeit auch sortiert ausgegeben (vom meisten bis zu 2mal); und die Func ist integriert:

    Spoiler anzeigen
    [autoit]

    #Include <GUIConstants.au3>
    #include <array.au3>
    #Region GUI
    $Form1 = GUICreate("Textworthäufigkeit Analysator 1.0.0", 338, 247, 193, 125)
    $Edit1 = GUICtrlCreateEdit("", 8, 8, 321, 209, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    $MenuDatei = GUICtrlCreateMenu("Datei")
    $MenuItem_laden = GUICtrlCreateMenuItem("Text laden...", $MenuDatei)
    $MenuItem4 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_analyse = GUICtrlCreateMenuItem("Analysieren...", $MenuDatei)
    $MenuItem5 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_as = GUICtrlCreateMenuItem("Auswertung speichern", $MenuDatei)
    $Quit = GUICtrlCreateMenuItem("Beenden", $MenuDatei)
    $MenuInfo = GUICtrlCreateMenu("&Info")
    $MenuItemUber = GUICtrlCreateMenuItem("Über...", $MenuInfo)
    GUISetState(@SW_SHOW)
    #EndRegion GUI

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $MenuItem_laden
    $pfad = FileOpen(FileOpenDialog("Bitte zu analsysierende Textdatei auswählen:", @MyDocumentsDir, "Textdatei (*.txt)"), 0)
    If $pfad <> -1 Then
    If MsgBox(64 + 4, "Meldung", "Die Textdatei wurde erfolgreich geladen. Soll zur Analyse fortgeschritten weren?") = 6 Then
    If GUICtrlRead($Edit1) <> "" Then
    If MsgBox(48 + 4, "Achtung!", "Ihre alte Auswertung wird gelöscht werden! Fortfahren?") = 6 Then Woerteranalyse(FileRead($pfad))
    Else
    Woerteranalyse(FileRead($pfad))
    EndIf
    EndIf
    Else
    MsgBox(32, "Meldung", "Das Laden der Textdatei ist fehlgechlagen!")
    EndIf
    Case $msg = $MenuItemUber
    MsgBox(64, "Über...", "Programm Name: Textworthäufigkeit Analysator 1.0.0" & @CRLF & "Programm Version : 1.0.0" & @CRLF & @CRLF & "Autor: Vinschni")
    Case $msg = $MenuItem_analyse
    Woerteranalyse(FileRead($pfad))
    Case $msg = $MenuItem_as
    If Not GUICtrlRead($Edit1) = "" Then FileWrite(FileOpenDialog("Datei zum Speichern der Auswertung wählen:", @DesktopCommonDir, "Textdatei (*.txt)"), GUICtrlRead($Edit1))
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Quit
    ExitLoop
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Woerteranalyse($text)
    Dim $haeufigkeit
    Dim $i = 1
    $text = StringStripWS($text, 4)
    $text = StringStripCR($text)
    $wortarray = StringSplit($text, " ")
    Dim $h_array[1]
    While $i <= $wortarray[0]
    _ArrayAdd($h_array,UBound(StringRegExp($text, $wortarray[$i],3)))
    $i += 1
    WEnd
    Do
    $i = _ArrayMaxIndex($h_array,1,0)
    If $h_array[$i] = 1 Then ExitLoop
    If StringInStr(GUICtrlRead($Edit1), $wortarray[$i]) = 0 Then GUICtrlSetData($Edit1, GUICtrlRead($Edit1) & $wortarray[$i] & ": " & $h_array[$i] & @CRLF)
    $h_array[$i] = 0
    Until $wortarray[0] = 0
    MsgBox(64,"Meldung","Analyse abgeschlossen!",2)
    EndFunc ;==>Woerteranalyse

    [/autoit]

    Mit freundlichem Gruß,

    Vinschni

    • Offizieller Beitrag

    Entschuldigung, dass ich das so sagen muss, aber Dein Skript macht nicht das, was es sollte.

    Beispiel= 'Der Nachtwächter hatte verschlafen, weil er zuviel getrunken hatte.'

    Ergebnis= er: 4, hatte: 2, hatte.: 2

    Ich dachte auch erst, dass man das Problem am einfachsten mit StringRegExp angehen könnte, aber dann versuchte ich das mal anders. Rausgekommen ist das:

    Spoiler anzeigen
    [autoit]


    #Include <GUIConstants.au3>
    #include <array.au3>
    Global $pfad = ''
    #Region GUI
    $Form1 = GUICreate("Textworthäufigkeit Analysator 1.0.0", 338, 247, 193, 125)
    $Edit1 = GUICtrlCreateEdit("", 8, 8, 321, 209, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_READONLY, $ES_WANTRETURN, $WS_HSCROLL, $WS_VSCROLL))
    $MenuDatei = GUICtrlCreateMenu("Datei")
    $MenuItem_laden = GUICtrlCreateMenuItem("Text laden...", $MenuDatei)
    $MenuItem4 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_analyse = GUICtrlCreateMenuItem("Analysieren...", $MenuDatei)
    $MenuItem5 = GUICtrlCreateMenuItem("", $MenuDatei)
    $MenuItem_as = GUICtrlCreateMenuItem("Auswertung speichern", $MenuDatei)
    $Quit = GUICtrlCreateMenuItem("Beenden", $MenuDatei)
    $MenuInfo = GUICtrlCreateMenu("&Info")
    $MenuItemUber = GUICtrlCreateMenuItem("Über...", $MenuInfo)
    GUISetState(@SW_SHOW)
    #EndRegion GUI

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $MenuItem_laden
    $pfad = FileOpen(FileOpenDialog("Bitte zu analsysierende Textdatei auswählen:", @MyDocumentsDir, "Textdatei (*.txt)"), 0)
    If $pfad <> -1 Then
    $sText = FileRead($pfad)
    FileClose($pfad)
    If MsgBox(64 + 4, "Meldung", "Die Textdatei wurde erfolgreich geladen. Analyse durchführen?") = 6 Then
    If GUICtrlRead($Edit1) <> "" Then
    If MsgBox(48 + 4, "Achtung!", "Ihre alte Auswertung wird gelöscht werden! Fortfahren?") = 6 Then Woerteranalyse($sText)
    Else
    Woerteranalyse($sText)
    EndIf
    EndIf
    Else
    MsgBox(32, "Meldung", "Das Laden der Textdatei ist fehlgechlagen!")
    EndIf
    Case $msg = $MenuItemUber
    MsgBox(64, "Über...", "Programm Name: Textworthäufigkeit Analysator 1.0.0" & @CRLF & "Programm Version : 1.0.0" & @CRLF & @CRLF & "Autor: Vinschni")
    Case $msg = $MenuItem_analyse
    Woerteranalyse($sText)
    Case $msg = $MenuItem_as
    If Not GUICtrlRead($Edit1) = "" Then FileWrite(FileOpenDialog("Datei zum Speichern der Auswertung wählen:", @DesktopCommonDir, "Textdatei (*.txt)"), GUICtrlRead($Edit1))
    Case $msg = $GUI_EVENT_CLOSE Or $msg = $Quit
    ExitLoop
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Woerteranalyse($text)
    $text = StringRegExpReplace($text, "[':,.!?\x22]", ' '); alle Satzzeichen sowie Anführungszeichen in Leerzeichen umwandeln
    $text = StringStripWS($text, 4); doppelte Leerzeichen entfernen
    $text = StringStripCR($text); Zeilenumbrüche entfernen
    $wortarray = StringSplit($text, ' '); Text in einzelne Wörter aufsplitten
    Dim $haeufigkeit[UBound($wortarray)][2], $i = 1
    While $i < UBound($wortarray) - 1; Schleife so lange durchlaufen bis alle Wörter analysiert wurden
    $haeufigkeit[$i-1][0] = $wortarray[$i]; das zu analysierende Wort im Ausgabe-Array speichern
    $haeufigkeit[$i-1][1] = 1; Vorkommen dieses Wortes auf 1 sezten
    $j = $i + 1; Zählvariable auf das nächste Wort setzen
    While $j < UBound($wortarray) - 1; Schleife so lange durchlaufen bis alle folgenden Wörter analysiert wurden
    If $wortarray[$i] = $wortarray[$j] Then; Ist das nächste Wort ($j) gleich dem momentanen Wort ($i)
    _ArrayDelete($wortarray, $j); dann den Array-Eintrag löschen und
    $haeufigkeit[$i-1][1] += 1; das Vorkommen dieses Wortes um 1 erhöhen
    EndIf
    $j += 1; Schleifenzähler erhöhen
    WEnd
    $i += 1; Schleifenzähler erhöhen
    WEnd
    ReDim $haeufigkeit[$i-1][2]; Ausgabe-Array anpassen
    _ArraySort($haeufigkeit, 1, 0, 0, 2, 1); Array sortieren
    _ArrayDisplay($haeufigkeit); und ausgeben
    EndFunc

    [/autoit]

    So nebenbei habe ich noch das FileOpen-Problem behoben. :whistling:

  • Oscar Ich bin dir dankbar, das du es dir noch einmal genau angeschaut hast. Ich habe immer mit einem viel längeren Text gearbeitet, um gleichzeitig noch die Performance zu testen, so das mir lediglich auffiel das manche Wörter zweimal, einmal mit "." am Ende und einmal ohne verkommen, darüber hab ich mir aber weiter keine Gedanken gemacht :rolleyes: . Ich hab mir deine Methode jetzt noch mal genau angeschaut, und konnte ein paar Dinge über die Verwendung von 2dim Arrays und _ArraySort() lernen. Mir viel aber noch auf, das Klammern, Anführungszeichen, und » - Zeichen auch analysiert werden, und da sie mit manchen Worten zusammengezugen sind werden siese das falsch bestimmt. Wie könnte man die noch rauswerfen?

    Frohe Weihnachten euch,

    Vinschni

    PS: Das Fileopen-Problem, warum ist das eins? Ich handhabe es oft so. Wieso soll ich die Datei vorher öffnen, bevor ich sie benutze, wenn ich auch so reinschreiben kann? ( in dem Fall währe es ja auch nicht wichtig, ob die Datei zum Lesen oder Schreiben etc. geöffnet ist. Oder ist das einfach nur guter Stil?

    • Offizieller Beitrag
    Zitat

    PS: Das Fileopen-Problem, warum ist das eins? Ich handhabe es oft so. Wieso soll ich die Datei vorher öffnen, bevor ich sie benutze, wenn ich auch so reinschreiben kann? ( in dem Fall währe es ja auch nicht wichtig, ob die Datei zum Lesen oder Schreiben etc. geöffnet ist. Oder ist das einfach nur guter Stil?


    In erster Linie ist es guter Stil und andererseits hilft es dir (zumindest seh ich das so) den Überblick zu behalten was du gerade mit deinen Dateien treibst. :)
    Es stimmt schon, dass wir zur Zeit einen Mix von Funktionen haben, die FileOpen erfordern oder auch nicht. Und damit ich da nicht extra gucken muß ob es erforderlich ist oder nicht, verwende ich halt FileOpen und dann paßt's schon ;)