J'ai écrit une classe qui facilite l'écriture en spécifiant les paroles de la partie lors de l'utilisation de Mecab avec python

Lorsque j'utilise mecab avec python, je dois le réécrire de différentes manières lorsque je veux spécifier les paroles de la partie et écrire librement, alors j'ai écrit la classe moi-même pour éliminer les inconvénients, je vais donc la publier.

import MeCab
import unicodedata
import re


class MecabParser():
    def __init__(self, word_classes=None, word_class_details=None):
        """
        Args:
            word_classes (list, optional):Désigner les paroles des parties en japonais. Defaults to None.
            word_class_details (list, optional):Spécifier les détails des paroles de la partie. Defaults to None.

Voir ci-dessous les mots de pièces définis par mecab
        https://taku910.github.io/mecab/posid.html
        """
        self._word_classes = word_classes
        self._word_class_details = word_class_details

    def _format_text(self, text):
        """
Formatage du texte avant de le mettre dans MeCab
        """
        text = re.sub(r'http(s)?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
        text = re.sub(r'[ -/:-@\[-~_]', "", text)  #Symbole demi-largeur
        text = re.sub(r'[︰-@]', "", text)  #Symbole pleine largeur
        text = re.sub(r'\d', "", text)  #Nombres
        text = re.sub('\n', " ", text)  #Caractère de rupture
        text = re.sub('\r', " ", text)  #Caractère de rupture

        return text

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

        #Processus de conversion de code de caractère. S'il n'est pas converti, le point trouble et le point semi-trouble seront séparés.
        text = unicodedata.normalize('NFC', text)

        result = []
        tagger = MeCab.Tagger(
            '-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
        #Vous pouvez éviter les erreurs de lecture de surface en analysant une fois avant parseToNode
        tagger.parse('')

        nodes = tagger.parseToNode(text)
        while nodes:
            wclass = nodes.feature.split(',')
            #Si aucune partie n'est spécifiée, tout sera séparé
            if not self._word_classes:
                result.append(wclass[6] if is_base else nodes.surface)
                nodes = nodes.next
                continue

            #Si les paroles des parties ne sont pas spécifiées, toutes les parties sont séparées.
            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

            #Séparé selon les spécifications détaillées des paroles de la partie
            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

        #Supprimer les premières et dernières chaînes vides
        if len(result) > 0:
            result.pop(0)
            result.pop(-1)

        return result

Je sauvegarde ceci dans un fichier appelé parser.py et je l'utilise. Le sentiment d'utilisation est le suivant, et il est relativement facile de diviser les mots en spécifiant la partie.

>>> from parser import MecabParser
>>> mp =  MecabParser(word_classes=['nom'], word_class_details=['Général','固有nom'])
>>> text = 'J'ai faim aujourd'hui, alors je suis venu manger l'un des meilleurs ramen du quartier.'
>>> mp.parse(text)
['estomac', 'quartier', 'Un article au monde', 'ramen']

Le dictionnaire utilise mecab-ipadic-neologd, les mots avec des fins modifiées sont restaurés dans leur forme d'origine et le texte est formaté à l'avance, donc j'espère que l'utilisateur pourra le modifier à son goût. pense.

Recommended Posts

J'ai écrit une classe qui facilite l'écriture en spécifiant les paroles de la partie lors de l'utilisation de Mecab avec python
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
Fileinput, un module qui facilite l'écriture de programmes de filtrage de type Perl en Python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
J'ai créé un bot Discord en Python qui se traduit quand il réagit
Je veux colorer une partie de la chaîne Excel avec Python
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit une classe en Python3 et Java
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
J'ai créé un outil qui facilite un peu la création et l'installation d'une clé publique.
J'ai essayé d'utiliser une bibliothèque (fil conducteur) qui rend le package de threads Python plus facile à utiliser
Comment créer une instance d'une classe particulière à partir de dict en utilisant __new__ () en python
Une histoire qui facilite l'estimation de la surface habitable à l'aide d'Elasticsearch et de Python
Résumé des points à garder à l'esprit lors de l'écriture d'un programme qui s'exécute sur Python 2.5
J'ai écrit un code qui dépasse le taux de récupération de 100% dans la prédiction des courses de chevaux en utilisant LightGBM (partie 2)
Une histoire qui rend le débogage de modèle plus facile à voir dans l'environnement Django + SQLAlchemy
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Une histoire que je voulais faire quand j'ai eu une liste de sessions d'étude avec Python
[Python3] Liste des sites auxquels j'ai fait référence lorsque j'ai lancé Python
Quand j'ai essayé de gratter en utilisant des requêtes en python, j'étais accro à SSLError, donc un mémo de contournement
J'ai essayé de créer un site qui permet de voir facilement les informations mises à jour d'Azure
[Python] Le rôle de l'astérisque devant la variable. Divisez la valeur d'entrée et affectez-la à une variable
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Partie 1 J'ai écrit la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai écrit le code pour écrire le code Brainf * ck en python
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit un script pour extraire les liens de pages Web en Python
J'obtiens un attribut impossible à définir lors de l'utilisation de @property en python
Notez que je comprends l'algorithme du classificateur Naive Bayes. Et je l'ai écrit en Python.
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
J'ai créé une application Web en Python qui convertit Markdown en HTML
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
J'ai écrit un lecteur de corpus qui lit les résultats de l'analyse MeCab
J'ai essayé de développer un formateur qui génère des journaux Python en JSON
J'ai créé un outil qui facilite un peu la décompression avec CLI (Python3)
Un mémorandum parce que j'ai trébuché en essayant d'utiliser MeCab avec Python
Quand je retourne en utilisant le chainer, ça va un peu
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
Partie 1 J'ai écrit un exemple de la réponse au problème de référence de l'écriture hors ligne en temps réel en Python
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Notez que je comprends l'algorithme des moindres carrés. Et je l'ai écrit en Python.
J'ai fait un module en langage C qui filtre les images chargées par Python
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
Une histoire à laquelle j'étais accro après la communication SFTP avec python
J'ai créé une fonction pour récupérer les données de la colonne de base de données par colonne en utilisant sql avec sqlite3 de python [sqlite3, sql, pandas]
Lorsque j'essaie de partager avec Bert Japanese Tokenizer de Hugging Face, cela échoue avec l'initialisation de MeCab et aussi avec l'encodage.
Un mémo pour générer des variables dynamiques de classe à partir de données de dictionnaire (dict) qui n'ont que des données de type standard en Python3
Je veux créer une fenêtre avec Python
Quand j'essaye matplotlib en Python, il dit 'cairo.Context'
J'ai écrit "Introduction à la vérification des effets" en Python
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
Script Python qui explore le flux RSS du statut Azure et le publie sur Hipchat
Une histoire qui était pratique lorsque j'ai essayé d'utiliser le module d'adresse IP python