Wenn ich einen Satz lese, denke ich manchmal, dass es ein ähnlicher Satz ist. ** TF-IDF ** ist eine bequeme Möglichkeit, das vage Gefühl der Ähnlichkeit objektiv auszudrücken. Es gibt eine Website, die TF-IDF auf leicht verständliche Weise erklärt. Bitte googeln Sie sie. Wenn Sie die empfohlene Site erhöhen, ist dies wie folgt. [Für Anfänger] Ich habe TFIDF kurz zusammengefasst
Der Punkt ist (1) wenn das Wort, das häufig in einem bestimmten Satz vorkommt (** TF: Termhäufigkeit ), (2) wenn es ein seltenes Wort ist, das in gewöhnlichen Sätzen nicht häufig vorkommt ( IDF: Inverse) Dokumenthäufigkeit Rarität **), ausgehend von der Idee, dass der Satz ein wortbezogenes Thema ist. Die Grundidee von TF-IDF besteht darin, die Summe von TF und IDF des Wortes zu vergleichen und die Ähnlichkeit als Satz zu beurteilen.
Nun, es fängt nicht an, selbst wenn ich Chaos sage. Berechnen wir also mit ** scikit-learn (sklearn) **, das oft verwendet wird, um AI-ähnliche Dinge mit Python zu tun. Bereiten Sie sich zuerst vor.
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
Bei der Berechnung von TF-IDF können ** CountVectorizer ** und ** TfidfTransformer ** in Kombination anstelle des oben beschriebenen ** TfidfVectorizer ** verwendet werden (ich werde es später versuchen). Beim Kombinieren wird die Häufigkeit von Wörtern mit CountVectorizer vektorisiert und anschließend TF-IDF mit TfidfTransformer berechnet. Wenn Sie jedoch TF-IDF berechnen möchten, ist es einfacher, mit TfidfVectorizer sofort zu berechnen, daher habe ich diesmal TfidfVectorizer verwendet. Die Ergebnisse unterschieden sich geringfügig zwischen dem Fall mit TfidfVectorizer und dem Fall mit CountVectorizer und TfidfTransformer (Details werden später beschrieben). Ich denke, es liegt an den Parametern, aber leider ist der Grund unbekannt. Wenn Sie wissen, bitte kommentieren. Der Ähnlichkeitsgrad ergibt sich jeweils aus der Berechnung des ** Cosinus cos ** des Vektors.
Wenn es um Japanisch geht, ist eine morphologische Analyse erforderlich. Im Englischen sind die Wörter getrennt, so dass sie so analysiert werden können, wie sie sind, aber im Japanischen sind die Wörter nahtlos in den Satz eingefügt, sodass jedes Wort getrennt werden muss. Die berühmte morphologische Analyse ist ** Mecab ** in Python, aber ** janome ** ist einfach zu handhaben, daher werde ich dieses Mal ** janome ** verwenden.
from janome.tokenizer import Tokenizer
Es ist ein zu vergleichender Satz, aber versuchen wir, leicht verständliche Nachrichten zu verwenden. Versuchen wir, uns mit Ihrem eigenen Urteilsvermögen und Ihren Vorurteilen auf Ihren Lieblingsfußball zu konzentrieren. Der erste Satz ist die Nachricht, dass die führende Frontale den zweitplatzierten Celeso besiegte.
text1.txt
Kawasaki F, 2. Platz C Besiege 3 Schüsse und renne alleine! 8 Siege in Folge, die die Punktedifferenz auf "14" vergrößern
Die 20. Runde der Meiji Yasuda Seimei J1 League fand am 3. statt, und Celeso Osaka begrüßte Kawasaki Frontale in seinem Haus, dem Yanmar Stadium Nagai.
Kawasaki F (53 Punkte) und C Osaka (42 Punkte) jagen nach 20 Spielen. Heim C Osaka gewann die ersten drei Spiele im vorherigen Abschnitt, während Kawasaki F dieser Gipfelkonfrontation mit überwältigender Dynamik gegenüberstand, sieben Spiele in Folge zu gewinnen.
Als nächstes verwenden wir eine andere Nachricht mit demselben Inhalt. Lassen Sie uns die Ähnlichkeit zwischen den ersten beiden Nachrichten hypothetisieren und testen.
text2.txt
Die Punktedifferenz beträgt 14 ... 8 Siege in Folge gegen Kawasaki F und C Osaka!!
Die J1 League fand am 3. Runde 20 statt und Celeso Osaka wurde Zweiter im Yanmar Stadium Nagai(42 Punkte)Kawasaki Frontale liegt mit 11 Punkten Unterschied an der Spitze(53 Punkte)Ist ein Match. Kawasaki F übernahm in der 37. Minute der ersten Halbzeit die Führung mit einem Eigentor, aber C Osaka holte in der 17. Minute der zweiten Halbzeit das Ergebnis von FW Hiroaki Okuno ein. In der 38. Minute jedoch schüttelte FW Leandro Damian und in der 39. Minute MF Mitsuka Kaoru das Netz in schneller Folge, und Kawasaki F bekam 3-Ich habe einen gewonnen.
Die dritte ist die gleiche Fußballnachricht, aber mit unterschiedlichem Inhalt.
text3.txt
G Osaka, Yasuhito Endo, nach Iwata versetzt! "Menschliche Beziehungen zu Regisseur Miyamoto" hinter "Entscheidung"
Gamba Osaka berichtete von einigen Sportzeitungen, und die Legende der japanischen Nationalmannschaft, Yasuhito Endo, wechselte für eine begrenzte Zeit zu J2 Iwata. Sobald diese Nachricht bekannt wurde, waren nicht nur Anhänger von G Osaka, sondern auch viele Fußballfans im Internet überrascht. Apropos Endo: Seit 2001, als er aus Kyoto wechselte, ist er als Hauptstütze von G Osaka aktiv. Als Nr. 7 von G Osaka hat er als Kommandoturm als Kernspieler zu allen vom Team gewonnenen Titeln beigetragen.
Auch im Sport ist das Genre dasselbe, aber vergleichen wir es mit den Nachrichten über Baseball.
text4.txt
Jetzt ist FA Masahiro Tanaka "ein Krug, der den Wert wert ist"
Yankees Masahiro Tanaka, der nach Ende dieser Saison ein Free Agent (FA) wird, wurde vom Team und den lokalen Medien frühzeitig geäußert und gebeten, zu bleiben. Der rechte Arm, der bis zur letzten Saison ein Meisterwerk in den Playoffs gezeigt hatte, startete am 30. September (1. Japanische Zeit) in der zweiten Runde der Wild Card-Serie mit Indianern. Unter den schlechten Regenbedingungen kämpfte er im 4. Inning mit 6 Toren, aber das gesamte Team entschied sich, in die Distriktserie aufzusteigen.
Schließlich sind Nachrichten Nachrichten, aber ein völlig anderes Genre.
text5.txt
[New Corona] US-Präsident im Krankenhaus, "Cluster" des Weißen Hauses und WHO
US-Präsident Trump kam am 2. vom Weißen Haus mit einem Präsidentenhubschrauber im Walter Reed Medical Center in der Nähe von Washington an, um eine Behandlung für eine neue Coronavirus-Infektion (COVID19) zu erhalten. Dies deutet auf eine weit verbreitete Besorgnis über die Schwere der Erkrankung hin.
Die obigen Sätze werden aufgenommen und analysiert. Der Grad der Ähnlichkeit mit Satz 1 wird voraussichtlich Satz 2> Satz 3> Satz 4> Satz 5 sein. Nun, wird das wahr sein?
Lesen Sie zuerst den Text. Vergessen Sie nicht, eine morphologische Analyse durchzuführen.
filenames=['text1.txt','text2.txt','text3.txt','text4.txt','text5.txt']
wakati_list = []
for filename in filenames: #Lesen Sie eine Textdatei und weisen Sie sie dem Text zu
with open(filename,mode='r',encoding = 'utf-8-sig') as f:
text = f.read()
wakati = ''
t = Tokenizer()
for token in t.tokenize(text): #Morphologische Analyse
hinshi = (token.part_of_speech).split(',')[0] #Teil Lyrics Informationen
hinshi_2 = (token.part_of_speech).split(',')[1]
if hinshi in ['Substantiv']: # 品詞がSubstantivの場合のみ以下実行
if not hinshi_2 in ['Leer','*']:
#Ist der zweite Teil der Textinformationen leer?*Im Fall von unten nicht ausführen
word = str(token).split()[0] #Holen Sie sich das Wort
if not ',*,' in word: #Zum Wort*Wenn nicht enthalten, führen Sie Folgendes aus
wakati = wakati + word +' '
#Fügen Sie dem Objekt Wakati Wörter und Leerzeichen hinzu
wakati_list.append(wakati) #Fügen Sie das Ergebnis der Division zur Liste hinzu
wakati_list_np = np.array(wakati_list) #Liste in ndarray konvertieren
Schließlich die Berechnung der Ähnlichkeit. Verwenden wir TfidfVectorizer.
vectorizer = TfidfVectorizer(token_pattern=u'\\b\\w+\\b')
transformer = TfidfTransformer()#Erzeugung eines Transformators. TF-Verwenden Sie IDF
tf = vectorizer.fit_transform(wakati_list_np) #Vektorisierung
tfidf = transformer.fit_transform(tf) # TF-IDF
tfidf_array = tfidf.toarray()
cs = cosine_similarity(tfidf_array,tfidf_array) #cos Ähnlichkeitsberechnung
print(cs)
Die Ergebnisse sind wie folgt. Die relative Größe der Ähnlichkeit ist natürlich wie erwartet.
[[1. 0.48812198 0.04399067 0.02065671 0.00164636]
[0.48812198 1. 0.02875532 0.01380959 0.00149348]
[0.04399067 0.02875532 1. 0.02595705 0. ]
[0.02065671 0.01380959 0.02595705 1. 0.00350631]
[0.00164636 0.00149348 0. 0.00350631 1. ]]
Übrigens ist der Fall der Kombination von Count Vectorizer und Tfidf Transformer, der zu Beginn geschrieben wurde, wie folgt. Sie müssen es importieren, bevor Sie es verwenden können.
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
#Vektorisierer generieren. Zeichen_pattern=u'\\b\\w+\\b'Einstellungen, die Wörter aus einem Buchstaben enthalten
vectorizer = CountVectorizer(token_pattern=u'\\b\\w+\\b')
#Erzeugung eines Transformators. TF-Verwenden Sie IDF
transformer = TfidfTransformer()
tf = vectorizer.fit_transform(wakati_list_np) #Vektorisierung
tfidf = transformer.fit_transform(tf) # TF-IDF
tfidf_array = tfidf.toarray()
cs = cosine_similarity(tfidf_array,tfidf_array) #cos Ähnlichkeitsberechnung
print(cs)
Die Ergebnisse sind wie folgt. Dieser hat einen etwas höheren Ähnlichkeitswert.
[[1. 0.59097619 0.07991729 0.03932476 0.00441963]
[0.59097619 1. 0.05323053 0.03037231 0.00418569]
[0.07991729 0.05323053 1. 0.03980858 0. ]
[0.03932476 0.03037231 0.03980858 1. 0.01072682]
[0.00441963 0.00418569 0. 0.01072682 1. ]]
Wenn Sie die Ähnlichkeit in Python berechnen möchten, ist ** doc2vec ** ebenfalls gut. Es ist jedoch schwierig, das trainierte Modell hier zu laden. In diesem Sinne denke ich, dass ** TF-IDF ** in der Lage sein sollte, die Ähnlichkeit von Sätzen leicht zu berechnen.
Für den Code habe ich auf die folgende Seite verwiesen. Wir möchten diese Gelegenheit nutzen, um Ihnen zu danken.
Probieren Sie verschiedene Dinge mit Python aus
Recommended Posts