[PYTHON] Ich habe versucht zu überprüfen, ob die Natural Language API (Emotionsanalyse) Net Slang unterstützt.

Überblick

--Einführung

Einführung

Ich bin süchtig nach emotionaler Analyse von Textdaten mit natürlicher Sprachverarbeitung. Dabei fiel es mir schwer, mit Net Slang umzugehen. Daher habe ich mich dieses Mal entschlossen, selbst zu überprüfen, ob der Emotionsanalysedienst (im Folgenden als API für natürliche Sprache bezeichnet) in der Google Cloud-API für natürliche Sprache Net Slang unterstützt. (Achtung) Wenn Sie es nur selbst überprüfen, wird nicht unbedingt festgestellt, ob die Natural Language API Net Slang unterstützt.

Bewertungsmethoden

Abhängig vom Satz dachte ich, dass "Lachen" durch "Gras" ersetzt werden könnte, also werde ich es zur Bewertung verwenden. Beispielsweise haben die folgenden Anweisungen dieselbe Bedeutung.

・ 3rt4 lacht gern in 3 Minuten ・ 3rt4 in 3 Minuten Wie Gras

Bereiten Sie mehrere Sätze vor und testen Sie, ob bei der Bewertung mit der API für natürliche Sprache ein Unterschied in der durchschnittlichen Punktzahl zwischen "Lachen" und "Gras" besteht.

Verfahren

Das Verfahren ist wie folgt.

  1. Sammeln Sie Textdaten mit der Twitter-API
  2. Vorverarbeitung für Textdaten
  3. Punktzahl mit der Natural Language API
  4. Führen Sie einen Test mit der erhaltenen Punktzahl durch

Sammeln Sie Textdaten mit der Twitter-API

Da eine Anwendung erforderlich ist, um die Twitter-API zu verwenden, habe ich mich beim Betrachten von [1] beworben. Der Antrag wurde an einem Tag gestellt.

Nachdem die Bewerbung bestanden wurde, erhalten wir die Textdaten. Es basiert auf dem Code in [2]. Da es eine Vorverarbeitung gibt, habe ich versucht, die erfassten Textdaten in eine Textdatei zu schreiben. Ich suche mit dem Suchbegriff "Lachen".

import json
from requests_oauthlib import OAuth1Session

#OAuth-Authentifizierungsteil
CK      = ""
CS      = ""
AT      = ""
ATS     = ""
twitter = OAuth1Session(CK, CS, AT, ATS)

url = 'https://api.twitter.com/1.1/search/tweets.json'

keyword = 'Lachen'
params ={
         'count' : 100,      #Anzahl der zu erhaltenden Tweets
         'q'     : keyword,  #Suchbegriff
         }

f = open('./data/1/backup1.txt','w')

req = twitter.get(url, params = params)
print(req.status_code)
if req.status_code == 200:
    res = json.loads(req.text)
    for line in res['statuses']:
        print(line['text'])
        f.write(line['text'] + '\n')
        print('*******************************************')
else:
    print("Failed: %d" % req.status_code)

Die Suchergebnisse sind wie folgt.

・ Sicher bin ich nicht am Veranstaltungsort, aber das Sumo-Wrestling lacht ・ Weil es ein Ort zum Lachen ist! Lachplatz! !! ・ Was ist das wwww lachen wwww

Vorverarbeitung

Ordnen Sie die erfassten Textdaten an. Hier sind vier Aufgaben zu erledigen.

  1. Entfernen unnötiger Zeichenfolgen wie "RT" und "@XXXX"
  2. Extrahieren Sie nur Zeilen mit Lachen aus Textdaten
  3. Beurteilung von "Lachen" ersetzt durch "Gras"
  4. Erstellen Sie einen Satz mit "Lachen" in "Gras" und setzen Sie ihn in csv zusammen

1 und 2 werden wie folgt implementiert. 2 hat möglicherweise einen Zeilenumbruch im Tweet, und ich hatte das Gefühl, dass es sehr schwierig ist, 3 zu machen, also habe ich ihn entfernt.

import re

readF = open('./data/1/backup1.txt','r')
writeF = open('./data/1/preprocessing1.txt','w')
lines = readF.readlines()
for line in lines:
    if 'Lachen' in line:
        #Entfernung von "RT"
        line = re.sub('RT ', "", line)
        #Entfernen von "@XXXX" oder "@XXXX"
        line = re.sub('(@\w*\W* )|(@\w*\W*)', "", line)
        writeF.write(line)
readF.close()
writeF.close()

3 war am schwierigsten. ・ "Lachen" steht am Ende des Satzes ・ Satz nach "Lachen" ・ "W" nach "Lachen" In einem solchen Fall dachte ich, dass es mit hoher Wahrscheinlichkeit durch "Gras" ersetzt werden könnte, aber ich dachte, dass die Daten voreingenommen sein würden. Am Ende wurde es manuell beurteilt. Von uns ermittelte Textdaten, die nicht ersetzt werden konnten, wurden entfernt.

Die Anzahl der Proben beträgt jetzt 200.

4 wurde wie folgt implementiert.

import csv
import pandas as pd
count = 6
lines = []
for i in range(count):
    print(i)
    readF = open('./data/'+ str(i+1) + '/preprocessing' + str(i+1) + '.txt')
    lines += readF.readlines()

df = pd.DataFrame([],columns=['warau', 'kusa'])
replaceLines = []
for line in lines:
    replaceLines.append(line.replace('Lachen', 'Gras'))
df["warau"] = lines 
df["kusa"] = replaceLines
df.to_csv("./data/preprocessing.csv",index=False)

Das bisherige Ergebnis der Verarbeitung ist in der folgenden Abbildung dargestellt. img1.png

Google Cloud Natural Language API Der Emotionsanalysedienst in der Google Cloud Natural Language API gibt den Emotionswert des Textes zurück. Je näher der Emotionswert an 1 liegt, desto positiver ist er und je näher er an -1 liegt, desto negativer ist er [3]. Neben Emotionsanalysediensten enthält die Google Cloud Natural Language API auch eine Inhaltsklassifizierung.

Das Programm wurde basierend auf [4] umgesetzt. Übergeben Sie die Sätze "Lachen" und "Gras" an die API für natürliche Sprache und speichern Sie die Ergebnisse in einer Liste. Fügen Sie es dann Pandas mit "warauResult" und "kusaResult" als Spaltennamen hinzu. Geben Sie abschließend die CSV-Datei aus.

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types
import os
import pandas as pd

credential_path = "/pass/xxx.json"
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credential_path

client = language.LanguageServiceClient()

warauResultList = []
kusaResultList = []

df = pd.read_csv('./data/preprocessing.csv')
count = 9
for index,text in df.iterrows():
    #\Entfernung von n
    text["warau"] = text["warau"].replace('\n', '')
    text["kusa"] = text["kusa"].replace('\n', '')
    
    #Warau-Analyse
    document = types.Document(
    content=text["warau"],
    type=enums.Document.Type.PLAIN_TEXT)
    sentiment = client.analyze_sentiment(document=document).document_sentiment
    warauResultList.append(sentiment.score)
    
    #Analyse von Kusa
    document = types.Document(
    content=text["kusa"],
    type=enums.Document.Type.PLAIN_TEXT)
    sentiment = client.analyze_sentiment(document=document).document_sentiment
    kusaResultList.append(sentiment.score)
    
df["warauResult"] = warauResultList
df["kusaResult"] = kusaResultList

df.to_csv("./data/result.csv",index=False)

Das bisherige Ergebnis der Verarbeitung ist in der folgenden Abbildung dargestellt. img2.png

Histogramm

Das Histogramm von warauResult lautet wie folgt. warauResult.png

Das Histogramm von kusaResult ist wie folgt. kusaResult.png

Angenommen, jeder folgt einer Normalverteilung.

Prüfung

Vergleichen Sie den in warauResult gespeicherten Wert mit dem in kusaResult gespeicherten Wert. Dieses Mal werden wir die durchschnittliche Differenz testen, wenn eine Übereinstimmung zwischen den Stichproben besteht. Ich bezog mich auf [5] und [6].

・ Nullhypothese ・ ・ ・ Die Punktzahl hat sich nicht geändert, auch wenn "Lachen" in "Gras" geändert wurde. ・ Oppositionshypothese: Die Punktzahl wurde geändert, indem "Lachen" in "Gras" geändert wurde.

Das Programm sieht folgendermaßen aus:

from scipy import stats
import pandas as pd
#Test der mittleren Differenz bei Übereinstimmung zwischen den Proben
df = pd.read_csv('./data/result.csv')
stats.ttest_rel(df["warauResult"], df["kusaResult"])

Die Ergebnisse sind wie folgt. Ttest_relResult(statistic=3.0558408995373356, pvalue=0.0025520814940409413)

Die Referenz für stats.ttest_rel lautet [7].

Zitat: "Wenn der p-Wert kleiner als der Schwellenwert ist, z. B. 1%, 5% oder 10%, dann lehnen wir die Nullhypothese gleicher Mittelwerte ab."

Mit anderen Worten, diesmal ist der p-Wert so klein wie etwa 2,5%, so dass die Nullhypothese verworfen wird. Daher änderte sich die Punktzahl, indem "Lachen" in "Gras" geändert wurde. Das Exemplar enthält nur Sätze mit "Lachen", die durch "Gras" (subjektiv) ersetzt werden können. Die Änderung der Punktzahl kommt jedoch zu dem Schluss, dass die Natural Language API nicht mit dem Net Slang kompatibel ist.

Ist die Anzahl der Proben ausreichend?

Schätzen Sie das durchschnittliche Intervall für warauResult und kusaResult. Ich bezog mich auf [8].

\begin{aligned}
\bar{X}-z_{\frac{\alpha}{2}}\sqrt{\frac{s^2}{n}} 
< \mu < 
\bar{X}+z_{\frac{\alpha}{2}}\sqrt{\frac{s^2}{n}}
\end{aligned}

Das Programm sieht folgendermaßen aus:

from scipy import stats
import math

print("Stichprobenmittel von warauResult",df['warauResult'].mean())

print("Beispieldurchschnitt von kusaResult",df['kusaResult'].mean())


#.var()Findet eine unvoreingenommene Streuung
print("WarauResult Intervallschätzung",stats.norm.interval(alpha=0.95, 
                    loc=df['warauResult'].mean(), 
                    scale=math.sqrt(df['warauResult'].var() / len(df))))
print("Intervallschätzung von kusaResult",stats.norm.interval(alpha=0.95, 
                    loc=df['kusaResult'].mean(), 
                    scale=math.sqrt(df['kusaResult'].var() / len(df))))

Die Ergebnisse sind wie folgt. Beispieldurchschnitt von warauResult 0,0014999993890523911 Stichprobenmittelwert von kusaResult -0.061000001728534696 WarauResult-Intervallschätzung (-0,0630797610044764, 0,06607975978258118) Intervallschätzung von kusaResult (-0,11646731178466276, -0,005532691672406637)

Fehlerbereich ・ WarauResult: Ungefähr ± 0,06458 ・ KusaResult: Ungefähr ± 0,05546

Der Bereich der emotionalen Bewertungen, die von der API für natürliche Sprache zurückgegeben werden, liegt zwischen 1 und -1. Ich dachte, dass der Fehler ± 0,06 in diesem Bereich klein war.

Übrigens können Sie die erforderliche Anzahl von Proben basierend auf dem Fehlerbereich erhalten, wie in [9] gezeigt. ・ Über warauResult ・ Konfidenzkoeffizient 95% ・ Fehlerbereich ± 0,06458 Zu diesem Zeitpunkt beträgt die Anzahl der Proben 200.

import numpy as np
#Da wir die Standardabweichung der Population nicht kennen, ersetzen wir die Quadratwurzel der unverzerrten Varianz.
rutoN = (1.96 *  np.sqrt(df['warauResult'].var()))/ 0.06458
N = rutoN * rutoN
print(N)

Die Ergebnisse sind wie folgt. 200.0058661538003

Verbesserungspunkte

・ Es ist nicht objektiv, da von einer Person beurteilt wird, ob "Lachen" durch "Gras" ersetzt werden kann. → Mit mehreren Personen auswerten

・ Die derzeitige Methode zur Datenerfassung kann keine große Anzahl von Proben erfassen. → Wenn Sie eine große Anzahl von Beispielen benötigen, suchen Sie ein Muster und ziehen Sie die Automatisierung in Betracht

・ So bestimmen Sie den Fehlerbereich → Ich möchte einen Grund für den Fehlerbereich

abschließend

Ich möchte auch nächstes Jahr am Adventskalender teilnehmen.

Referenz

[1]https://qiita.com/kngsym2018/items/2524d21455aac111cdee [2]https://qiita.com/tomozo6/items/d7fac0f942f3c4c66daf [3]https://cloud.google.com/natural-language/docs/basics#interpreting_sentiment_analysis_values [4]https://cloud.google.com/natural-language/docs/quickstart-client-libraries#client-libraries-install-python [5]https://bellcurve.jp/statistics/course/9453.html [6]https://ohke.hateblo.jp/entry/2018/05/19/230000 [7]https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.ttest_rel.html [8]https://ohke.hateblo.jp/entry/2018/05/12/230000 [9]https://toukeigaku-jouhou.info/2018/01/23/how-to-calculate-samplesize/

Recommended Posts

Ich habe versucht zu überprüfen, ob die Natural Language API (Emotionsanalyse) Net Slang unterstützt.
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, das Spiel in der J League vorherzusagen (Datenanalyse)
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Ich habe versucht, verschiedene Informationen von der Codeforces-API abzurufen
[Verarbeitung natürlicher Sprache] Ich habe diese Woche versucht, die aktuellen Themen in der Slack-Community zu visualisieren
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Ich habe versucht, eine Quip-API zu erstellen
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services mit Python zu überprüfen. # 1
Ich habe Teslas API berührt
Ich habe versucht, die Sprecheridentifikation mithilfe der Sprechererkennungs-API von Azure Cognitive Services in Python zu überprüfen. # 2
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, den Abschnitt zu schätzen.
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
Ich habe versucht, den besten Weg zu finden, um einen guten Ehepartner zu finden
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
[Linux] Ich habe versucht, die sichere Bestätigungsmethode von FQDN (CentOS7) zu überprüfen.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, das Ergebnis des A / B-Tests mit dem Chi-Quadrat-Test zu überprüfen
Ich habe versucht, den Befehl umask zusammenzufassen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe eine Web-API erstellt
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Lassen Sie die COTOHA-API die schwierigen Dinge tun - Einführung in das "Lernen mit" der Verarbeitung natürlicher Sprache -
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 3: Reguläre Ausdrücke 20 bis 24]
Ich habe versucht, den Urknall-Satz zu verifizieren [Kommt er zurück?]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 00-04]
Ich habe versucht, die 2020-Version von 100 Sprachverarbeitungsproblemen zu lösen [Kapitel 1: Vorbereitungsbewegung 05-09]
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe versucht, die Wetterkarte einer Clusteranalyse zu unterziehen
Ich habe versucht, die Qiita-API von Anfang an zu aktivieren
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe zuerst die SARS-Analyse vor dem Corona-Virus versucht
Die erste künstliche Intelligenz. Ich wollte die Verarbeitung natürlicher Sprache ausprobieren, daher werde ich die morphologische Analyse mit MeCab mit Python3 versuchen.
Qiita Job Ich habe versucht, den Job zu analysieren
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, Mr. Hanyu und Mr. Hanyu mit dem Verarbeiter der Verarbeitung natürlicher Sprache × Naive Bayes zu klassifizieren
Ich habe versucht, YouTube zu kratzen, aber ich kann die API verwenden, also tu es nicht.
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
[Erste Datenwissenschaft ⑤] Ich habe versucht, meinem Freund zu helfen, die erste Eigenschaft durch Datenanalyse zu finden
[Für Anfänger] Sprachanalyse mit dem Verarbeitungswerkzeug "GiNZA" (von der morphologischen Analyse bis zur Vektorisierung)
Ich habe versucht, die Syntax zu bewerten, die mit der COTOHA-API zu humorvoll und humorvoll war.
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren