[Python] Remplacez le texte généré par MeCab par les mots importants extraits par MeCab + Term Extract.

en premier

J'ai lu l'article suivant sur l'extrait de terme. Utilisez termextract pour extraire les termes techniques des données conservées et créer un dictionnaire utilisateur pour mecab --Qiita

Lors de l'analyse morphologique, il est dit que si vous faites un dictionnaire de termes techniques qui résume des mots propres à l'industrie, il sera facile d'obtenir une bonne forme quand il est divisé, alors faites un dictionnaire utilisateur de mecab en utilisant termextract. Je l'ai fait.

Je voulais juste refléter le résultat d'extraction actuel et le vérifier, il ne suffit donc pas de sortir un dictionnaire ... C'est pourquoi j'ai créé une classe qui peut cracher une chaîne dans le même format que la sortie de MeCab.

environnement

Python 3.7.5 mecab-python 0.996.3 termextract 0.12b0

Comment utiliser

Crée un objet lors de la réception du résultat de `MeCab.parse () et renvoie une chaîne au même format que get.

main


import MeCab
text = "Tant que Rashomon est sur Suzaku Oji, en plus de cet homme, il y aura probablement quelques autres personnes, comme Ichimekasa et Koukara Hat, qui sont sous la pluie."

mecab = MeCab.Tagger()
mecab_text = mecab.parse(text)
    
#Passer le résultat de MeCab
TX = TermExtract(mecab_text)
extracted = TX.get_extracted_words()  #Extraire les mots importants
modified_text = TX.get_modified_mecab_text()  #Texte qui concatène des mots en fonction de mots importants

print(modified_text)

Résultat d'exécution


Rashomon substantif,Nom propre,Général,*,*,*,Rashomon,Rashomon,La Chaumont
Est un assistant,Assistant de cas,Général,*,*,*,Mais,Géorgie,Géorgie
, Symbole,Point de lecture,*,*,*,*,、,、,、
Suzaku Oji substantif,Général,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Un verbe,Indépendance,*,*,Cinq étapes, La ligne,Forme basique,y a-t-il,Al,Al
Nomenclature,Non indépendant,Avocat possible,*,*,*,c'est tout,Ijo,Ijo
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
, Symbole,Point de lecture,*,*,*,*,、,、,、
...

«Suzaku Oji» est divisé en «Suzaku» et «Oji» dans MeCab, mais ils sont concaténés car ils sont extraits en tant que mots consécutifs par extrait de terme.

Code source

Le tout est posté sur github. J'écrirai sur ce que j'ai codé à mon goût.

À propos de la connexion des éléments morphologiques

Lors de la concaténation de plusieurs éléments morphologiques, seul \ [système de surface, forme originale, lecture, prononciation ] est concaténé sous forme de chaîne de caractères. La raison pour ne pas combiner les autres avec des chaînes est d'éviter de créer de nouvelles parties telles que la "nomenclature". Si les chaînes ne sont pas combinées, la valeur du dernier mot à concaténer est adoptée.

my_termextract.py


def concat_morph(morphs):
    '''
Combinez plusieurs éléments morphologiques.
Combiner[Système de surface,Prototype,en train de lire,prononciation]seulement.
D'autres correspondent au dernier élément de la liste.
    
    Input:Liste de morphologie
    Output:Morphologie combinée
    '''
    import copy
    new_morph = list(copy.deepcopy(morphs[-1]))
    
    #Système de surface
    new_morph[0] = "".join(x[0] for x in morphs)
    #Prototype
    new_morph[7] = "".join(x[7] for x in morphs if x[7]!="*")
    #en train de lire
    new_morph[8] = "".join(x[8] for x in morphs if x[8]!="*")
    #prononciation
    new_morph[9] = "".join(x[9] for x in morphs if x[9]!="*")
    return tuple(new_morph)

Exemple

Suzaku substantif,Nom propre,zone,Général,*,*,Suzaku,Suzaku,Suzaku
Oji substantif,Général,*,*,*,*,Oji,Oji,Oji

Suzaku Oji substantif,Général,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji

À propos de la sélection des mots à connecter

Les «mots composés de deux mots ou plus» inclus dans «mots_extraits» sont ciblés. Fondamentalement, le résultat de termextract est stocké, mais s'il y a d'autres mots que vous voulez concaténer ou que vous ne voulez pas concaténer, vous pouvez le gérer en écrasant «mots_extractés».

my_termextract.py


for cmp_noun in self.extracted_words:
    #Acquisition du système de couche de surface
    surfaces, *_ = zip(*self.morphs)

    #Séparez avec un espace
    cmp_list = cmp_noun.split(" ")
    len_cmp = len(cmp_list)
    #Continuer si ce n'est pas un mot concaténé
    if len_cmp < 2:
        continue
            
    #Index mis en correspondance avec des mots concaténés
    match_indeces = [i for i in range(len(surfaces)-len_cmp+1) if surfaces[i:i+len_cmp]==tuple(cmp_list)]

À propos des paramètres d'extraction de termes

Je me réfère à l'article au début. Utilisez termextract pour extraire les termes techniques des données conservées et créer un dictionnaire utilisateur pour mecab --Qiita

my_termextract.py


#Extraire des mots composés et calculer leur importance
frequency = termextract.mecab.cmp_noun_dict(self.mecab_text)
LR = termextract.core.score_lr(frequency,
    ignore_words=termextract.mecab.IGNORE_WORDS,
    lr_mode=1, average_rate=1
    )
term_imp = termextract.core.term_importance(frequency, LR)

finalement

Je l'ai créé parce que je pensais que ce serait pratique si je pouvais l'utiliser en le branchant lorsque j'ai reçu le résultat de MeCab et implémenté le traitement ultérieur. Je pense qu'il peut être utilisé pour la confirmation pour le moment.

Page référencée

Utilisez termextract pour extraire les termes techniques des données conservées et créer un dictionnaire utilisateur pour mecab --Qiita

Recommended Posts

[Python] Remplacez le texte généré par MeCab par les mots importants extraits par MeCab + Term Extract.
Extraire le fichier xz avec python
Extraire les lignes qui correspondent aux conditions d'un fichier texte avec python
[Automation] Extraire le tableau en PDF avec Python
Comment effacer les caractères générés par Python
Extraire le tableau des fichiers image avec OneDrive et Python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
Utiliser mecab avec Python 3
Sauvegardez la sortie de GAN une par une ~ Avec l'implémentation de GAN par PyTorch ~
Pourquoi puis-je utiliser le module en important avec python?
[python] Décomposez la chronologie Twitter acquise en morphologie avec MeCab
Obtenez l'URL de destination du lien en spécifiant la phrase de texte avec le grattage Python (Beautiful Soup) + XPath