Wenn ich Mecab mit Python verwende, muss ich verschiedene Dinge neu schreiben, wenn ich den Teiletext spezifizieren und frei schreiben möchte. Deshalb habe ich die Klasse selbst geschrieben, um die Unannehmlichkeiten zu beseitigen, und werde sie veröffentlichen.
import MeCab
import unicodedata
import re
class MecabParser():
def __init__(self, word_classes=None, word_class_details=None):
"""
Args:
word_classes (list, optional):Bestimmen Sie Teiltexte auf Japanisch. Defaults to None.
word_class_details (list, optional):Angabe der Details des Teiltextes. Defaults to None.
Unten finden Sie die von mecab definierten Teilwörter
https://taku910.github.io/mecab/posid.html
"""
self._word_classes = word_classes
self._word_class_details = word_class_details
def _format_text(self, text):
"""
Formatieren von Text vor dem Einfügen in MeCab
"""
text = re.sub(r'http(s)?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", text)
text = re.sub(r'[ -/:-@\[-~_]', "", text) #Symbol halber Breite
text = re.sub(r'[︰-@]', "", text) #Symbol in voller Breite
text = re.sub(r'\d', "", text) #Zahlen
text = re.sub('\n', " ", text) #Charakter brechen
text = re.sub('\r', " ", text) #Charakter brechen
return text
def parse(self, text, is_base=False):
text = self._format_text(text)
#Zeichencode-Konvertierungsprozess. Wenn nicht konvertiert, werden der Trübungspunkt und der Halbtrübungspunkt getrennt.
text = unicodedata.normalize('NFC', text)
result = []
tagger = MeCab.Tagger(
'-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
#Sie können Oberflächenlesefehler vermeiden, indem Sie einmal vor parseToNode analysieren
tagger.parse('')
nodes = tagger.parseToNode(text)
while nodes:
wclass = nodes.feature.split(',')
#Wenn kein Teil angegeben ist, werden alle getrennt
if not self._word_classes:
result.append(wclass[6] if is_base else nodes.surface)
nodes = nodes.next
continue
#Wenn der Teiletext nicht angegeben ist, werden alle Teile getrennt.
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
#Getrennt nach der detaillierten Spezifikation der Teiltexte
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
#Entfernen Sie die ersten und letzten leeren Zeichenfolgen
if len(result) > 0:
result.pop(0)
result.pop(-1)
return result
Ich speichere dies in einer Datei namens "parser.py" und benutze es. Das Gefühl des Gebrauchs ist wie folgt und es ist relativ einfach, Wörter durch Angabe des Teils zu teilen.
>>> from parser import MecabParser
>>> mp = MecabParser(word_classes=['Substantiv'], word_class_details=['Allgemeines','固有Substantiv'])
>>> text = 'Ich habe heute Hunger und bin gekommen, um eines der besten Ramen in der Nachbarschaft zu essen.'
>>> mp.parse(text)
['Bauch', 'Gegend', 'Ein Gegenstand auf der Welt', 'Ramen']
Das Wörterbuch verwendet mecab-ipadic-neologd, Wörter mit geänderten Endungen werden in ihrer ursprünglichen Form wiederhergestellt und der Text wird im Voraus formatiert, sodass ich hoffe, dass der Benutzer ihn nach seinen Wünschen ändern kann. Überlegen.
Recommended Posts