[PYTHON] Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen

Einführung

Neulich bemerkte ich diese Bemerkung von Shinjiro Koizumi.

"Stellen Sie sich die Zukunft der Diät vor, und wenn dieselben Fragen oft gestellt werden, möchte ich, dass Sie künstliche Intelligenz verwenden. Es gibt viele Dinge, die Sie tun können, wie die Verwendung künstlicher Intelligenz und die Zukunft der Diät. Ja “([Herr Koizumi, ein Einwohner,„ Ähnliche Frage, in Zukunft mit KI drehen “) (https://www.asahi.com/articles/ASL1Q6W20L1QUTFK01N.html))

Also fragte ich mich, ob ich das wirklich tun könnte, während ich gleichzeitig Doc2Vec studierte, und versuchte, den "Fragebogen" zu verwenden, der es bis zu einem gewissen Grad einfach macht, Daten zu erhalten. BERT (Bidirectional Encoder Representations from Transformers) und ELMo (Embeddings from Language Models) kommen heutzutage heraus, Doc2Vec? Ich denke, einige Leute sagen das, aber ich denke, dass es immer noch aktiv ist, um eine kleine Analyse durchzuführen, wie zum Beispiel in Gensim verpackt und einfach zu bedienen.

Fragestellung

Wenn Sie im Landtag eine Frage stellen, können Sie sich vorstellen, dass ein Mitglied des Landtages den Minister mündlich fragt. Dem Kabinett Fragen zu Gesetzentwürfen und Richtlinien zu stellen, ist eine wichtige Aufgabe für den Gesetzgeber, aber diese Fragen können auch schriftlich gestellt werden. Das ist die Fragestellung.

Die Zeit, um Fragen im Parlament zu stellen, ist begrenzt, insbesondere bei Minderheitenparteien. Diese Fragestellung wird in solchen Fällen häufig verwendet. Es ist eine der wichtigsten Verfolgungsmethoden für Parlamentarier, die in der Vergangenheit dem AIDS-Vorfall mit Drogenschäden ausgesetzt waren.

In der Regel muss das Kabinett, das den Fragebogen erhält, innerhalb von 7 Tagen schriftlich antworten. Die Antwort zu diesem Zeitpunkt muss jedoch durch das Kabinett geleitet werden. Es scheint eine schwere Aufgabe für das Feld zu sein, da die Antwort auf den Fragebogen die offizielle Meinung der Regierung bleiben wird, auch weil sie die Kabinettssitzung bestanden hat.

Was ist der "Fragebogen", den Kasumi nicht mag? ABC in Bezug auf aktuelle Angelegenheiten Ich habe versucht, WordCloud als Übermittler des Fragebogens für den diesmal vorgesehenen Zeitraum zu verwenden. Die überwältigende Präsenz von Muneo Suzuki ...

Doc2Vec Docment-to-Vector, das Dokument = Dokumentmerkmale als Vektor darstellt. Doc2Vec wurde von Tomas Mikilov vorgeschlagen, der Word2Vec entwickelt hat, und die folgenden zwei Methoden werden als Lernmethoden vorgeschlagen.

In PV-DM wird der Dokumentvektor gelernt, um das unmittelbar folgende Wort aus dem Wortvektor vorherzusagen, der mit dem Dokumentvektor kontinuierlich ist.

In PV-DBOW wird nach Ignorieren der Wortreihenfolge der Satzvektor gelernt, um das im Satz enthaltene Wort zu erraten. Es wird gesagt, dass die verteilte Darstellung von Sätzen mit dieser Methode einfacher als PV-DM ist, aber weniger genau. Verwendung der Technologie zur Verarbeitung natürlicher Sprache - Ich habe versucht, die Qualität von Papieren mithilfe von Doc2Vec und DAN vorherzusagen! -

Daten

Dieses Mal werde ich den Fragebogen des Repräsentantenhauses und des Repräsentantenhauses verwenden, der durch Kriechen und Schaben erhalten wurde. Eigentlich wollte ich alle Daten aus der 1. Nationalversammlung extrahieren, aber weil mein Herz in der Mitte brach, konzentrierte ich mich auf Heisei und Reiwa und extrahierte die Daten des Fragebogens. Das Zielparlament ist vom 114. bis zum 200. Parlament. Da diesmal Doc2Vec der Hauptcode ist, wird außerdem der Crawling- und Scraping-Code weggelassen und nur das Ergebnis veröffentlicht. Darüber hinaus werden wir in diesem Artikel von der 114. bis zur 199. Nationalversammlung modellieren und die Ähnlichkeit des Fragebogens in der 200. Nationalversammlung schätzen.

Importieren Sie zunächst die Bibliothek, bevor Sie den Inhalt der Daten anzeigen. Da ich diesmal auf Japanisch zeichne, verwende ich die Schriftart "NotoSansMonoCJKjp-Regular.otf". Abschied vom Tofu.

import numpy as np
import pandas as pd

import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
from matplotlib.font_manager import FontProperties
font_path = "/mnt/c/u_home/font/NotoSansMonoCJKjp-Regular.otf"
font_prop = FontProperties(fname=font_path)

Nun, die Daten dieses Mal sind so. Von oben die Fragebögen der Repräsentantenhäuser vom 114. bis zum 199., die Fragebögen der Repräsentantenhäuser der 200. Versammlung und der Zeitraum, in dem der Landtag geöffnet ist ([Seite hier]](Abgerufen von http://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/shiryo/kaiki.htm).

data = pd.read_excel("data.xlsx")
data_200 = pd.read_excel("data_200.xlsx")
data_diet_open = pd.read_excel("data_diet_open.xlsx")

Nach Datum sortieren und die oberen zwei und unteren zwei anzeigen. ..

data.sort_values(by=['date']).iloc[np.r_[0:2, -2:0]]

s3.png Ergänzend time Die Sitzung des Landtages, in der der Fragebogen eingereicht wurde "Diät" Repräsentantenhaus oder Haus der Ratsmitglieder title Der Titel der Fragestellung name Einsender des Fragebogens Datum Das Datum, an dem der Fragebogen eingereicht wurde question Der Text der Fragestellung q_numb Anzahl der Fragen in der Fragenerklärung (Details werden später beschrieben) Jahr Das Jahr, in dem der Fragebogen eingereicht wurde Monat Der Monat, in dem der Fragebogen eingereicht wurde Tag Der Tag, an dem der Fragebogen eingereicht wurde

Die ältesten Daten, die dieses Mal verwendet wurden, sind der "Fragebogen zur Zinskontrolle von Geldgebern", der von Vertreter Shigeji Inokuma am 20.01.1989 eingereicht wurde, und der neueste ist Vertreter Noshi Koga 2019-08-. Dies ist der "Fragebogen zu" Vertragsuntersuchungen und Verbesserungsbemühungen der Japan Post Group ", der im Jahr 05 eingereicht wurde. Die Anzahl der Daten beträgt 15.515. Haben Sie das Gefühl, dass diese Anzahl von Daten nicht zu gering ist?

data.shape
(15515, 10)

Gleiches gilt für die Daten der 200. Nationalversammlung. Die Anzahl der Daten beträgt 167.

data_200.sort_values(by=['date']).iloc[np.r_[0:2, -2:0]]

s4.png Schließlich eine Liste der parlamentarischen Sitzungen


EDA Durchsuchen Sie die Daten, bevor Sie zu Doc2Vec wechseln

Anzahl der Hauptdokumente nach Jahr / Monat / Tag

Zunächst eine Grafik für jedes Jahr. Sie hat seit etwa 2006 rapide zugenommen.

rcParams['figure.figsize'] = 8,4
data.groupby('year').size().plot.bar()
Dann monatlich. Viele im Juni. Von Juli bis September gibt es nur wenige.
rcParams['figure.figsize'] = 8,4
data.groupby('year').size().plot.bar()

Endlich jeden Tag. Da die Anzahl der 31. in erster Linie gering ist, verstehe ich, dass die Anzahl der Absichten ebenfalls gering ist, aber es gibt keine andere Tendenz als diese.

rcParams['figure.figsize'] = 8,4
data.groupby('day').size().plot.bar()

In tägliche Daten konvertieren

Um zu verstehen, wie viele Absichten pro Tag eingereicht wurden, haben wir nach Datum sortiert und die Anzahl der Fälle gezählt und die Anzahl der nicht eingereichten Tage auf Null gesetzt, den ersten Tag der 114. Nationalversammlung (30. Dezember 1988). ) Bis zum letzten Tag der 199. Nationalversammlung (5. August 2019) möchte ich Zeitreihendaten erstellen.

def convert_to_daily(data):
    time_index = pd.DataFrame(index=pd.date_range('19881230','20190805'))
    #Legen Sie den ersten und den letzten Tag des Zielzeitraums fest

    doc_num_daily = pd.DataFrame(data.groupby('date').size(), columns=['doc_num'])
    #Zählen Sie die Anzahl der Hauptdokumente für jedes Datum und geben Sie den Spaltennamen ein'doc_num'Zu

    data_daily = pd.concat([time_index, doc_num_daily], axis=1) #verschmelzen
    data_daily['doc_num'] = data_daily['doc_num'].fillna(0) #Keine fehlenden Werte
    data_daily = data_daily.iloc[:,0] #In der Pandas-Serie
    
    return data_daily

data_daily = convert_to_daily(data) #Lauf

Darüber hinaus haben wir während der Diät eine Funktion erstellt, um die Hintergrundfarbe grau zu machen.

def plot_daily_data(data_daily, start_day, end_day):
    subdata = data_diet_open[(data_diet_open['end'] >= start_day) & (data_diet_open['end'] <= end_day)].sort_values(by='diet_time').reset_index(drop=True)
    plt.plot(data_daily.loc[start_day:end_day])
    plt.title("Number of docments between " + start_day + " and " + end_day)
    for i in range(subdata.shape[0]):
        plt.axvspan(subdata.start[i],subdata.end[i], color=sns.xkcd_rgb['grey'], alpha=0.5)

Also Handlung.

rcParams['figure.figsize'] = 20,5
start_day = "1988-12-30"; end_day = "2019-12-31"
plot_daily_data(data_daily, start_day, end_day)

Irgendwie steigt es und es scheint, dass es seit 2004 zugenommen hat, aber es ist schwer zu sehen ... also habe ich es in drei Teile geteilt.

start_day = "1988-12-30"; end_day = "1999-12-31"
plot_daily_data(data_daily, start_day, end_day)
start_day = "2000-01-01"; end_day = "2009-12-31"
plot_daily_data(data_daily, start_day, end_day)
start_day = "2010-01-01"; end_day = "2019-12-31"
plot_daily_data(data_daily, start_day, end_day)

Da der Fragebogen nur während der Sitzung des Landtages eingereicht werden kann, ist klar, dass die Anzahl der Einreichungen am Ende jeder Sitzung des Landtages zunimmt (= ganz rechts in Grau). Trotzdem habe ich es in drei Teile geteilt und die Grafik gelöscht, aber die Skala auf der linken Seite nimmt allmählich zu, was deutlich zeigt, dass die Fragestellung heutzutage häufig verwendet wird.

Zeigen Sie die Anzahl der eingereichten Fragebögen in einem Histogramm an. Es ist eine schöne abfallende Grafik.

plt.hist(data_daily[data_daily > 0], bins=50)

s13.png

Der Maximalwert beträgt 84 am 25. September 2015! Was an diesem Tag passiert ist, wird später beschrieben ...

data_daily.max()

doc_num    84.0
dtype: float64
data.groupby('date').size().idxmax()
Timestamp('2015-09-25 00:00:00')

Namentlich

Ich würde gerne sehen, welche Parlamentarier den Fragebogen oft einreichen. Erstens beträgt die Anzahl der in den Daten aufgeführten Parlamentarier 789. Bitte beachten Sie, dass diese Daten den gemeinsamen Namen als "Masaken Akamine, Chizuru Takahashi, Hidekatsu Yoshii" behandeln.

len(data.name.unique())
789

Übrigens, hier sind die 30 besten Leute, die interessiert sind!

subdata = data.groupby('name').filter(lambda x: len(x) >= 100)
len(subdata.name.unique())
30 #Extrahieren Sie die Top 30 Personen

plot_value = subdata.groupby('name').size().sort_values(ascending=False)
plot_index = subdata.groupby('name').size().sort_values(ascending=False).index

rcParams['figure.figsize'] = 20,5
plt.bar(plot_index, plot_value)
plt.xticks(plot_index, rotation=90, fontproperties=font_prop)
for i, v in enumerate(plot_value):
    plt.text(i - 0.5, v + 5, str(v), color='blue')

Es war Muneo Suzuki, der weit hinter dem 2. Platz und darunter die Führung übernahm. Diese Nummer 2155 ... [Wikipedia](https://ja.wikipedia.org/wiki/%E8%B3%AA%E5%95%8F%E4%B8%BB%E6%84%8F%E6%9B%B8#%E6% 8F% 90% E5% 87% BA% E6% 95% B0) hat auch eine perfekte Beschreibung.

"Ein Beispiel für viele Einreichungen ist Muneo Suzuki, eine neue Partei, die in der Oppositionszeit 1900 Fragen eingereicht hat, auch bekannt als" König der Fragen ". Muneo verließ den Landtag, nachdem er 2010 seinen Job verloren hatte. Danach reichte er den Fragebogen weiterhin bei Takahiro Asano ein, der sein Nachfolger in derselben neuen Partei wurde. Als Takako Suzuki, die älteste Tochter von Muneo, im Juni 2013 gewählt wurde, hat sie Takako mit einer schriftlichen Untersuchung angegriffen. ”

Muneo Suzuki

Es wird gesagt, dass die Anwesenheit von Muneo Suzuki die Rolle des Fragebogens stark verändert hat. Es wird auch in [NHK-Artikel] erwähnt (https://www3.nhk.or.jp/news/html/20190926/k10012096901000.html). Daher möchte ich die Anzahl der Fragen von Muneo Suzuki betrachten.

muneo_daily = convert_to_daily(data[data['name']=="Muneo Suzuki"].reset_index(drop=True))

rcParams['figure.figsize'] = 20,5
plt.plot(data_daily)
plt.plot(muneo_daily)
for i in range(data_diet_open.shape[0]):
    plt.axvspan(data_diet_open.start[i],data_diet_open.end[i], color=sns.xkcd_rgb['grey'], alpha=0.4)
Die orange Farbe ist die Anzahl der Einreichungen des Fragebogens von Herrn Muneo Suzuki. Verlängerung des Zeitraums, in dem Herr Muneo Suzuki den Fragebogen einreichte,
start_day = "2005-10-03"; end_day = "2010-08-04"
subdata = data_diet_open[(data_diet_open['end'] >= start_day) & (data_diet_open['end'] <= end_day)].sort_values(by='diet_time').reset_index(drop=True)

plt.plot(data_daily.loc[start_day:end_day])
plt.plot(muneo_daily.loc[start_day:end_day])
plt.title("Number of docments between " + start_day + " and " + end_day)
for i in range(subdata.shape[0]):
    plt.axvspan(subdata.start[i],subdata.end[i], color=sns.xkcd_rgb['grey'], alpha=0.5)
Von 2006 bis 2007 konnten Sie sehen, dass die meisten der eingereichten Fragebögen Herr Muneo Suzuki waren.

Nach Datum und Einreicher

Das nächste Mal möchte ich ein Mitglied finden, das viel pro Tag einreicht.

subdata = data.groupby(['name','date']).filter(lambda x: len(x) >= 15)
pd.DataFrame(subdata.groupby(['name','date']).size().sort_values(ascending=False))

An der Spitze stand Herr Konishi, der am 25. September 2015 55 Bücher einreichte. Wie erwartet gibt es Zeiten, in denen es nur den Spitznamen "Quizkönig der Diät" trägt. Hier ist übrigens der Titel des Fragebogens von Herrn Konishi, der an diesem Tag eingereicht wurde.

Ähnliche Titel gehen weiter, aber vor allem 39 und 40 haben nicht geklappt ... Obwohl die Kosten für die Fragestellung geschrien werden, scheint es, als würde man nach einem Fehler suchen.

  1. Fragebogen zum Wert von US-Militärbasen in Japan basierend auf der japanisch-amerikanischen Allianz in den Vereinigten Staaten
  2. Fragebogen zum Wert der US-Militärluftwaffenstützpunkte in Japan basierend auf der japanisch-amerikanischen Allianz in den Vereinigten Staaten

Diesbezüglich wurde auch dieser Artikel geschrieben.

"Bei Betrachtung der Fragen von Vertreter Konishi, der diesmal eine Rekordzahl von 55 Fragen einreichte, gab es einen Fall, in dem nur eineinhalb Zeilen Fragen mehrmals mit demselben Thema gestellt wurden. Wenn das Buch das gleiche Thema hat, können Sie mehrere Fragen in Aufzählungszeichen stellen. Viele der Inhalte fragen auch nach der Interpretation des Wortlauts, und Premierminister Abe sagte einmal im Haushaltsausschuss: "Fragen wie Quiz sind produktiv. Es ist ein Eindruck, dass Fragen ohne großes Bild aufgereiht sind, was mich an die Szene erinnert, in der mir erzählt wurde. ""

Anzahl der Fragen in der Hauptaussage

In der Erklärung des Spaltennamens der Daten habe ich geschrieben, dass "q_numb" später beschrieben wird, aber dieses Mal wird zum Zeitpunkt des Scrapings nicht nur die Anzahl der Fragenabsichten, sondern auch die Anzahl der in der Fragenabsicht beschriebenen Fragen extrahiert. Zum Beispiel stellt diese Erklärung drei Fragen.

Der chinesische Zahlenteil ist eine individuelle Frage. Die Idee ist, dass die tatsächlichen Kosten erzielt werden können, indem die Anzahl der Fragen in der Fragenerklärung und nicht nur die Anzahl der Fragen betrachtet wird. Beginnen wir mit der Gesamtzahl der Fragen pro Tag.

def convert_to_daily_qnum_sum(data):
    time_index = pd.DataFrame(index=pd.date_range('19881230','20190805'))

    doc_num_daily = data.groupby(['date'], as_index=False)['q_numb'].sum()
    doc_num_daily.set_index('date', inplace=True)
    data_daily = pd.concat([time_index, doc_num_daily], axis=1)
    data_daily['q_numb'] = data_daily['q_numb'].fillna(0)
    data_daily = data_daily["q_numb"]
    
    return data_daily

convert_to_daily_qnum_sum(data).plot()
for i in range(data_diet_open.shape[0]):
    plt.axvspan(data_diet_open.start[i],data_diet_open.end[i], color=sns.xkcd_rgb['grey'], alpha=0.4)
Dies hat auch seit 2000 zugenommen. Insbesondere seit etwa 2007 gab es 269 (2007-07-03) Fragen, die erheblich zugenommen haben, und seitdem wurden mehr als 200 Tage gesehen. Wir werden uns auch die durchschnittliche Anzahl der Fragen pro Tag ansehen.
def convert_to_daily_qnum_mean(data):
    time_index = pd.DataFrame(index=pd.date_range('19881230','20190805'))

    doc_num_daily = data.groupby(['date'], as_index=False)['q_numb'].mean()
    doc_num_daily.set_index('date', inplace=True)
    data_daily = pd.concat([time_index, doc_num_daily], axis=1)
    data_daily['q_numb'] = data_daily['q_numb'].fillna(0)
    data_daily = data_daily["q_numb"]
    
    return data_daily

convert_to_daily_qnum_mean(data).plot()
for i in range(data_diet_open.shape[0]):
    plt.axvspan(data_diet_open.start[i],data_diet_open.end[i], color=sns.xkcd_rgb['grey'], alpha=0.4)

Hier ist nicht viel zu spüren ... Die größte Anzahl von Fragen in einer Frage war Kazunori Yamais "Fragebogen zu nationalen strategischen Sonderzonen im Beschäftigungssektor" mit 68 Fragen! Irgendwie fühlt es sich so an, als würden Sie einen Test machen, wie "Bitte geben Sie drei konkrete Beispiele für die Klärung der Entlassungsregeln an" und "Ist Artikel 16 des Arbeitsvertragsgesetzes in der Sonderzone überhaupt nicht anwendbar?" wurde….

Doc2Vec

Teilen

Die Datensuche ist lang geworden, aber hier ist die eigentliche Produktion. Teilen Sie zunächst den Satz in Wörter für jeden Text der Fragestellung (separate Schrift). Wenn es sich beispielsweise um "Ich bin ein Mann" handelt, wird es in Wortebenen wie "[Ich bin ein Mann]" unterteilt und jeweils durch ein Leerzeichen halber Breite getrennt. Die, die ich dieses Mal in der Abteilung verwendet habe, ist "MeCab". Die folgende Funktion wird für die Division verwendet. Es können nur die für "POS1" erforderlichen Teilwörter extrahiert werden.

import MeCab
def word_pos(text, POS1=['Coalm','Substantiv','Adverb','Verb','Präfix','Verbindung',
                         'Hilfsverb','Partikel','Adjektiv','Symbol','Beeindruckende Worte','Füllstoff','Andere']):

    tagger  = MeCab.Tagger('mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    tagger.parse('')

    node = tagger.parseToNode(text)
    word_class = []
    while node:
        word = node.surface
        wclass = node.feature.split(',')
        if wclass[0] != u'BOS/EOS':
            if wclass[6] == None:
                if wclass[0] in POS1:
                    word_class.append((word,wclass[0],wclass[1],""))
            else:
                if wclass[0] in POS1:
                    word_class.append((word,wclass[0],wclass[1]))
        node = node.next
        
    word_class = pd.DataFrame(word_class, columns=['term', 'pos1', 'pos2'])
    
    return word_class

Nachdem wir die Lücken im Hauptteil der Fragestellung gelöscht haben, werden wir nur die Nomenklatur und die Adjektive extrahieren und dann die Schwänze, Nichtunabhängigkeit und Zahlen löschen, die nicht viel Sinn machen. Und speichern Sie es als word_list in data

data.question = data.question.str.replace("\u3000", " ")
data_200.question = data_200.question.str.replace("\u3000", " ")

data['word_list'] = ""

for i in range(data.shape[0]):
    each_data = word_pos(data.question[i], ["Substantiv","Adjektiv"])
    each_data1 = each_data[each_data['pos2'] != 'Suffix']
    each_data1 = each_data1[each_data1['pos2'] != 'Nicht unabhängig']
    each_data1 = each_data1[each_data1['pos2'] != 'Nummer']
    data.loc[i,"word_list"] = " ".join(list(each_data1.term))

data_200['word_list'] = ""

for i in range(data_200.shape[0]):
    each_data = word_pos(data_200.question[i], ["Substantiv","Adjektiv"])
    each_data1 = each_data[each_data['pos2'] != 'Suffix']
    each_data1 = each_data1[each_data1['pos2'] != 'Nicht unabhängig']
    each_data1 = each_data1[each_data1['pos2'] != 'Nummer']
    data_200.loc[i,"word_list"] = " ".join(list(each_data1.term))

Um ein Bild zu erhalten, gebe ich Ihnen nur ein Beispiel. Wenn Sie in Kamakura City, Präfektur Kanagawa, word_pos verwenden, um das Tsunami-Evakuierungstraining an einem Strand in der Stadt durchzuführen, ist dies wie folgt.

Doc2Vec Hier werden wir den Text in Wörter unterteilen und sie für jede Frage in die Liste aufnehmen. Das Bild ist [([Wort 1, Wort 2, Wort 3], Dokument-ID), ...]. Im folgenden Code beziehen sich Wörter auf die Liste der im Dokument enthaltenen Wörter (mit doppelten Wörtern), und Tags beziehen sich auf die Kennung der Fragenanweisung (in der Liste angegeben. Einer Frageanweisung können mehrere Tags hinzugefügt werden). ..

docments = data.word_list
tagged_data = [TaggedDocument(words = data.split(),tags = [i]) for i,data in enumerate(docments)]

Modelllernen

model = Doc2Vec(documents=tagged_data, size=300, window=10, min_count=5, workers=4, seed=1, dm=1)

Für Parameter size: Länge des Vektors window: Fenstergröße min_count: Mindestanzahl der zu zählenden Wörter Arbeiter: Anzahl der Threads seed: Feste Zufallszahl dm: Wenn dm = 1 ist, lerne mit PV-DM, sonst mit DBoW Es wird sein. Darüber hinaus gibt es "alpha" und "min_alpha", die die Lernrate angeben, aber nachdem ich verschiedene Dinge ausprobiert und qualitativ bewertet habe, habe ich mich für die vorherigen Parameter entschieden. Um ehrlich zu sein, hat gensim keine Funktion, um den Verlust automatisch zu berechnen, daher hatte ich das Gefühl, dass es viel einfacher wäre, diesen Bereich selbst zu modellieren. Außerdem sehe ich viel solchen Code im Sinne des Lernens.

for epoch in range(10):
    print('iteration {0}'.format(epoch+1))
    model.train(tagged_data, total_examples=model.corpus_count, epochs=model.iter)
    model.alpha -= 0.0002 # decrease the learning rate
    model.min_alpha = model.alpha # fix the learning rate, no decay

Laut dem Ersteller von "gensim" ist dies jedoch der Lerncode für die ältere Version von "Doc2Vec", und die aktuelle Version muss nur ausgeführt werden, wenn Sie ein sehr erfahrener Experte sind. war. What does epochs mean in Doc2Vec and train when I have to manually run the iteration? "An advanced user who needed to do some mid-training logging or analysis or adjustment might split the training over multiple train() calls, and very consciously manage the effective alpha parameters for each call. An extremely advanced user experimenting with further training on an already-trained model might also try it, aware of all of the murky quality/balance issues that might involve. But essentially, unless you already know specifically why you'd need to do so, and the benefits and risks, it's a bad idea."

Es gibt auch einen interessanten Kommentar des Erstellers von "gensim" zur Größe des Vektors. Reicht die Datenmenge diesmal gerade noch aus? what is the minimum dataset size needed for good performance with doc2vec? In general, word2vec/paragraph-vector techniques benefit from a lot of data and variety of word-contexts. I wouldn't expect good results without at least tens-of-thousands of documents. Documents longer than a few words each work much better. Results may be harder to interpret if wildly-different-in-size or -kind documents are mixed in the same training – such as mixing tweets and books.

model.save("doc2vec.model") #Modell speichern
model = Doc2Vec.load('doc2vec.model') #Modellaufruf

Ähnliche Fragestellung

Sie können mit model.docvecs.most_similar () nach ähnlichen Fragenabsichten suchen.

model.docvecs.most_similar(10531)

[(12348, 0.8008440732955933),
 (10543, 0.7899609804153442),
 (10534, 0.7879745960235596),
 (12278, 0.7819333076477051),
 (14764, 0.7807815074920654),
 (13340, 0.7798347473144531),
 (11314, 0.7743450403213501),
 (14881, 0.7730422616004944),
 (1828, 0.7719383835792542),
 (14701, 0.7534374594688416)]

So werden das Original und die beiden oberen angezeigt

pd.set_option('display.max_colwidth', -1)
data.iloc[10531:10532,:6]

s23.png

idx = model.docvecs.most_similar(10531)[0][0]
pd.set_option('display.max_colwidth', -1)
data.iloc[idx:idx+1,:6]

s24.png

idx = model.docvecs.most_similar(10531)[1][0]
pd.set_option('display.max_colwidth', -1)
data.iloc[idx:idx+1,:6]

s25.png

Alle von ihnen sind Themen wie Überstunden und Work-Life-Balance, daher denke ich, dass dies ein faires Ergebnis ist.

Ähnlichkeit mit der neuen Fragestellung

Nun, das Hauptthema ist endlich von hier.

"Stellen Sie sich die Zukunft der Diät vor, und wenn dieselben Fragen oft gestellt werden, möchte ich, dass Sie künstliche Intelligenz verwenden. Es gibt viele Dinge, die Sie tun können, wie die Verwendung künstlicher Intelligenz und die Zukunft der Diät. Ja "(Herr Shinjiro Koizumi)

Wir werden den Ähnlichkeitsgrad anhand des Fragebogens der 200. Nationalversammlung abschätzen, der nicht im Modell enthalten ist. Verwenden Sie model.infer_vector (), um ein neues Dokument in einen Vektor zu verwandeln. Geben Sie für "()" ein neues Dokument an und "Schritt", wie oft das Modell gedreht werden soll. Die Anzahl der Schritte wurde auf der Grundlage der Meinung des Erstellers von "gensim" auf 20 festgelegt. Außerdem lautet der Vektor für dieses neue Dokument "model.docvecs.most_similar (positiv = [new_docvec], topn = 1)", wodurch die Ähnlichkeit mit dem Dokument im vorhandenen Modell berechnet wird. topn gibt an, wie viele Top-Dokumente extrahiert werden sollen.

list_most_sim_doc   = []
list_most_sim_value = []

for i in range(data_200.shape[0]):
    new_doc = data_200.loc[i,'word_list']
    new_doc = new_doc.split(" ")
    new_docvec = model.infer_vector(new_doc, steps=20)
    most_sim_doc   = model.docvecs.most_similar(positive=[new_docvec], topn=1)[0][0]
    most_sim_value = model.docvecs.most_similar(positive=[new_docvec], topn=1)[0][1]
    
    list_most_sim_doc.append(most_sim_doc)
    list_most_sim_value.append(most_sim_value)

Die Verteilung der Ähnlichkeit ist wie folgt. Je näher es an 1 ist, desto näher ist es.

plt.hist(list_most_sim_value, bins=50)
Kombinieren Sie nun die nächstgelegenen Dokument-ID- und Ähnlichkeitswerte mit dem vorhandenen Datensatz.
new_doc_sim = pd.DataFrame({"sim_doc":list_most_sim_doc,"sim_value":list_most_sim_value})
data_200_sim = pd.concat([data_200, new_doc_sim], axis= 1)

Klicken Sie hier für die Top 3 Ähnlichkeiten. Alle sind über 0,8.

pd.reset_option('^display.', silent=True)
data_200_sim = data_200_sim.sort_values(by='sim_value', ascending=False).reset_index(drop=True)
data_200_sim.head(3)

s27.png

Inhalt der Fragestellung

Teil 1

Was ist das für ein Inhalt? Dokument 1 der 200. Nationalversammlung. Der Inhalt ist, warum das Medikament Gardacil nicht zugelassen ist.

idx=data_200_sim.index[1]
pd.set_option('display.max_colwidth', -1)
data_200_sim.iloc[idx:idx+1,:6]

s30.png Als nächstes ist das Dokument 1 der 200. Nationalversammlung das nächstgelegene Dokument im Modell. lange…. Der Inhalt handelt von der Zulassung eines Arzneimittels namens Iressa. Angemessenes Ergebnis.

idx=data_200_sim.index[0]
pd.set_option('display.max_colwidth', -1)
data_200_sim.iloc[idx:idx+1,:6]

s31.png

Teil 2

Dokument 2 der 200. Nationalversammlung. lange…. Der Inhalt besteht aus Konjunkturmaßnahmen, die auf der MMT-Theorie basieren.

idx=data_200_sim.index[0]
pd.set_option('display.max_colwidth', -1)
data_200_sim.iloc[idx:idx+1,:6]

s28.png Als nächstes ist das Dokument 2 der 200. Nationalversammlung das nächstgelegene Dokument im Modell. Länger ... Inhalt der Konjunkturmaßnahmen vorerst. Kein schlechtes Ergebnis.

idx=data_200_sim.index[0]
pd.set_option('display.max_colwidth', -1)
data_200_sim.iloc[idx:idx+1,:6]

s29.png

Teil 3

Dokument 3 der 200. Nationalversammlung. Der Inhalt handelt von der Begnadigung der Reiwa-Ära.

idx=data_200_sim.index[2]
pd.set_option('display.max_colwidth', -1)
data_200_sim.iloc[idx:idx+1,:6]

s32.png Das nächstgelegene Dokument im Modell handelt auch von der Gnade der Reiwa-Ära. Dies ist auch ein gutes Ergebnis.

idx=data_200_sim.sim_doc[2]
pd.set_option('display.max_colwidth', -1)
data.iloc[idx:idx+1,:6]

s33.png

abschließend

Die Datensuche machte unterwegs Spaß, und ich schrieb sie lange Zeit vergeblich, aber als ich Doc2Vec leicht ausprobierte, konnte ich die Ähnlichkeit für das neue Dokument, das als Fragestellung der 200. Diät bezeichnet wurde, ziemlich gut einschätzen. Ist es nicht? Trotzdem habe ich den Eindruck, dass die Welt, in der KI Fragen stellt, wie Herr Shinjiro Koizumi sagt, ein zukünftiges Ereignis ist, das nicht in der Nähe ist.

Dieses Mal habe ich versucht, Daten mit Doc2Vec zu suchen und Ähnlichkeiten zu beurteilen, aber in Zukunft werde ich Clustering durchführen, während ich die Daten der politischen Partei mische, und die "Qualität" der Frage beurteilen, die ich wirklich versuchen möchte Ich würde gerne ausprobieren. Insbesondere in Bezug auf die "Qualität" des Fragebogens denke ich, dass wir den Ton ändern können, dass die einfache Ausgabe einer großen Anzahl von Fragebögen zu Ergebnissen führt.

Ich habe einen Crawling- und Scraping-Datensatz in der Hand. Wenn also jemand diese Daten analysieren und analysieren möchte, hoffe ich, dass wir gemeinsam etwas tun können!

Recommended Posts

Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Trapezform des Bildes zu korrigieren
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, die Verschlechterung des Lithium-Ionen-Akkus mithilfe des Qore SDK vorherzusagen
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich habe versucht, den negativen Teil von Meros zu löschen
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, den Sieg oder die Niederlage der Premier League mit dem Qore SDK vorherzusagen
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Python-Übung 100 Schläge Ich habe versucht, den Entscheidungsbaum von Kapitel 5 mit graphviz zu visualisieren
Ich habe versucht, den Text in der Bilddatei mit Tesseract der OCR-Engine zu extrahieren
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
[Maschinelles Lernen] Ich habe versucht, die Theorie von Adaboost zusammenzufassen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe versucht, die Genauigkeit von Modellen für maschinelles Lernen mit Kaggle als Thema zu vergleichen.
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, die Infektion mit einer neuen Lungenentzündung mithilfe des SIR-Modells vorherzusagen: ☓ Wuhan ed. ○ Hubei ed.
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die Erstellung einer praktischen Umgebung mithilfe der SoftLayer-API der IBM Cloud zu automatisieren
Ich habe versucht, die checkio-API zu verwenden
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, mit Pandas eine Pferderenn-Datenbank zu erstellen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
Ich habe versucht, das SD-Boot-Image von LicheePi Nano zu erstellen
Ich wollte die Klassifizierung von CIFAR-10 mit dem Chainer-Trainer in Frage stellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe mir die Metainformationen von BigQuery angesehen und versucht, sie zu verwenden