2017-04-03 5 views
0

Ich habe dieses Split Text into paragraphs NLTK - usage of nltk.tokenize.texttiling? gefunden, das erklärt, wie man einen Text in Texttilling einzieht, aber ich bin nicht fähig, einen Text, der durch Absatz-/Themaänderung symbolisiert wird, wie hier gezeigt unter texttiling http://www.nltk.org/api/nltk.tokenize.html zurückzubringen.Wie teile ich Text mit NLTK nltk.tokenize.texttiling in Absätze?

Wenn ich meinen Text in Texttiling füttere, bekomme ich den gleichen nicht-entorteten Text zurück, aber als eine Liste, die mir nichts nützt.

tt = nltk.tokenize.texttiling.TextTilingTokenizer(w=20, k=10,similarity_method=0, stopwords=None, smoothing_method=[0], smoothing_width=2, smoothing_rounds=1, cutoff_policy=1, demo_mode=False) 

    tiles = tt.tokenize(text) # same text returned 

Was ich E-Mails, die diese Grundstruktur

From: X 
    To: Y        (LOGISTICS) 
    Date: 10/03/2017 

    Hello team,      (INTRO) 

    Some text here representing 
    the body       (BODY) 
    of the text. 

    Regards,       (OUTRO) 
    X 

    *****DISCLAIMER*****    (POST EMAIL DISCLAIMER) 
    THIS EMAIL IS CONFIDENTIAL 
    IF YOU ARE NOT THE INTENDED RECIPIENT PLEASE DELETE THIS EMAIL 

folgen Wenn wir diese E-Mail-string s nennen, es ist wie

s = "From: X\nTo: Y\nDate: 10/03/2017 Hello team,\nSome text here representing the body of the text. Regards,\nX\n\n*****DISCLAIMER*****\nTHIS EMAIL IS CONFIDENTIAL\nIF YOU ARE NOT THE INTENDED RECIPIENT PLEASE DELETE THIS EMAIL" 

aussehen würde, was ich tun will Rückkehr diese 5 Abschnitte/Absätze von String s - LOGISTIK, INTRO, KÖRPER, OUTRO, POST EMAIL DISCLAIMER - getrennt so kann ich alles außer dem KÖRPER des t entfernen ext. Wie kann ich diese 5 Abschnitte separat mit nltk texttiling zurückgeben?

*** Nicht alle E-Mails folgen derselben Struktur oder haben den gleichen Wortlaut, daher kann ich keine regulären Ausdrücke verwenden.

Antwort

1

Wie wäre es mit splitlines? Oder musst du das nltk-Paket verwenden?

email = """ From: X 
    To: Y        (LOGISTICS) 
    Date: 10/03/2017 

    Hello team,      (INTRO) 

    Some text here representing 
    the body       (BODY) 
    of the text. 

    Regards,       (OUTRO) 
    X 

    *****DISCLAIMER*****    (POST EMAIL DISCLAIMER) 
    THIS EMAIL IS CONFIDENTIAL 
    IF YOU ARE NOT THE INTENDED RECIPIENT PLEASE DELETE THIS EMAIL""" 

y = [s.strip() for s in email.splitlines()] 

print(y) 
+0

Dank @MattR, aber mit dieser Methode muß ich manuell alle Zeilen vor der _m_'th Zeile löschen und alle Zeilen nach der _n_'th Linie, wo _m_ und _N_ für jede E-Mail variiert. Das scheint also nicht machbar. Ich muss nltk nicht verwenden, das Hauptziel ist nur alles zu löschen, außer der Körper Abschnitt – killerT2333

+0

@KillianTattan Nicht sicher, wie Sie den Körperabschnitt programmatisch identifizieren würden .. Wie Sie erwähnt, jede E-Mail wäre anders. Einige haben sogar mehr als einen BODY-Bereich. Mein einziger Gedanke wäre, ein statistisches Modell zu erstellen, um die Körperabschnitte zu identifizieren ... aber das würde etwas dauern. Hängt von der Schwere der Notwendigkeit ab. – MattR

+0

Ich könnte nach Zeilen aufteilen und naive Bayes verwenden, um jede Zeile zu klassifizieren und sie bei Bedarf zu entfernen, aber das würde zu viel Zeit in Anspruch nehmen. texttiling macht das schon viel raffinierter von dem, was ich verstehen kann. Ich muss nur die Funktion funktionieren! Danke für deine Hilfe @MarkR – killerT2333