[PYTHON] Trier la relation entre le lanceur Masaru Yamamoto et chaque équipe par janome et TF-IDF Cosine Similarity

Le janome présenté à PyCon 2015 est pratique. Je voudrais trier la relation entre le célèbre lanceur Masaru Yamamoto, qui a pris sa retraite cette année, et chaque équipe dans le texte de wikipedia.

Que faire cette fois

Extraire la nomenclature japonaise à l'aide de l'analyseur morphologique janome à partir du texte de wikipedia, et extraire le vecteur de caractéristiques avec TF-IDF. La similitude des entrées dans la plage de 0 à 1 peut être obtenue en produisant vers l'intérieur les vecteurs de caractéristiques de chaque article et en prenant cosθ. Triez les articles par similarité de phrases et vous avez terminé.

Où Janome est pratique

L'installation de mecab nécessite une dépendance à la version python et une installation supplémentaire du dictionnaire, il est donc difficile à construire. Janome, qui peut être installé avec pip, est pratique. Vous pouvez facilement contester lorsque vous avez besoin d'une analyse morphologique.

Essayez d'utiliser janome

pip install janome
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = """
Deux ans après avoir rejoint l'ère d'Hiroshima, il n'a pas germé et a été dépassé par les plus jeunes Tomonori Maeda et Satoshi Eto.
Le coup était si faible que l'entraîneur a dit à ce moment-là: "Roulez et utilisez vos jambes."
La défense du champ extérieur reçoit également le surnom de «meurtre mogura» en raison de la mauvaise habitude de lancer la balle lancée vers le sol....
"""
for token in t.tokenize(text):
     print(token)

------------------
Hiroshima substantif,Nom propre,zone,Général,*,*,Hiroshima,Hiroshima,Hiroshima
Nomenclature de période,Général,*,*,*,*,Âge,Jidai,Jidai
Rejoindre la nomenclature,Changer de connexion,*,*,*,*,Joindre,Nouveau Dan,Nouveau Dan
Après midi,suffixe,Avocat possible,*,*,*,arrière,Aller,Aller
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
2 nomenclature,nombre,*,*,*,*,*,*,*
Nomenclature annuelle,suffixe,Mots auxiliaires,*,*,*,Année,Nenkan,Nenkan
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
Bourgeon substantif,Général,*,*,*,*,Bourgeon,Moi,Moi
Est un assistant,Assistant de cas,Général,*,*,*,Mais,Géorgie,Géorgie
Verbe de sortie,Indépendance,*,*,Un pas,Forme imparfaite,Sortez,De,De
Zu verbe auxiliaire,*,*,*,Spécial,Connexion continue,Nu,Zu,Zu
, Symbole,Point de lecture,*,*,*,*,、,、,、
Nomenclature plus jeune,Général,*,*,*,*,plus jeune,Toshishita,Toshishita
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Maeda substantif,Nom propre,Nom d'une personne,Nom de famille,*,*,Maeda,Maeda,Maeda
Sagesse substantif,Nom propre,Nom d'une personne,Nom,*,*,Sagesse,Tomonori,Tomonori
Et des mots auxiliaires,Assistants parallèles,*,*,*,*,Ou,Ya,Ya
Eto substantif,Nom propre,Nom d'une personne,Nom de famille,*,*,Eto,Eto,Eto
Sagesse,Nom propre,Nom d'une personne,Nom,*,*,Satoshi,Satoshi,Satoshi
Nom,suffixe,Général,*,*,*,Et al.,La,La
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Dépassement ou verbe,Indépendance,*,*,Ligne Five-Dan / Ka,Forme imparfaite,Dépasser,Oinuka,Oinuka
...

Qu'est-ce que TF-IDF

L'idée est que si vous comptez le nombre de nomenclature dans une phrase, vous pouvez obtenir le vecteur caractéristique de la phrase. Contrairement à l'anglais, le japonais n'a pas d'espace blanc comme délimiteur, une analyse morphologique est donc nécessaire. En d'autres termes, janome, un analyseur morphologique, entre en jeu.

TF-IDF = numéro de nomenclature spécifique dans la phrase / numéro de toute la nomenclature dans la phrase

Essayons réellement

Exemple de phrase


Festival de la viande NIIGATA pour une nuit de viande ❤︎ Steak house Azuma-san's Yukimuro vieillissant Steak de bœuf de la préfecture de Niigata délicieux*\(^o^)/*Parfait pour le sel ou le wasabi!

résultat


from simple_tfidf_japanese.tfidf import TFIDF
text = "Festival de la viande NIIGATA pour une nuit de viande ❤︎ Steak house Azuma-san's Yukimuro vieillissant Steak de bœuf de la préfecture de Niigata délicieux*\(^o^)/*Parfait pour le sel ou le wasabi!"
result = TFIDF.gen(text, enable_one_char=1)
for key, value in result:
     print key, value

Viande 0.0952380952381
Steak 0.0952380952381
0 0.047619047619
Riz 0.047619047619
Neige 0.047619047619
Niigata 0.047619047619
Vieillissement 0.047619047619
Sel 0.047619047619
Festival 0.047619047619
Azuma 0.047619047619
Wasabi 0.047619047619
Vache 0.047619047619
Maison 0.047619047619
Nuit 0.047619047619
Zanmai 0.047619047619

La viande est bonne ~! Cette phrase semble avoir les meilleures caractéristiques de la viande, du steak et du riz.

Extrayons la similitude entre le lanceur Masaru Yamamoto et chaque équipe

J'ai enregistré l'outil que j'ai créé dans PyPi.

pip install simple_tfidf_japanese

Comparons la relation entre Masa et chaque équipe sur la base de la page wikipedia. Je vais également ajouter des articles sur le football qui n'ont rien à voir avec l'examen.

from simple_tfidf_japanese.tfidf import TFIDF

#Masaru Yamamoto
_base_url = "https://ja.wikipedia.org/wiki/%E5%B1%B1%E6%9C%AC%E6%98%8C"

#Comparaison
data = [
     ['Yakult', 'https://ja.wikipedia.org/wiki/%E6%9D%B1%E4%BA%AC%E3%83%A4%E3%82%AF%E3%83%AB%E3%83%88%E3%82%B9%E3%83%AF%E3%83%AD%E3%83%BC%E3%82%BA'],
     ['Géant', 'https://ja.wikipedia.org/wiki/%E8%AA%AD%E5%A3%B2%E3%82%B8%E3%83%A3%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%84'],
     ['Hanshin', 'https://ja.wikipedia.org/wiki/%E9%98%AA%E7%A5%9E%E3%82%BF%E3%82%A4%E3%82%AC%E3%83%BC%E3%82%B9'],
     ['Hiroshima', 'https://ja.wikipedia.org/wiki/%E5%BA%83%E5%B3%B6%E6%9D%B1%E6%B4%8B%E3%82%AB%E3%83%BC%E3%83%97'],
     ['Chunichi', 'https://ja.wikipedia.org/wiki/%E4%B8%AD%E6%97%A5%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E3%82%BA'],
     ['Yokohama', 'https://ja.wikipedia.org/wiki/%E6%A8%AA%E6%B5%9CDeNA%E3%83%99%E3%82%A4%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BA'],
     ['Sofban', 'https://ja.wikipedia.org/wiki/%E7%A6%8F%E5%B2%A1%E3%82%BD%E3%83%95%E3%83%88%E3%83%90%E3%83%B3%E3%82%AF%E3%83%9B%E3%83%BC%E3%82%AF%E3%82%B9'],
     ['Jambon soleil', 'https://ja.wikipedia.org/wiki/%E5%8C%97%E6%B5%B7%E9%81%93%E6%97%A5%E6%9C%AC%E3%83%8F%E3%83%A0%E3%83%95%E3%82%A1%E3%82%A4%E3%82%BF%E3%83%BC%E3%82%BA'],
     ['Lotte', 'https://ja.wikipedia.org/wiki/%E5%8D%83%E8%91%89%E3%83%AD%E3%83%83%E3%83%86%E3%83%9E%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%BA'],
     ['Seibu', 'https://ja.wikipedia.org/wiki/%E5%9F%BC%E7%8E%89%E8%A5%BF%E6%AD%A6%E3%83%A9%E3%82%A4%E3%82%AA%E3%83%B3%E3%82%BA'],
     ['ORIX', 'https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%83%90%E3%83%95%E3%82%A1%E3%83%AD%E3%83%BC%E3%82%BA'],
     ['Rakuten', 'https://ja.wikipedia.org/wiki/%E6%9D%B1%E5%8C%97%E6%A5%BD%E5%A4%A9%E3%82%B4%E3%83%BC%E3%83%AB%E3%83%87%E3%83%B3%E3%82%A4%E3%83%BC%E3%82%B0%E3%83%AB%E3%82%B9'],
     ['Équipe nationale de football du Japon', 'https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%83%E3%82%AB%E3%83%BC%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8'],
]

#Calcul
result = TFIDF.some_similarity(_base_url, data)

#Affichage des résultats
result.sord(key=lambda x: x[2], reverse=True)
for title, url, value in result:
     print title, value

"""
Géant 0.437053886215
Yakult 0.399745780763
Hanshin 0.383247816027
Hiroshima 0.356147904333
Lotte 0.351312791912
Chunichi 0.344772305253
Yokohama 0.334360056622
Jambon soleil 0.326226324436
ORIX 0.317250711462
Bang doux 0.285703674673
Seibu 0.283181229507
Rakuten 0.275111280558
Représentant du football du Japon 0.177026402257
"""

D'un point de vue à vol d'oiseau, Se a le degré de similitude le plus élevé, Pa a le degré de similitude le plus bas et le football, qui n'a rien à voir avec cela, a le degré de similitude le plus bas. Pendant plus de 30 ans, il a été un pichet des Dragons Chunichi, mais étonnamment, la relation avec le géant est le numéro un, pas Chunichi. Il existe de nombreuses histoires sur le fait de jouer contre des géants dans WikiPedia, et il semble que le degré de similitude avec les géants a augmenté.

De plus, Hiroshima est mieux classée que la Chine et le Japon car il existe de nombreuses descriptions sur M. Koji Yamamoto, directeur de M. Akahel. On peut en déduire que Yamamoto était classé haut dans la connexion. La raison pour laquelle Yakult, Hanshin et Lotte sont mieux classés que Chunichi semble avoir changé en fonction du nombre de mots "Record, Victory, Baseball, Pro, Player".

Comment utiliser simple_tfidf_japanese

simple_tfidf_japanese est un module de calcul TFIDF uniquement japonais qui élimine tous les alphabets en tant que bruit.

#Sortie tfidf à partir du texte(Get TF-IDF from text)
from simple_tfidf_japanese.tfidf import TFIDF
text = "Festival de la viande NIIGATA pour une nuit de viande ❤︎ Steak house Azuma-san's Yukimuro vieillissant Steak de bœuf de la préfecture de Niigata délicieux*\(^o^)/*Parfait pour le sel ou le wasabi!"
tfidf1 = TFIDF.gen(text, enable_one_char=1)
for key, value in tfidf1:
     print key, value

>>>Viande 0.0952380952381
>>>Steak 0.0952380952381
>>>0 0.047619047619
>>>Riz 0.047619047619
>>>Neige 0.047619047619
>>>Niigata 0.047619047619
>>>Vieillissement 0.047619047619
...

#Sortie tfidf à partir du Web(Get TF-IDF from Web)
url = "https://ja.wikipedia.org/wiki/%E6%B7%A1%E8%B7%AF%E3%83%93%E3%83%BC%E3%83%95"
tfidf2 = TFIDF.gen_web(url)
for key, value in tfidf2:
     print key, value

>>>Awaji 0.0453257790368
>>>Boeuf 0.0396600566572
>>>Tajima 0.0198300283286
>>>Île Awaji 0.0169971671388
>>>Page 0.0169971671388
>>>Affichage 0.014164305949

# TF-Calculer la similitude avec la similarité du cosinus IDF(calc TF-IDF Cosine Similarity)
tfidf1 = [['Apple', 1], ['Orange', 2], ['Banana', 1], ['Kiwi', 0]]
tfidf2 = [['Apple', 1], ['Orange', 0], ['Banana', 2], ['Kiwi', 1]]
print TFIDF.similarity(tfidf1, tfidf2)
>>> 0.5

Je veux en savoir plus sur Janome

Lisez les diapositives que les créateurs ont présentées à PyCon 2015! Diapositives pour l'analyse morphologique réalisées et apprises avec Python

Je veux en savoir plus sur la similarité du cosinus TF-IDF

Qiita: Méthode d'estimation de la similarité TF-IDF Cos

Recommended Posts

Trier la relation entre le lanceur Masaru Yamamoto et chaque équipe par janome et TF-IDF Cosine Similarity
La relation subtile entre Gentoo et pip
À propos de la relation entre Git et GitHub