J'ai trouvé une merveilleuse analyse morphologique appelée SudachiPy, alors j'ai essayé de l'appeler à partir de mon PowerShell habituel.
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
.
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.
se produit lorsque l'on essaie d
imprimer` un caractère qui ne peut pas être représenté par CP932.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.
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