Ich habe eine Klasse geschrieben, die das Schreiben erleichtert, indem ich die Teiltexte spezifiziere, wenn ich Mecab mit Python verwende

Wenn ich Mecab mit Python verwende, muss ich verschiedene Dinge neu schreiben, wenn ich den Teiletext spezifizieren und frei schreiben möchte. Deshalb habe ich die Klasse selbst geschrieben, um die Unannehmlichkeiten zu beseitigen, und werde sie veröffentlichen.

import MeCab
import unicodedata
import re


class MecabParser():
    def __init__(self, word_classes=None, word_class_details=None):
        """
        Args:
            word_classes (list, optional):Bestimmen Sie Teiltexte auf Japanisch. Defaults to None.
            word_class_details (list, optional):Angabe der Details des Teiltextes. Defaults to None.

Unten finden Sie die von mecab definierten Teilwörter
        https://taku910.github.io/mecab/posid.html
        """
        self._word_classes = word_classes
        self._word_class_details = word_class_details

    def _format_text(self, text):
        """
Formatieren von Text vor dem Einfügen in MeCab
        """
        text = re.sub(r'http(s)?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
        text = re.sub(r'[ -/:-@\[-~_]', "", text)  #Symbol halber Breite
        text = re.sub(r'[︰-@]', "", text)  #Symbol in voller Breite
        text = re.sub(r'\d', "", text)  #Zahlen
        text = re.sub('\n', " ", text)  #Charakter brechen
        text = re.sub('\r', " ", text)  #Charakter brechen

        return text

    def parse(self, text, is_base=False):
        text = self._format_text(text)

        #Zeichencode-Konvertierungsprozess. Wenn nicht konvertiert, werden der Trübungspunkt und der Halbtrübungspunkt getrennt.
        text = unicodedata.normalize('NFC', text)

        result = []
        tagger = MeCab.Tagger(
            '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
        #Sie können Oberflächenlesefehler vermeiden, indem Sie einmal vor parseToNode analysieren
        tagger.parse('')

        nodes = tagger.parseToNode(text)
        while nodes:
            wclass = nodes.feature.split(',')
            #Wenn kein Teil angegeben ist, werden alle getrennt
            if not self._word_classes:
                result.append(wclass[6] if is_base else nodes.surface)
                nodes = nodes.next
                continue

            #Wenn der Teiletext nicht angegeben ist, werden alle Teile getrennt.
            if not self._word_class_details:
                if wclass[0] in self._word_classes:
                    result.append(wclass[6] if is_base else nodes.surface)
                    nodes = nodes.next
                    continue

            #Getrennt nach der detaillierten Spezifikation der Teiltexte
            if wclass[0] in self._word_classes and wclass[1] in self._word_class_details:
                result.append(wclass[6] if is_base else nodes.surface)
            nodes = nodes.next

        #Entfernen Sie die ersten und letzten leeren Zeichenfolgen
        if len(result) > 0:
            result.pop(0)
            result.pop(-1)

        return result

Ich speichere dies in einer Datei namens "parser.py" und benutze es. Das Gefühl des Gebrauchs ist wie folgt und es ist relativ einfach, Wörter durch Angabe des Teils zu teilen.

>>> from parser import MecabParser
>>> mp =  MecabParser(word_classes=['Substantiv'], word_class_details=['Allgemeines','固有Substantiv'])
>>> text = 'Ich habe heute Hunger und bin gekommen, um eines der besten Ramen in der Nachbarschaft zu essen.'
>>> mp.parse(text)
['Bauch', 'Gegend', 'Ein Gegenstand auf der Welt', 'Ramen']

Das Wörterbuch verwendet mecab-ipadic-neologd, Wörter mit geänderten Endungen werden in ihrer ursprünglichen Form wiederhergestellt und der Text wird im Voraus formatiert, sodass ich hoffe, dass der Benutzer ihn nach seinen Wünschen ändern kann. Überlegen.

Recommended Posts

Ich habe eine Klasse geschrieben, die das Schreiben erleichtert, indem ich die Teiltexte spezifiziere, wenn ich Mecab mit Python verwende
[Python] Ich habe einen Test von "Streamlit" geschrieben, der das Erstellen von Visualisierungsanwendungen erleichtert.
Fileinput, ein Modul, das das Schreiben von Perl-ähnlichen Filterprogrammen in Python erleichtert
Ich habe eine Klasse erstellt, um das Analyseergebnis von MeCab in ndarray mit Python zu erhalten
Ich habe in Python einen Discord-Bot erstellt, der übersetzt, wenn er reagiert
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe eine Klasse in Python3 und Java geschrieben
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Ich habe ein Tool erstellt, mit dem das Erstellen und Installieren eines öffentlichen Schlüssels etwas einfacher ist.
Ich habe versucht, eine Bibliothek (Common Thread) zu verwenden, die die Verwendung des Python-Threading-Pakets vereinfacht
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Eine Geschichte, die es einfach macht, den Wohnbereich mit Elasticsearch und Python abzuschätzen
Zusammenfassung der Punkte, die beim Schreiben eines Programms zu beachten sind, das unter Python 2.5 ausgeführt wird
Ich habe mit LightGBM einen Code geschrieben, der die Wiederherstellungsrate von 100% bei der Vorhersage von Pferderennen überschreitet (Teil 2).
Eine Geschichte, die das Debuggen von Modellen in der Django + SQLAlchemy-Umgebung einfacher macht
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Eine Geschichte, die ich machen wollte, als ich eine Liste von Lernsitzungen mit Python bekam
[Python3] Liste der Websites, auf die ich beim Starten von Python verwiesen habe
Als ich versuchte, mithilfe von Anforderungen in Python zu kratzen, war ich süchtig nach SSLError, also einem Workaround-Memo
Ich habe versucht, eine Site zu erstellen, mit der die aktualisierten Informationen von Azure einfach angezeigt werden können
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Teil 1 Ich habe die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
Bei Verwendung von @property in Python wird ein Attribut nicht festgelegt
Beachten Sie, dass ich den Algorithmus des maschinell lernenden Naive Bayes-Klassifikators verstehe. Und ich habe es in Python geschrieben.
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich habe einen Korpusleser geschrieben, der die Ergebnisse der MeCab-Analyse liest
Ich habe versucht, einen Formatierer zu entwickeln, der Python-Protokolle in JSON ausgibt
Ich habe ein Tool erstellt, das die Dekomprimierung mit CLI (Python3) etwas erleichtert.
Ein Memorandum, weil ich beim Versuch, MeCab mit Python zu verwenden, gestolpert bin
Wenn ich mit Chainer zurückkehre, passt es ein wenig
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
Teil 1 Ich habe ein Beispiel für die Antwort auf das Referenzproblem geschrieben, wie man in Python in Echtzeit offline schreibt
Verwenden Sie Ruby und Python, um die Wahrscheinlichkeit zu ermitteln, dass eine Karte mit einer natürlichen Zahl von 1 bis 100 ein Vielfaches von 3 und kein Vielfaches von 5 ist.
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Als ich versuchte, mit Python eine virtuelle Umgebung zu erstellen, funktionierte dies nicht
Beachten Sie, dass ich den Algorithmus der kleinsten Quadrate verstehe. Und ich habe es in Python geschrieben.
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich habe eine Funktion zum Abrufen von Daten aus der Datenbank spaltenweise mithilfe von SQL mit SQLite3 von Python [SQLite3, SQL, Pandas] erstellt.
Wenn ich versuche, mit Bert Japanese Tokenizer von Hugging Face zu teilen, schlägt dies beim Initialisieren von MeCab und auch beim Codieren fehl.
Ein Memo zum Generieren dynamischer Klassenvariablen aus Wörterbuchdaten (dict), die in Python3 nur Standardtypdaten enthalten
Ich möchte mit Python ein Fenster erstellen
Wenn ich matplotlib in Python versuche, heißt es'cairo.Context '.
Geschrieben "Einführung in die Effektüberprüfung" in Python
Ich habe einen japanischen Parser auf Japanisch mit Pyparsing geschrieben.
Python-Skript, das das Azure-Status-RSS crawlt und an Hipchat sendet
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden