[PYTHON] 100 natürliche Sprachverarbeitung klopft Kapitel 6 Englische Textverarbeitung (erste Hälfte)

Eine Aufzeichnung zur Lösung der Probleme in der ersten Hälfte von Kapitel 6. Die Zieldatei ist nlp.txt, wie auf der Webseite gezeigt.

Führen Sie die folgende Verarbeitung für den englischen Text (nlp.txt) durch.

</ i> 50. Satzunterbrechung

(. Oder; oder: oder? Oder!) → Leerzeichen → Betrachten Sie das Muster des englischen Kapitals als Satzbegrenzer und geben Sie das Eingabedokument in Form eines Satzes pro Zeile aus.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

punt = re.compile(r"(?P<punt>[\.:;!\?]) (?P<head>[A-Z])")

if __name__ == "__main__":
    f = open('nlp.txt', 'r')
    for line in f:
        l = line.strip()
        # if punt.search(l):
            # print punt.sub(r"\g<punt>\n\g<head>", l)
        print punt.sub(r"\g<punt>\n\g<head>", l)
    f.close()

</ i> 51. Wörter ausschneiden

Behandeln Sie Leerzeichen als Wortumbrüche, nehmen Sie 50 Ausgaben als Eingabe und geben Sie sie in Form eines Wortes pro Zeile aus. Geben Sie jedoch am Ende der Anweisung eine Leerzeile aus.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

if __name__ == "__main__":
    f = open('nlp_line.txt', 'r')
    for line in f:
        l = line.strip()
        for word in l.split():
            print re.sub(r"\W", "", word)
        print ""
    f.close()

</ i> 52. Stemming

Nehmen Sie die Ausgabe> 51 als Eingabe, wenden Sie den Stemming-Algorithmus von Porter an und geben Sie Wörter und Stems in tabulatorgetrennten Formaten aus. In Python sollte das Stemming-Modul als Implementierung des Stemming-Algorithmus von Porter verwendet werden.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

from nltk.stem.porter import PorterStemmer

if __name__ == "__main__":
    f = open('nlp_word.txt')
    for line in f:
        stemmer = PorterStemmer()
        l = line.strip()
        if len(l) > 0:
            print "%s\t%s" % (l, stemmer.stem(l))
        else:
            print ""
    f.close()

53. Tokenization

Verwenden Sie Stanford Core NLP, um das Analyseergebnis des Eingabetextes im XML-Format zu erhalten. Lesen Sie auch diese XML-Datei und geben Sie den Eingabetext in Form eines Wortes pro Zeile aus.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

WORD = re.compile(r"<word>(\w+)</word>")

f = open('nlp.txt.xml', 'r')
for line in f:
    word = WORD.search(line.strip())
    if word:
        print word.group(1)
f.close()

Befehl zum Erstellen einer XML-Datei

Laden Sie Stanford Core NLP herunter und wechseln Sie in diesen Ordner. Führen Sie den folgenden Befehl aus.

java -Xmx5g -cp stanford-corenlp-3.6.0.jar:stanford-corenlp-models-3.6.0.jar:* edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,mention,coref -file nlp_line.txt -outputFormat xml

Aus irgendeinem Grund hat es auf zsh mit einem Fehler nicht funktioniert, also habe ich es auf bash ausgeführt.

</ i> 54. Tagging der Teilnahme

Lesen Sie das XML-Analyseergebnis von Stanford Core NLP und geben Sie Wörter, Deckspelzen und Teile in tabulatorgetrennten Formaten aus.

# -*- coding: utf-8 -*-
__author__ = 'todoroki'

import re

WORD = re.compile(r"<word>(\w+)</word>")
LEMMA = re.compile(r"<lemma>(\w+)</lemma>")
POS = re.compile(r"<POS>(\w+)</POS>")

f = open("nlp.txt.xml", "r")
words = []
for line in f:
    if len(words) == 3:
        print "\t".join(words)
        words = []
    else:
        line = line.strip()
        word = WORD.search(line)
        if len(words) == 0 and word:
            words.append(word.group(1))
            continue
        lemma = LEMMA.search(line)
        if len(words) == 1 and lemma:
            words.append(lemma.group(1))
            continue
        pos = POS.search(line)
        if len(words) == 2 and pos:
            words.append(pos.group(1))
f.close()

Recommended Posts