Ich habe den folgenden Artikel über Begriffsextrakt gelesen. Verwenden Sie termextract, um technische Begriffe aus gespeicherten Daten zu extrahieren und ein Benutzerwörterbuch für mecab --Qiita zu erstellen
Wenn Sie eine morphologische Analyse durchführen, ist es einfach, ein Fachwörterbuch zu erstellen, das branchenübliche Wörter so zusammenfasst, dass es bei der Aufteilung in einer guten Form vorliegt. Erstellen Sie daher ein Benutzerwörterbuch für Mecab mit termextract. Ich habe es gemacht.
Ich wollte nur das aktuelle Extraktionsergebnis widerspiegeln und es überprüfen, daher reicht es nicht aus, ein Wörterbuch auszugeben ... Aus diesem Grund habe ich eine Klasse erstellt, die einen String im selben Format wie die Ausgabe von MeCab ausspucken kann.
Python 3.7.5 mecab-python 0.996.3 termextract 0.12b0
Erstellt ein Objekt, während das Ergebnis von `MeCab.parse () empfangen wird, und gibt eine Zeichenfolge im gleichen Format wie get zurück.
main
import MeCab
text = "Solange Rashomon auf Suzaku Oji ist, gibt es neben diesem Mann wahrscheinlich noch ein paar Leute wie Ichimekasa und Koukara Hat, die im Regen sind."
mecab = MeCab.Tagger()
mecab_text = mecab.parse(text)
#Übergeben Sie das Ergebnis von MeCab
TX = TermExtract(mecab_text)
extracted = TX.get_extracted_words() #Extrahieren Sie wichtige Wörter
modified_text = TX.get_modified_mecab_text() #Text, der Wörter basierend auf wichtigen Wörtern verkettet
print(modified_text)
Ausführungsergebnis
Rashomon Substantiv,Eigenname,Allgemeines,*,*,*,Rashomon,Rashomon,La Chaumont
Ist ein Assistent,Fallassistent,Allgemeines,*,*,*,Aber,Ga,Ga
, Symbol,Lesepunkt,*,*,*,*,、,、,、
Suzaku Oji Substantiv,Allgemeines,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Ein Verb,Unabhängigkeit,*,*,Fünf Schritte, La Linie,Grundform,Gibt es,Al,Al
Nomenklatur,Nicht unabhängig,Anwalt möglich,*,*,*,das ist alles,Ijo,Ijo
Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
, Symbol,Lesepunkt,*,*,*,*,、,、,、
...
Suzaku Oji
wird in MeCab in Suzaku
und Oji
unterteilt, aber sie werden verkettet, weil sie durch Term-Extrakt als aufeinanderfolgende Wörter extrahiert werden.
Das Ganze ist auf github veröffentlicht. Ich werde darüber schreiben, was ich nach meinem Geschmack codiert habe.
Bei der Verkettung mehrerer morphologischer Elemente wird nur \ [Oberflächensystem, Originalform, Lesen, Aussprache ] als Zeichenfolge verkettet. Der Grund dafür, dass die anderen nicht mit Zeichenfolgen kombiniert werden, besteht darin, zu vermeiden, dass neue Teile wie die "Nomenklatur" erstellt werden. Wenn keine Zeichenfolge verkettet ist, wird der Wert des zuletzt zu verkettenden Wortes übernommen.
my_termextract.py
def concat_morph(morphs):
'''
Kombinieren Sie mehrere morphologische Elemente.
Kombinieren[Oberflächensystem,Prototyp,lesen,Aussprache]nur.
Andere stimmen mit dem letzten Element der Liste überein.
Input:Liste der Morphologie
Output:Kombinierte Morphologie
'''
import copy
new_morph = list(copy.deepcopy(morphs[-1]))
#Oberflächensystem
new_morph[0] = "".join(x[0] for x in morphs)
#Prototyp
new_morph[7] = "".join(x[7] for x in morphs if x[7]!="*")
#lesen
new_morph[8] = "".join(x[8] for x in morphs if x[8]!="*")
#Aussprache
new_morph[9] = "".join(x[9] for x in morphs if x[9]!="*")
return tuple(new_morph)
Suzaku Substantiv,Eigenname,Bereich,Allgemeines,*,*,Suzaku,Suzaku,Suzaku
Oji Nomen,Allgemeines,*,*,*,*,Oji,Oji,Oji
↓
Suzaku Oji Substantiv,Allgemeines,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji
"Wörter, die aus zwei oder mehr Wörtern bestehen", die in "extrahierten Wörtern" enthalten sind, werden als Ziel ausgewählt. Grundsätzlich wird das Ergebnis von termextract gespeichert, aber wenn es andere Wörter gibt, die Sie verketten möchten oder die Sie nicht verketten möchten, können Sie es behandeln, indem Sie "extrahierte_Wörter" überschreiben.
my_termextract.py
for cmp_noun in self.extracted_words:
#Erwerb eines Oberflächenschichtsystems
surfaces, *_ = zip(*self.morphs)
#Mit einem Leerzeichen trennen
cmp_list = cmp_noun.split(" ")
len_cmp = len(cmp_list)
#Fahren Sie fort, wenn kein verkettetes Wort vorhanden ist
if len_cmp < 2:
continue
#Index mit verketteten Wörtern abgeglichen
match_indeces = [i for i in range(len(surfaces)-len_cmp+1) if surfaces[i:i+len_cmp]==tuple(cmp_list)]
Ich beziehe mich auf den Artikel am Anfang. Verwenden Sie termextract, um technische Begriffe aus gespeicherten Daten zu extrahieren und ein Benutzerwörterbuch für mecab --Qiita zu erstellen
my_termextract.py
#Extrahieren Sie zusammengesetzte Wörter und berechnen Sie die Wichtigkeit
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)
Ich habe es erstellt, weil ich dachte, es wäre praktisch, wenn ich es verwenden könnte, indem ich es einstecke, wenn ich das Ergebnis von MeCab erhalte und die nachfolgende Verarbeitung implementiere. Ich denke, es kann vorerst zur Bestätigung verwendet werden.
Recommended Posts