Ich habe eine wunderbare morphologische Analyse namens SudachiPy gefunden und versucht, sie von meiner üblichen PowerShell aus aufzurufen.
Wenn Sie eine Zeichenfolge weiterleiten, wird die Zeichenfolge zurückgegeben, die Sie in der Eigenschaft line
eingegeben haben, und das Objekt mit dem Analyseergebnis in der Eigenschaft parsd
.
Die Struktur besteht darin, dass der Hauptanalyseprozess in Python geschrieben und von PowerShell aufgerufen wird.
Es ist auch möglich, Befehlszeilenargumente und Standardausgaben mit print
für die Eingabe und Ausgabe von Zeichenfolgen zu verwenden. Da jedoch die folgenden Probleme auftreten, werden temporäre Dateien verwendet.
Wenn Sie Python über Scoop erhalten, ist es einfacher, den Pfad um es herum gut zu handhaben. Installieren Sie als vorläufige Vorbereitung SudachiPy und fire mit pip
.
pip install sudachipy
pip install fire
Der Prozess des "zeilenweisen morphologischen Analysierens des Inhalts einer Textdatei und des Ausgebens des Ergebnisses in eine andere Textdatei" wird in einer Funktion zusammengefasst und mit "fire.Fire ()" zu einem CLI-Tool gemacht.
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)
Aus geschäftlichen Gründen habe ich oft den runden Paren ()
()
und die Klammer []
[]
übersprungen, also habe ich eine Option hinzugefügt.
Der Zeichencode der Eingabe- / Ausgabedatei wird aufgrund der später beschriebenen Spezifikationen von PowerShell an die Stückliste angehängt.
Sie können das Cmdlet von der Konsole aus verwenden, indem Sie die folgende ".ps1" -Datei im selben Verzeichnis wie die oben genannte "sudachi_tokenizer.py" erstellen und aus "$ PROFILE" lesen.
function Invoke-SudachiTokenizer {
param (
[switch]$ignoreParen
)
$outputTmp = New-TemporaryFile
$inputTmp = New-TemporaryFile
$input | Out-File -Encoding utf8 -FilePath $inputTmp.FullName #Mit Stückliste
$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 #Bereinigen Sie temporäre Dateien manuell
return ($parsed | ConvertFrom-Json)
}
Wenn Sie Wörterbuchtypen in Python zu einer Liste kombinieren, hat diese das gleiche Format wie ein Array im JSON-Format, sodass Sie es mit "ConvertFrom-Json" in PowerShell in ein Objekt konvertieren können.
Wie ich im Kommentar geschrieben habe, ist es wichtig zu beachten, dass Stücklisten automatisch hinzugefügt werden, wenn Sie UTF8 im Parameter "-encoding" von PowerShell angeben.
Recommended Posts