[PowerShell] Analyse morphologique avec SudachiPy

J'ai trouvé une merveilleuse analyse morphologique appelée SudachiPy, alors j'ai essayé de l'appeler à partir de mon PowerShell habituel.

Le produit fini

202006212144302.png

Si vous redirigez une chaîne, elle renverra la chaîne que vous avez entrée dans la propriété line et l'objet avec le résultat de l'analyse dans la propriété parsd.

code

La structure est que le processus d'analyse principal est écrit en Python et appelé depuis PowerShell. Il est également possible d'utiliser des arguments de ligne de commande et une sortie standard avec print pour l'entrée et la sortie des chaînes de caractères, mais comme il y a les problèmes suivants, nous utiliserons des fichiers temporaires.

Traitement côté Python

Si vous obtenez Python via Scoop, il sera plus facile de bien gérer le chemin qui l'entoure. Comme préparation préliminaire, installez SudachiPy et fire avec pip.

pip install sudachipy
pip install fire

Le processus "d'analyse morphologique du contenu d'un fichier texte ligne par ligne et de sortie du résultat dans un autre fichier texte" est rassemblé dans une fonction et transformé en un outil cli avec fire.Fire ().

sudachi_tokenizer.py


import fire
import re
from sudachipy import tokenizer
from sudachipy import dictionary

def main(input_file_path, output_file_path, ignore_paren = False):
    tokenizer_obj = dictionary.Dictionary().create()
    mode = tokenizer.Tokenizer.SplitMode.C

    with open(input_file_path, "r", encoding="utf_8_sig") as input_file:
        all_lines = input_file.read()
    lines = all_lines.splitlines()

    json_style_list = []
    for line in lines:
        if not line:
            json_style_list.append({"line": "", "parsed": []})
        else:
            if ignore_paren:
                target = re.sub(r"\(.+?\)|\[.+?\]|(.+?)|[.+?]", "", line)
            else:
                target = line
            tokens = tokenizer_obj.tokenize(target, mode)
            parsed = []
            for t in tokens:
                surface = t.surface()
                pos = t.part_of_speech()[0]
                c_type = t.part_of_speech()[4]
                c_form = t.part_of_speech()[5]
                yomi = t.reading_form()
                parsed.append({"surface": surface, "pos": pos, "yomi": yomi, "c_type": c_type, "c_form": c_form})
            json_style_list.append({"line": line, "parsed": parsed})
    with open(output_file_path, mode = "w", encoding="utf_8_sig") as output_file:
        output_file.write(str(json_style_list))

if __name__ == "__main__":
    fire.Fire(main)

Pour des raisons professionnelles, j'ai souvent sauté le paren rond () () et le crochet [] [] `, j'ai donc ajouté une option.

Le code de caractère du fichier d'entrée / sortie est joint à la nomenclature en raison des spécifications de PowerShell décrites plus loin.

Traitement côté PowerShell

Vous pouvez utiliser l'applet de commande à partir de la console en créant le fichier .ps1 suivant dans le même répertoire que sudachi_tokenizer.py ci-dessus et en le lisant à partir de $ PROFILE.

function Invoke-SudachiTokenizer {
    param (
        [switch]$ignoreParen
    )

    $outputTmp = New-TemporaryFile
    $inputTmp = New-TemporaryFile
    $input | Out-File -Encoding utf8 -FilePath $inputTmp.FullName #Avec BOM

    $sudachiPath = "{0}\sudachi_tokenizer.py" -f $PSScriptRoot
    $command = 'python -B "{0}" "{1}" "{2}"' -f $sudachiPath, $inputTmp.FullName, $outputTmp.FullName
    if ($ignoreParen) {
        $command += ' --ignore_paren=True'
    }

    Invoke-Expression -Command $command
    $parsed = Get-Content -Path $outputTmp.FullName -Encoding UTF8

    @($inputTmp, $outputTmp) | Remove-Item #Nettoyer manuellement les fichiers temporaires

    return ($parsed | ConvertFrom-Json)
}

Si vous combinez des types de dictionnaire dans une liste en Python, il aura le même format qu'un tableau au format json, vous pouvez donc le convertir en objet avec ConvertFrom-Json dans PowerShell.

Comme je l'ai écrit dans le commentaire, il est important de noter que si vous spécifiez UTF8 dans le paramètre -encoding de PowerShell, la nomenclature est automatiquement ajoutée.

Recommended Posts

[PowerShell] Analyse morphologique avec SudachiPy
[Python] Analyse morphologique avec MeCab
Text mining avec Python ① Analyse morphologique
J'ai joué avec Mecab (analyse morphologique)!
Python: analyse morphologique simplifiée avec des expressions régulières
Classer les publications Qiita sans analyse morphologique avec Tweet2Vec
Analyse de données avec python 2
Analyse du panier avec Spark (1)
Analyse de dépendance avec CaboCha
Analyse vocale par python
Analyse dynamique par Valgrind
Effectuer une analyse de régression avec NumPy
Analyse de données avec Python
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Collecte d'informations sur Twitter avec Python (analyse morphologique avec MeCab)
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Python: texte japonais: analyse morphologique
Analyse de régression multiple avec Keras
Environnement Venv avec Windows PowerShell
Analyse des émotions par Python (word2vec)
Analyse de texture apprise avec la pyradiomique
Traitement du langage naturel 1 Analyse morphologique
Analyse de squelette planaire avec Python
Analyse des secousses musculaires avec Python
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
Analyse des émotions par SMS avec ML-Ask
De l'introduction de JUMAN ++ à l'analyse morphologique du japonais avec Python
Activez l'environnement virtuel d'Anaconda avec PowerShell
Analyse de la structure du squelette en trois dimensions avec Python
Analyse d'impédance (EIS) avec python [impedance.py]
100 coups de traitement du langage 2020: Chapitre 4 (analyse morphologique)
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
Pour utiliser virtualenv avec PowerShell
Analyse des composants principaux avec Spark ML
■ [Google Colaboratory] Utiliser l'analyse morphologique (janome)
Analyse de données à partir de python (visualisation de données 1)
Analyse de régression logistique Self-made avec python
Analyse de données à partir de python (visualisation de données 2)
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
Hit API ERS d'ISE avec PowerShell
De la préparation à l'analyse morphologique avec python en utilisant polyglotte au marquage des mots partiels
[Jouons avec Python] Viser la génération automatique de phrases ~ Effectuer une analyse morphologique ~