Text-Segmentierung mit Automator

Totti1988

Neues Mitglied
Thread Starter
Dabei seit
14.01.2017
Beiträge
10
Reaktionspunkte
0
Liebe MacUser,

ich brauche wieder einmal eure Hilfe. Ich habe das folgende Problem. Ich arbeite derzeit mit Transkripten, wo ich 150-Wort-Absätze einfügen muss.

Beispiel:

<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart.
<P1> Was ist passiert?
..... usw.

Nun muss ich nach insgesamt 150 Wörtern einen Absatz einfügen oder alternativ eine Linie o.ä. Das Problem allerdings: "<P1>" und "<P2>" darf nicht mitgezählt werden. Kann man hierfür einen Dienst erstellen?

Im Netz findet man einige Skripte zum Zählen von Wörtern. Hat jemand von euch zufällig eine einfache Lösung dafür? Ich kenne mich mit AppleScript leider nicht aus.

Über jede Hilfe wäre ich unglaublich dankbar.

Lieben Gruß,
Totti
 
tell application "Microsoft Word"
activate
set newRange to (create range active document start 0 end 152)
insert paragraph at after newRange
insert paragraph at after newRange
end tell


Das war eine erste Idee, hier werden allerdings die characters gezählt und nicht die Wörter und ich gebe den Range an, d.h. nach dem ersten Absatz hört er auf.
 
Hallo,

was soll passieren, wenn das 150 Wort "Wochenende" wäre?
Steht "<P1>" etc. immer am Anfang einer Zeile?

Viele Grüße
 
Hey little_Pixel! Dann wird halt nach diesem Wort getrennt und ein Absatz gemacht - unabhängig davon, ob es mitten im Satz ist.
Ja, "<P1>" etc. steht immer am Anfang. Könnte man lösen, indem man sagt ab character 5 jeder line zählen. Das war meine Idee - leider bisher keine Lösung gefunden.
 
Hallo,

siehe unten…

Die Variable "maxWord" musst Du auf 150 Stellen.
Ich habe zum Test jedes dritte Wort genommen.

Viele Grüße

Code:
--

set theText to "<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart. 
<P1> Was ist passiert?
<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart. 
<P1> Was ist passiert?
<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart. 
<P1> Was ist passiert?
<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart. 
<P1> Was ist passiert?
<P1> Hallo, wie geht es Ihnen?
<P2> Danke, das Wochenende war hart. 
<P1> Was ist passiert?"

--

if (length of theText < 1) then
   
    return ""
   
end if

--

set AppleScript's text item delimiters to {linefeed, " "}

--

set theTextItems to text items of theText

if ((count of theTextItems) < 1) then
   
    return ""
   
end if

--

set theText to ""

set maxWord to 3

set nRepeat to 0

set nWord to 0

--

repeat with nTextItem in theTextItems
   
    -- 
   
    set nRepeat to nRepeat + 1
   
    --
   
    if (nTextItem begins with "<") then
       
        --
       
        if (theText does not end with return) then
           
            set theText to theText & return
           
        end if
       
        --
       
        set theText to theText & nTextItem
       
        --
       
    else if (length of nTextItem < 1) then
       
        --
       
        set theText to theText & " " & nTextItem
       
        --
       
    else
       
        --
       
        set theText to theText & " " & nTextItem
       
        --
       
        set nWord to nWord + 1
       
        --
       
        if (nWord mod maxWord is 0) then
           
            set theText to theText & return & "" & return
           
        end if
       
        --
       
    end if
   
    --
   
end repeat

--

repeat
   
    --
   
    if (theText begins with return) then
       
        --
       
        set theText to text 2 thru (length of theText) of theText
       
        --
       
    else
       
        --
       
        exit repeat
       
        --
       
    end if
   
    --
   
end repeat

--

repeat
   
    --
   
    if (theText ends with return) then
       
        --
       
        set theText to text 1 thru ((length of theText) - 1) of theText
       
       
        --
       
    else
       
        --
       
        exit repeat
       
        --
       
    end if
   
    --
   
end repeat

--

return theText

--
 
Hier mal eine Lösung für Haskell.

Code:
main :: IO ()
main = do
    content <- readFile "test.txt"
    writeFile "ergebnis.txt" (textManipulation content)

textManipulation :: String -> String
textManipulation text = output where
    myFun = (mySplit (numberOfWords + 1)) . words
    mySplit _ [] = ""
    mySplit n x = (unwords (take n x)) ++ "\n" ++ mySplit numberOfWords (drop n x)
    numberOfWords = 150
    output = concat . (map myFun) . lines $ text

Die Textzeilen liegen als reiner Text in der Datei test.txt. Das Ergebnis wird in die Datei ergebnis.txt geschrieben.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: xentric
Hier mal eine Lösung für Haskell.

:rotfl:


Den richtigen Smilie (angeblich heißt der "Tränen der Freude") finde ich leider nicht hier. Wie kann das eigentlich sein. Der Smilie war sogar Wort des Jahres oder so?

Weiter im Text: Ist Haskell standardmäßig unter OS X installiert sogar?
 
Weiter im Text: Ist Haskell standardmäßig unter OS X installiert sogar?

Nein, dafür ist es Opensource und unter allen gängigen Betriebsystemen installierbar. Wieso sollte ich für so eine Aufgabe eine OS-X-only Lösung wählen? Im Titel steht Automator, aber damit alleine wird es nicht gehen. Applescript kann der Threadersteller laut eigenen Angaben nicht, sprich er hat von einer Applescript-Lösung nur den Vorteil, dass er nichts zusätzlich installieren muss, dafür ist er aber an OS X gebunden.
 
Hier mal eine Lösung für Haskell.

Code:
main :: IO ()
main = do
    content <- readFile "test.txt"
    writeFile "ergebnis.txt" (textManipulation content)

textManipulation :: String -> String
textManipulation text = output where
    myFun = (mySplit (numberOfWords + 1)) . words
    mySplit _ [] = ""
    mySplit n x = (unwords (take n x)) ++ "\n" ++ mySplit numberOfWords (drop n x)
    numberOfWords = 150
    output = concat . (map myFun) . lines $ text

Die Textzeilen liegen als reiner Text in der Datei test.txt. Das Ergebnis wird in die Datei ergebnis.txt geschrieben.

Hey - vielen lieben Dank! Ich habe mir Haskell eben heruntergeladen und den Code ausprobiert. Ich erhalte die folgende Fehlermeldung:

Code:
Prelude> main :: IO ()
main = do
    content <- readFile "C:\Users\Totti\Desktop\T306.txt"
    writeFile "C:\Users\Totti\Desktop\ergebnis.txt" (textManipulation content)

textManipulation :: String -> String
textManipulation text = output where
    myFun = (mySplit (numberOfWords + 1)) . words
    mySplit _ [] = ""
    mySplit n x = (unwords (take n x)) ++ "\n" ++ mySplit numberOfWords (drop n x)
    numberOfWords = 150
    output = concat . (map myFun) . lines $ text

<interactive>:19:53: error:
    lexical error in string/character literal at character 'U'

Any ideas? Was mache ich falsch? Oder muss die txt-file in einer bestimmten Umgebung liegen?
 
Verrückte Welt dieses Internet… :D
 
  • Gefällt mir
Reaktionen: Olivetti
schau dir zuerst deine pfade an, bist du damit sicher? :p
 
Any ideas? Was mache ich falsch? Oder muss die txt-file in einer bestimmten Umgebung liegen?

Ganz einfach, speichere den Code in einer reinen Textdatei mit dem Namen datei.hs (du kannst sie nennen wie du willst, das Suffix zeigt dir, dass das eine Datei mit Haskell-Code ist). Lege diese Datei und die Textdatei mit dem Namen test.txt in einen Ordner. Dann öffnest du das Terminal und wechselst mit "cd" in den Ordner mit den beiden Dateien. Dann startest du mit "ghci" den Interpreter (hattest du ja bereits gemacht), lädst mit ":load datei.hs" deinen Code und führst ihn danach aus, indem du die main-Funktion ausführst (also einfach "main" eingeben und Enter). Dann solltest du in deinem Ordner die Textdatei ergebnis.txt finden mit dem Ergebnis.
 
Ganz einfach, speichere den Code in einer reinen Textdatei mit dem Namen datei.hs (du kannst sie nennen wie du willst, das Suffix zeigt dir, dass das eine Datei mit Haskell-Code ist). Lege diese Datei und die Textdatei mit dem Namen test.txt in einen Ordner. Dann öffnest du das Terminal und wechselst mit "cd" in den Ordner mit den beiden Dateien. Dann startest du mit "ghci" den Interpreter (hattest du ja bereits gemacht), lädst mit ":load datei.hs" deinen Code und führst ihn danach aus, indem du die main-Funktion ausführst (also einfach "main" eingeben und Enter). Dann solltest du in deinem Ordner die Textdatei ergebnis.txt finden mit dem Ergebnis.

Hey! Vielen lieben Dank, dass du dir die Mühe machst mir das genau zu erklären. Habe es mit deiner Hilfe auch zum Laufen gekriegt -leider liegt in Ergebnis.txt dann der gleiche Inhalt wie in test.txt - also es findet keine Segmentierung statt - schade!
 
Das würde mich überraschen. Bist du sicher, dass die Zeilen lang genug sind, also die Zeilen mehr als 150 Wörter enthalten? Das Beispiel aus dem ersten Post enthält beispielsweise nur 5, 5 und 3 (echte, d.h. ohne das <P1>) Wörter, dort wird also nicht getrennt. Wenn du Beispiele mit mehr als 150 Wörtern pro Zeile nimmst, werden neue Zeilen eingefügt. Alternativ kannst bei
"numberOfWords =" auch eine kleinere Zahl eintragen, beispielsweise 4, dann wirst du bei dem Beispiel aus dem ersten Post eine andere Ausgabe erhalten.
 
Das würde mich überraschen. Bist du sicher, dass die Zeilen lang genug sind, also die Zeilen mehr als 150 Wörter enthalten? Das Beispiel aus dem ersten Post enthält beispielsweise nur 5, 5 und 3 (echte, d.h. ohne das <P1>) Wörter, dort wird also nicht getrennt. Wenn du Beispiele mit mehr als 150 Wörtern pro Zeile nimmst, werden neue Zeilen eingefügt. Alternativ kannst bei
"numberOfWords =" auch eine kleinere Zahl eintragen, beispielsweise 4, dann wirst du bei dem Beispiel aus dem ersten Post eine andere Ausgabe erhalten.

Okay, vielen Dank! Das war dann ein Missverständnis.
Meine Transkript sind nach den oben genannten Prinzip aufgebaut. Und Zeilenübergreifend soll nach 250 Wörtern getrennt werden. Das heißt es findet ein Dialog zwischen zwei Personen statt, und nach insgesamt 250 Wörtern soll dann eine Leerzeile eingefügt werden. Das heißt, das Gespräch wird nach 250 Wörtern unterbrochen und dann geht quasi ein neuer Gesprächsteil los. Die 250 Wörter waren nicht nur auf eine Zeile bezogen. Sorry! Das ist sicherlich deutlich komplizierter.
 
Dann versuch es mal mit folgendem Code:

Code:
main :: IO ()
main = do
    content <- readFile "test.txt"
    writeFile "ergebnis.txt" (textManipulation content)

textManipulation :: String -> String
textManipulation text = output where
    filterFun :: String -> Int
    filterFun t
        | (head t == '<') && (last t == '>') = 0
        | otherwise = 1
    textWord = words text
    textIgnoreWord = map filterFun textWord
    numberOfWords = 250
    splitWords :: [String] -> [Int] -> Int -> String
    splitWords ts is n
                | (length ts) <= n = unwords ts
                | sum (take n is) == numberOfWords = (unwords first) ++ "\n\n" ++ splitWords second (drop n is) numberOfWords
                | otherwise = splitWords ts is (n + 1) where
                    (first, second) = splitAt n ts
    output = splitWords textWord textIgnoreWord numberOfWords
 
Dann versuch es mal mit folgendem Code:

Code:
main :: IO ()
main = do
    content <- readFile "test.txt"
    writeFile "ergebnis.txt" (textManipulation content)

textManipulation :: String -> String
textManipulation text = output where
    filterFun :: String -> Int
    filterFun t
        | (head t == '<') && (last t == '>') = 0
        | otherwise = 1
    textWord = words text
    textIgnoreWord = map filterFun textWord
    numberOfWords = 250
    splitWords :: [String] -> [Int] -> Int -> String
    splitWords ts is n
                | (length ts) <= n = unwords ts
                | sum (take n is) == numberOfWords = (unwords first) ++ "\n\n" ++ splitWords second (drop n is) numberOfWords
                | otherwise = splitWords ts is (n + 1) where
                    (first, second) = splitAt n ts
    output = splitWords textWord textIgnoreWord numberOfWords
Wow, wirklich vielen lieben Dank! Funktioniert wunderbar! Vielen Dank für deine Unterstützung und hilfreichen Erklärungen! Das ist nicht selbstverständlich!
 
Zurück
Oben Unten