[PYTHON] Sortieren Sie die Beziehung zwischen Pitcher Masaru Yamamoto und jedem Team nach Janome und TF-IDF Cosine Similarity

Der auf der PyCon 2015 vorgestellte Janome ist praktisch. Ich möchte die Beziehung zwischen dem berühmten Krug Masaru Yamamoto im Ruhestand und jedem Team im Text von Wikipedia sortieren.

Was ist diesmal zu tun?

Extrahieren Sie die japanische Nomenklatur mit dem janome des morphologischen Analysators aus dem Wikipedia-Text und extrahieren Sie den Merkmalsvektor mit TF-IDF. Die Ähnlichkeit von Einträgen im Bereich von 0 bis 1 kann erhalten werden, indem die Merkmalsvektoren jedes Artikels nach innen erzeugt und cos & thgr; genommen werden. Sortieren Sie die Artikel nach Satzähnlichkeit und Sie sind fertig.

Wo Janome bequem ist

Die Installation von Mecab erfordert die Abhängigkeit von der Python-Version und die zusätzliche Installation des Wörterbuchs, sodass die Erstellung mühsam ist. Janome, der mit Pip installiert werden kann, ist praktisch. Sie können leicht herausfordern, wenn Sie eine morphologische Analyse benötigen.

Versuchen Sie es mit Janome

pip install janome
from janome.tokenizer import Tokenizer
t = Tokenizer()
text = """
Zwei Jahre nach dem Eintritt in die Hiroshima-Ära spross es nicht und wurde von den jüngeren Tomonori Maeda und Satoshi Eto überholt.
Der Schlag war so schwach, dass der Trainer damals sagte: "Rollen Sie und benutzen Sie Ihre Beine."
Die Außenverteidigung wird wegen der schlechten Angewohnheit, den geworfenen Ball auf den Boden zu werfen, auch als "Mogura-Tötung" bezeichnet...
"""
for token in t.tokenize(text):
     print(token)

------------------
Hiroshima Substantiv,Eigenname,Bereich,Allgemeines,*,*,Hiroshima,Hiroshima,Hiroshima
Periodennomenklatur,Allgemeines,*,*,*,*,Alter,Jidai,Jidai
Beitrittsnomenklatur,Verbindung ändern,*,*,*,*,Beitreten,Neuer Dan,Neuer Dan
Nachmittag,Suffix,Anwalt möglich,*,*,*,Rückseite,Gehen,Gehen
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
2 Nomenklatur,Nummer,*,*,*,*,*,*,*
Jährliche Nomenklatur,Suffix,Hilfswörter,*,*,*,Jahr,Nenkan,Nenkan
Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
Bud Substantiv,Allgemeines,*,*,*,*,Knospe,Mich,Mich
Ist ein Assistent,Fallassistent,Allgemeines,*,*,*,Aber,Ga,Ga
Ausgabeverb,Unabhängigkeit,*,*,Ein Schritt,Unvollkommene Form,Geh raus,De,De
Zu Hilfsverb,*,*,*,Besondere,Kontinuierliche Verbindung,Nu,Zu,Zu
, Symbol,Lesepunkt,*,*,*,*,、,、,、
Jüngere Nomenklatur,Allgemeines,*,*,*,*,jünger,Toshishita,Toshishita
Hilfswörter,Union,*,*,*,*,von,Nein,Nein
Maeda Nomen,Eigenname,Name der Person,Nachname,*,*,Maeda,Maeda,Maeda
Weisheit Nomen,Eigenname,Name der Person,Name,*,*,Weisheit,Tomonori,Tomonori
Und Hilfswörter,Parallele Assistenten,*,*,*,*,Oder,Ja,Ja
Eto Nomen,Eigenname,Name der Person,Nachname,*,*,Eto,Eto,Eto
Weisheit,Eigenname,Name der Person,Name,*,*,Satoshi,Satoshi,Satoshi
Substantiv,Suffix,Allgemeines,*,*,*,Et al.,La,La
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Überholen oder Verb,Unabhängigkeit,*,*,Fünf-Dan / Ka-Linie,Unvollkommene Form,Überholen,Oinuka,Oinuka
...

Was ist TF-IDF?

Die Idee ist, dass Sie den Merkmalsvektor des Satzes erhalten können, wenn Sie die Anzahl der Nomenklaturen in einem Satz zählen. Im Gegensatz zu Englisch hat Japanisch keinen Leerraum als Trennzeichen, daher ist eine morphologische Analyse erforderlich. Mit anderen Worten, Janome, ein morphologischer Analysator, kommt ins Spiel.

TF-IDF = Anzahl der spezifischen Nomenklaturen im Satz / Anzahl aller Nomenklaturen im Satz

Lass es uns tatsächlich versuchen

Beispielsatz


Fleischfest NIIGATA für eine Nacht voller Fleisch ❤︎ Steakhaus Azuma-sans Yukimuro reifendes Rindersteak der Präfektur Niigata köstlich*\(^o^)/*Perfekt für Salz oder Wasabi!

Ergebnis


from simple_tfidf_japanese.tfidf import TFIDF
text = "Fleischfest NIIGATA für eine Nacht voller Fleisch ❤︎ Steakhaus Azuma-sans Yukimuro reifendes Rindersteak der Präfektur Niigata köstlich*\(^o^)/*Perfekt für Salz oder Wasabi!"
result = TFIDF.gen(text, enable_one_char=1)
for key, value in result:
     print key, value

Fleisch 0.0952380952381
Steak 0.0952380952381
0 0.047619047619
Reis 0.047619047619
Schnee 0.047619047619
Niigata 0.047619047619
Altern 0.047619047619
Salz 0.047619047619
Festival 0.047619047619
Azuma 0.047619047619
Wasabi 0.047619047619
Kuh 0.047619047619
Haus 0.047619047619
Nacht 0.047619047619
Zanmai 0.047619047619

Fleisch ist gut ~! Dieser Satz scheint die besten Eigenschaften von Fleisch, Steak und Reis zu haben.

Lassen Sie uns die Ähnlichkeit zwischen Pitcher Masaru Yamamoto und jedem Team herausarbeiten

Ich habe das Tool, das ich in PyPi erstellt habe, registriert.

pip install simple_tfidf_japanese

Vergleichen wir die Beziehung zwischen Masa und jedem Team anhand der Wikipedia-Seite. Ich werde auch einige Fußballartikel einmischen, die nichts mit der Prüfung zu tun haben.

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"

#Vergleich
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'],
     ['Riese', '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'],
     ['Sonnenschinken', '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'],
     ['Japanische Fußballnationalmannschaft', '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'],
]

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

#Ergebnisanzeige
result.sord(key=lambda x: x[2], reverse=True)
for title, url, value in result:
     print title, value

"""
Riese 0.437053886215
Yakult 0.399745780763
Hanshin 0.383247816027
Hiroshima 0.356147904333
Lotte 0.351312791912
Chunichi 0.344772305253
Yokohama 0.334360056622
Sonnenschinken 0.326226324436
ORIX 0.317250711462
Soft Bang 0.285703674673
Seibu 0.283181229507
Rakuten 0.275111280558
Fußballvertreter aus Japan 0.177026402257
"""

Aus der Vogelperspektive weist SE den höchsten Ähnlichkeitsgrad auf, PA den niedrigsten Ähnlichkeitsgrad und Fußball, der nichts damit zu tun hat, den niedrigsten Ähnlichkeitsgrad. Seit mehr als 30 Jahren ist er ein Krug der Chunichi-Drachen, aber überraschenderweise ist er nicht der Chunichi, sondern der Riese. In WikiPedia gibt es viele Geschichten über das Spielen gegen Riesen, und es scheint, dass der Grad der Ähnlichkeit mit Riesen zugenommen hat.

Außerdem ist Hiroshima höher eingestuft als China und Japan, da es viele Beschreibungen über Herrn Koji Yamamoto, den Direktor von Herrn Akahel, gibt. Es kann gefolgert werden, dass Yamamoto in der Verbindung hoch eingestuft wurde. Der Grund, warum Yakult, Hanshin und Lotte höher als Chunichi eingestuft werden, scheint sich abhängig von der Anzahl der Wörter "Rekord, Sieg, Baseball, Profi, Spieler" geändert zu haben.

Verwendung von simple_tfidf_japanese

simple_tfidf_japanese ist ein TFIDF-Berechnungsmodul nur für Japanisch, das alle Alphabete als Rauschen eliminiert.

#Ausgabe von tfidf aus Text(Get TF-IDF from text)
from simple_tfidf_japanese.tfidf import TFIDF
text = "Fleischfest NIIGATA für eine Nacht voller Fleisch ❤︎ Steakhaus Azuma-sans Yukimuro reifendes Rindersteak der Präfektur Niigata köstlich*\(^o^)/*Perfekt für Salz oder Wasabi!"
tfidf1 = TFIDF.gen(text, enable_one_char=1)
for key, value in tfidf1:
     print key, value

>>>Fleisch 0.0952380952381
>>>Steak 0.0952380952381
>>>0 0.047619047619
>>>Reis 0.047619047619
>>>Schnee 0.047619047619
>>>Niigata 0.047619047619
>>>Altern 0.047619047619
...

#Ausgabe von tfidf aus dem 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
>>>Rindfleisch 0.0396600566572
>>>Tajima 0.0198300283286
>>>Awaji Island 0.0169971671388
>>>Seite 0.0169971671388
>>>Anzeige 0.014164305949

# TF-Berechnen Sie die Ähnlichkeit mit der IDF-Cosinus-Ähnlichkeit(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

Ich möchte mehr über Janome wissen

Lesen Sie die Folien, die die Autoren auf der PyCon 2015 vorgestellt haben! Folie der morphologischen Analyse, die mit Python erstellt wurde

Ich möchte mehr über TF-IDF Cosine Similarity erfahren

Qiita: TF-IDF Cos Ähnlichkeitsschätzungsmethode

Recommended Posts

Sortieren Sie die Beziehung zwischen Pitcher Masaru Yamamoto und jedem Team nach Janome und TF-IDF Cosine Similarity
Die subtile Beziehung zwischen Gentoo und Pip
Über die Beziehung zwischen Git und GitHub