J'ai lu l'article suivant sur l'extrait de terme. Utilisez termextract pour extraire les termes techniques des données conservées et créer un dictionnaire utilisateur pour mecab --Qiita
Lors de l'analyse morphologique, il est dit que si vous faites un dictionnaire de termes techniques qui résume des mots propres à l'industrie, il sera facile d'obtenir une bonne forme quand il est divisé, alors faites un dictionnaire utilisateur de mecab en utilisant termextract. Je l'ai fait.
Je voulais juste refléter le résultat d'extraction actuel et le vérifier, il ne suffit donc pas de sortir un dictionnaire ... C'est pourquoi j'ai créé une classe qui peut cracher une chaîne dans le même format que la sortie de MeCab.
Python 3.7.5 mecab-python 0.996.3 termextract 0.12b0
Crée un objet lors de la réception du résultat de `MeCab.parse () et renvoie une chaîne au même format que get.
main
import MeCab
text = "Tant que Rashomon est sur Suzaku Oji, en plus de cet homme, il y aura probablement quelques autres personnes, comme Ichimekasa et Koukara Hat, qui sont sous la pluie."
mecab = MeCab.Tagger()
mecab_text = mecab.parse(text)
#Passer le résultat de MeCab
TX = TermExtract(mecab_text)
extracted = TX.get_extracted_words() #Extraire les mots importants
modified_text = TX.get_modified_mecab_text() #Texte qui concatène des mots en fonction de mots importants
print(modified_text)
Résultat d'exécution
Rashomon substantif,Nom propre,Général,*,*,*,Rashomon,Rashomon,La Chaumont
Est un assistant,Assistant de cas,Général,*,*,*,Mais,Géorgie,Géorgie
, Symbole,Point de lecture,*,*,*,*,、,、,、
Suzaku Oji substantif,Général,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Un verbe,Indépendance,*,*,Cinq étapes, La ligne,Forme basique,y a-t-il,Al,Al
Nomenclature,Non indépendant,Avocat possible,*,*,*,c'est tout,Ijo,Ijo
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
, Symbole,Point de lecture,*,*,*,*,、,、,、
...
«Suzaku Oji» est divisé en «Suzaku» et «Oji» dans MeCab, mais ils sont concaténés car ils sont extraits en tant que mots consécutifs par extrait de terme.
Le tout est posté sur github. J'écrirai sur ce que j'ai codé à mon goût.
Lors de la concaténation de plusieurs éléments morphologiques, seul \ [système de surface, forme originale, lecture, prononciation ] est concaténé sous forme de chaîne de caractères. La raison pour ne pas combiner les autres avec des chaînes est d'éviter de créer de nouvelles parties telles que la "nomenclature". Si les chaînes ne sont pas combinées, la valeur du dernier mot à concaténer est adoptée.
my_termextract.py
def concat_morph(morphs):
'''
Combinez plusieurs éléments morphologiques.
Combiner[Système de surface,Prototype,en train de lire,prononciation]seulement.
D'autres correspondent au dernier élément de la liste.
Input:Liste de morphologie
Output:Morphologie combinée
'''
import copy
new_morph = list(copy.deepcopy(morphs[-1]))
#Système de surface
new_morph[0] = "".join(x[0] for x in morphs)
#Prototype
new_morph[7] = "".join(x[7] for x in morphs if x[7]!="*")
#en train de lire
new_morph[8] = "".join(x[8] for x in morphs if x[8]!="*")
#prononciation
new_morph[9] = "".join(x[9] for x in morphs if x[9]!="*")
return tuple(new_morph)
Suzaku substantif,Nom propre,zone,Général,*,*,Suzaku,Suzaku,Suzaku
Oji substantif,Général,*,*,*,*,Oji,Oji,Oji
↓
Suzaku Oji substantif,Général,*,*,*,*,Suzaku Oji,Suzaku Oji,Suzakuoji
Les «mots composés de deux mots ou plus» inclus dans «mots_extraits» sont ciblés. Fondamentalement, le résultat de termextract est stocké, mais s'il y a d'autres mots que vous voulez concaténer ou que vous ne voulez pas concaténer, vous pouvez le gérer en écrasant «mots_extractés».
my_termextract.py
for cmp_noun in self.extracted_words:
#Acquisition du système de couche de surface
surfaces, *_ = zip(*self.morphs)
#Séparez avec un espace
cmp_list = cmp_noun.split(" ")
len_cmp = len(cmp_list)
#Continuer si ce n'est pas un mot concaténé
if len_cmp < 2:
continue
#Index mis en correspondance avec des mots concaténés
match_indeces = [i for i in range(len(surfaces)-len_cmp+1) if surfaces[i:i+len_cmp]==tuple(cmp_list)]
Je me réfère à l'article au début. Utilisez termextract pour extraire les termes techniques des données conservées et créer un dictionnaire utilisateur pour mecab --Qiita
my_termextract.py
#Extraire des mots composés et calculer leur importance
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)
Je l'ai créé parce que je pensais que ce serait pratique si je pouvais l'utiliser en le branchant lorsque j'ai reçu le résultat de MeCab et implémenté le traitement ultérieur. Je pense qu'il peut être utilisé pour la confirmation pour le moment.
Recommended Posts