Ich habe eine Textdatei. Ich brauche eine Liste von Sätzen.
Wie kann dies umgesetzt werden? Es gibt viele Feinheiten, z. B. einen Punkt, der in Abkürzungen verwendet wird.
Mein alter regulärer Ausdruck funktioniert schlecht:
re.compile('(\. |^|!|\?)([A-Z][^;↑\.<>@\^&/\[\]]*(\.|!|\?) )',re.M)
Antworten:
Das Natural Language Toolkit ( nltk.org ) bietet alles, was Sie brauchen. Diese Gruppenbuchung zeigt an, dass dies der Fall ist:
(Ich habe es nicht versucht!)
quelle
nltk .tokenize.punkt.PunktSentenceTokenizer
.nltk.download()
zuerst ausführen und Modelle herunterladen ->punkt
'This fails on cases with ending quotation marks. If we have a sentence that ends like "this." This is another sentence.'
und meine Ausgabe ist['This fails on cases with ending quotation marks.', 'If we have a sentence that ends like "this."', 'This is another sentence.']
Scheint für mich richtig.Diese Funktion kann den gesamten Text von Huckleberry Finn in etwa 0,1 Sekunden in Sätze aufteilen und behandelt viele der schmerzhafteren Randfälle, die das Parsen von Sätzen nicht trivial machen, z. B. " Mr. John Johnson Jr. wurde in den USA geboren, hat aber seinen Doktortitel erworben. D. in Israel, bevor er als Ingenieur zu Nike Inc. kam. Er arbeitete auch als Business Analyst bei craigslist.org. "
quelle
prefixes = "(Mr|St|Mrs|Ms|Dr|Prof|Capt|Cpt|Lt|Mt)[.]"
,websites = "[.](com|net|org|io|gov|me|edu)"
undif "..." in text: text = text.replace("...","<prd><prd><prd>")
Anstatt Regex zum Aufteilen des Textes in Sätze zu verwenden, können Sie auch die nltk-Bibliothek verwenden.
Ref: https://stackoverflow.com/a/9474645/2877052
quelle
for sentence in tokenize.sent_tokenize(text): print(sentence)
Sie können versuchen, Spacy anstelle von Regex zu verwenden. Ich benutze es und es macht den Job.
quelle
Hier ist ein Ansatz mitten auf der Straße, der nicht auf externen Bibliotheken beruht. Ich verwende das Listenverständnis, um Überlappungen zwischen Abkürzungen und Terminatoren auszuschließen sowie um Überlappungen zwischen Variationen von Terminierungen auszuschließen, zum Beispiel: '.' '. "'
Ich habe die Funktion find_all von Karl aus diesem Eintrag verwendet: Finde alle Vorkommen eines Teilstrings in Python
quelle
...
und?!
.In einfachen Fällen (in denen Sätze normal beendet werden) sollte dies funktionieren:
Der
*\. +
reguläre Ausdruck entspricht einem Punkt, der links von 0 oder mehr Leerzeichen und rechts von 1 oder mehr Leerzeichen umgeben ist (um zu verhindern, dass so etwas wie der Punkt in re.split als Satzänderung gezählt wird).Natürlich nicht die robusteste Lösung, aber in den meisten Fällen reicht es aus. Der einzige Fall, der hier nicht behandelt wird, sind Abkürzungen (vielleicht die Liste der Sätze durchgehen und prüfen, ob jede Zeichenfolge
sentences
mit einem Großbuchstaben beginnt?)quelle
SyntaxError: EOL while scanning string literal
und zeigt auf die schließende Klammer (nachtext
). Der Regex, auf den Sie in Ihrem Text verweisen, ist in Ihrem Codebeispiel nicht vorhanden.r' *[\.\?!][\'"\)\]]* +'
Sie können die Satz-Tokenisierungsfunktion auch in NLTK verwenden:
quelle
@Artyom,
Hallo! Mit dieser Funktion können Sie einen neuen Tokenizer für Russisch (und einige andere Sprachen) erstellen:
und dann nenne es so:
Viel Glück, Marilena.
quelle
Kein Zweifel, dass NLTK für diesen Zweck am besten geeignet ist. Der Einstieg in NLTK ist jedoch ziemlich schmerzhaft (aber sobald Sie es installiert haben, ernten Sie einfach die Belohnungen)
Hier finden Sie einfachen rebasierten Code unter http://pythonicprose.blogspot.com/2009/09/python-split-paragraph-into-sentences.html
quelle
Ich musste Untertiteldateien lesen und sie in Sätze aufteilen. Nach der Vorverarbeitung (wie dem Entfernen von Zeitinformationen usw. in den .srt-Dateien) enthielt die Variable fullFile den vollständigen Text der Untertiteldatei. Der folgende grobe Weg teilte sie ordentlich in Sätze auf. Wahrscheinlich hatte ich Glück, dass die Sätze immer (richtig) mit einem Leerzeichen endeten. Versuchen Sie dies zuerst und fügen Sie, wenn es Ausnahmen gibt, weitere Checks and Balances hinzu.
Oh! Gut. Mir ist jetzt klar, dass ich, da mein Inhalt Spanisch war, nicht die Probleme hatte, mit "Mr. Smith" usw. umzugehen. Dennoch, wenn jemand einen schnellen und schmutzigen Parser will ...
quelle
Ich hoffe, dies wird Ihnen bei lateinischen, chinesischen und arabischen Texten helfen
quelle
Ausgabe:
Quelle: https://www.geeksforgeeks.org/nlp-how-tokenizing-text-sentence-words-works/
quelle