--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.
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.
Das Verfahren ist wie folgt.
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
Ordnen Sie die erfassten Textdaten an. Hier sind vier Aufgaben zu erledigen.
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.
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.
Das Histogramm von warauResult lautet wie folgt.
Das Histogramm von kusaResult ist wie folgt.
Angenommen, jeder folgt einer Normalverteilung.
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.
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
・ 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
Ich möchte auch nächstes Jahr am Adventskalender teilnehmen.
[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