[PYTHON] [Für Anfänger] Quantifizieren Sie die Ähnlichkeit von Sätzen mit TF-IDF

0. Zusamenfassend

    1. ** TF-IDF ** ist ein guter Weg, um die Ähnlichkeit von Sätzen leicht zu quantifizieren.
  1. Die Ähnlichkeit wird berechnet, indem die Häufigkeit (** TF ) der im Satz vorkommenden Wörter mit der Seltenheit ( IDF **) multipliziert wird.
    1. Wenn Bequemlichkeit wichtig ist, wird ** janome ** von ** Mecab ** für die morphologische Analyse und ** TF-IDF ** von ** doc2vec ** für die Beurteilung der Ähnlichkeit empfohlen. ⇒ ** Ich denke, es wird nützlich sein, um den Grad der Ähnlichkeit mit der früheren Literatur bei der Patentrecherche zu quantifizieren und die Antworten auf die beschreibenden Fragen des gemeinsamen Tests für den Hochschulzugang objektiv zu bewerten. ** Es kann jedoch nur beurteilt werden, wenn eine Person es liest, ob der Satz sinnvoll ist oder nicht. Na klar (lacht)

1. 1. Problembewusstsein

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.

2. Vorbereitung

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

3. 3. Analyseziel

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?

4. Versuchen

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.        ]]

5. Schließlich

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

[Für Anfänger] Quantifizieren Sie die Ähnlichkeit von Sätzen mit TF-IDF
[Für Anfänger] Quantifizieren Sie die Ähnlichkeit von Sätzen mit TF-IDF
Berechnen Sie die Ähnlichkeit zwischen Sätzen mit Doc2Vec, einer Weiterentwicklung von Word2Vec
Die dritte Nacht der Runde mit für
Die zweite Nacht der Runde mit für
Fügen Sie Attribute von Klassenobjekten mit einer for-Anweisung hinzu
Übersicht über Docker (für Anfänger)
[Für Anfänger] Zusammenfassung der Standardeingabe in Python (mit Erklärung)
[Python] Die größten Schwächen und Nachteile von Google Colaboratory [Für Anfänger]
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Seaborn-Grundlagen für Anfänger ① Aggregiertes Diagramm der Anzahl der Daten (Countplot)
Visualisieren Sie die Häufigkeit von Wortvorkommen in Sätzen mit Word Cloud. [Python]
Überprüfen Sie den Speicherschutz von Linux Kern mit Code für ARM
Messen Sie die Ähnlichkeit von Inhalten mit Pyspark
4. Nacht der Schleife mit für
Ich habe versucht, das TensorFlow-Tutorial mit Kommentaren auszuführen (_TensorFlow_2_0_Einführung für Anfänger).
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Annäherungserklärung für Anfänger, um in Kaggle Titanic_3 unter den besten 1,5% (0,83732) zu sein
Annäherungserklärung für Anfänger, um in Kaggle Titanic_1 unter den besten 1,5% (0,83732) zu sein
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Annäherungserklärung für Anfänger, um in Kaggle Titanic_2 unter den besten 1,5% (0,83732) zu sein
INSERT in MySQL mit Python [Für Anfänger]
Fragen Sie mit dem Befehl bc nach Pi
[Python] Protokoll des Studientreffens für Anfänger (7/15)
Richten Sie die Größe der Farbleiste an der Matplotlib aus
Herausforderungen des Titanic-Wettbewerbs für Kaggle-Anfänger
Suchen Sie nach Dateien mit der angegebenen Erweiterung
Überprüfen Sie die Existenz der Datei mit Python
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
[Python] Bilder mit OpenCV lesen (für Anfänger)
WebApi-Erstellung mit Python (CRUD-Erstellung) Für Anfänger
Zählen Sie die Anzahl der Zeichen mit Echo
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Für SageMaker Anfänger-Material Links-
Checkliste, wie Sie vermeiden können, die Elemente des Numpy-Arrays mit for zu drehen
Richten Sie die Anzahl der Stichproben zwischen Datenklassen für maschinelles Lernen mit Python aus
Ein Memorandum of Method, das häufig bei der Analyse von Daten mit Pandas verwendet wird (für Anfänger)
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Nachdem Sie mit Python auf die Qiita-API geklickt haben, um eine Liste mit Artikeln für Anfänger zu erhalten, werden wir die Artikel von God besuchen
Pandas-Grundlagen für Anfänger ③ Erstellen Sie ein Histogramm mit matplotlib
Der schnellste Weg für Anfänger, um Python zu beherrschen
Die Geschichte des tiefen Lernens mit TPU
Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Die Geschichte, dass die Lernkosten von Python niedrig sind
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Kausales Denken und kausale Suche von Python (für Anfänger)
2016 Todai Mathematik mit Python gelöst
[Hinweis] Exportieren Sie das HTML der Site mit Python.
Belichtung des DCGAN-Modells für Cifar 10 mit Keras
Erhöhen Sie die Schriftgröße des Diagramms mit matplotlib
Lassen Sie uns den Infektionsstatus des Corona-Virus mit Plotly [für Anfänger] visualisieren.
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Verwenden Sie vorerst Logger mit Python
Achten Sie auf den Rückgabewert von __len__
Überprüfen Sie das Datum der Flaggenpflicht mit Python
Ich habe vorerst mit Floydhub gespielt
~ Tipps für Python-Anfänger mit Liebe von Pythonista ① ~
Beseitigen Sie die Unannehmlichkeiten von QDock Widget mit PySide
Schreiben Sie den Namen des Tags mit dem Namespace in lxml neu
Einfaches Verständnis von Python für & Arrays (für Super-Anfänger)