[PYTHON] Erstellt eine Chrome-Erweiterung, die die Möglichkeiten der Verarbeitung natürlicher Sprache nutzt, um dunkle Websites aus der Welt zu vertreiben

Motivation

Ausbruch des Corona-Virus und heutzutage nur dunkle Nachrichten ...: schwerwiegend: → Wenn Sie nur die guten Nachrichten sehen, sollten Sie sich positiv fühlen!

Was ich gemacht habe

Eine Chrome-Erweiterung, die es schwieriger macht, Google-Suchergebnisse zu sehen, wenn der Inhalt dunkler wird. Chrome Store: Opty github

Aktueller Bildschirm

Dunkle Seite Helle Seite
Screenshot 2020-04-22 11.01.17.png Screenshot 2020-04-22 11.03.22.png

Wie benutzt man

Installieren Sie einfach die Chrome-Erweiterung von hier und suchen Sie! Referenz: So installieren Sie die Erweiterung

Umgebung

Personal: 2 Studenten (Tomohiro Inoue, Goshi Watanabe) Produktionsdauer: 1 Tag Cloud Functions Python 3.7 JavaScript MeCab

Systemkonfiguration

図.png

Helligkeitsbeurteilung

Teilen Sie einen Satz in Wörter auf und beurteilen Sie, ob jedes Element hell oder dunkel ist.

MeCab wird verwendet, um Sätze in Wörter zu zerlegen. Zum Beispiel

morph.py


import MeCab

tagger = MeCab.Tagger()
result = tagger.parse('Das neue Koronavirus ist weltweit ausgebrochen.')
print(result)

Wenn Sie den Prozess ausführen

Neue Nomenklatur,Allgemeines,*,*,*,*,Neues Modell,Singata,Singata
Corona Substantiv,Allgemeines,*,*,*,*,Corona,Corona,Corona
Virus Nomen,Allgemeines,*,*,*,*,Virus,Virus,Virus
Ist ein Assistent,Fallassistent,Allgemeines,*,*,*,Aber,Ga,Ga
Welt Nomen,Allgemeines,*,*,*,*,Welt,Sekai,Sekai
Zielnomenklatur,Suffix,Adjektiv Verbstamm,*,*,*,Ziel,Text,Text
Hilfs,Adjunct,*,*,*,*,Zu,D.,D.
Großes Präfix,Nomenverbindung,*,*,*,*,Groß,sterben,sterben
Trendige Nomenklatur,Verbindung ändern,*,*,*,*,Trend,Ryukou,Ryuko
Shi Verb,Unabhängigkeit,*,*,Sahen / Suru,Kontinuierlicher Typ,Machen,Shi,Shi
Der Assistent,Verbindungsassistent,*,*,*,*,Hand,Te,Te
Ich verb,Nicht unabhängig,*,*,Ein Schritt,Kontinuierlicher Typ,Ist,ich,ich
Masu Hilfsverb,*,*,*,Spezial / Masse,Grundform,Masu,Forelle,Forelle
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS

Es ist wie zerlegt. Extrahieren Sie die nicht verwendete Form jedes Wortes aus dem zerlegten Ergebnis und verwenden Sie es.

[Japanisches Bewertungspolaritätswörterbuch](http://www.cl.ecei.tohoku.ac.jp/index.php?Open], veröffentlicht vom Inui Suzuki Laboratory der Tohoku University zur Bestimmung der Helligkeit von Elementen % 20Resources% 2FJapanese% 20Sentiment% 20Polarity% 20Dictionary) wurde verwendet.

In diesem Wörterbuch werden japanische Wörter in positiv (hell) oder negativ (dunkel) eingeteilt, und die Nomenklatur wird in drei Ebenen eingeteilt: p (positiv), n (negativ) und e (keine).

wago.121808.pn


Negativ (Erfahrung)
Negativ (Erfahrung) aufgeben
Negativ (Erfahrung)
Negativ (Erfahrung)
Negativ (Erfahrung)

pn.csv.m3.120408.trim


Danke p ~ Es gibt / verbessert (Existenz / Natur)
Danke p ~ Es gibt / verbessert (Existenz / Natur)
Danke Ärger n ~ wird / wird (Bewertung / Emotion) subjektiv
So sein wie es ist (Bewertung / Gefühl) Subjektivität
Wie es ist, wird / wird (Bewertung / Emotion) subjektiv

Jede Komponente des Satzes wird durch 1 ersetzt, wenn sie positiv ist, -1, wenn sie negativ ist, und ansonsten durch 0, und der Durchschnitt wird als Helligkeit des Satzes verwendet.

Nachfolgend sind die Punkte aufgeführt, auf die ich während der Entwicklung gestoßen bin.

Stolperpunkt 1: Polaritätswörterbuch ≠ Helligkeit für jedes Wort

Ich dachte leicht, ich sollte den Satz in Wörter unterteilen und das Polaritätswörterbuch mit den Wörtern als Schlüssel durchsuchen, aber es war nicht so einfach. Im Polaritätswörterbuch wird nicht nur ein einzelnes Wort wie "gut" registriert, sondern auch ein Element, das aus zwei oder mehr Wörtern besteht (in diesem Fall "gut" + "nicht"), wie "schlecht". Aus diesem Grund habe ich das Wörterbuch so umstrukturiert, dass es nach Elementen durchsucht werden kann, die aus mehreren Wörtern bestehen, und es vor der Verwendung in Eingriff gebracht.

main.py


    #Im Wörterbuch speichern
    for line in pn_noun_file:
        line = line.replace('\n', '').split('\t')
        if line[1] == 'e': #Ignorieren Sie Linien, die weder positiv noch negativ sind
            continue
        #Eine Liste von Wörtern, die im Polaritätswörterbuch registriert sind und in Grundformen konvertiert wurden
        basic_form = convert_to_basic_form(line[0]) 
        #Ignorieren Sie Zeilen, für die die Grundform nicht erhalten werden kann, und Zeilen, für die die Grundform ein Zeichen ist
        if not basic_form:
            continue
        elif len(basic_form) == 1 and len(basic_form[0]) == 1:
            continue
        key = basic_form[0]
        if key not in pn_dict:
            pn_dict[key] = {}
        #Gespeichert als eine Kombination aus Helligkeit und einer Kombination von Grundformen
        pn_dict[key][(',').join(basic_form)] = 1 if line[1] == 'p' else - 1

Stolperpunkt 2: Nicht lustig = positiv?

Während "schlecht" als negatives Element im Polaritätswörterbuch registriert ist, wird "nicht lustig" nicht registriert, so dass es als positives Wort beurteilt wird, indem nur auf den Teil "Spaß" reagiert wird. Es war. Wenn dies nicht der Fall ist, wird der Helligkeitswert des vorherigen Teils invertiert.

main.py


#PN Urteil. Gibt den durchschnittlichen PN-Wert des angeforderten Elements zurück.
def calc_pn(basic_form):
    pn_dict = pickle.load(open('pn.pkl', 'rb'))
    pn_values = [] #Speichert den PN-Beurteilungswert jedes Elements im Text

    while basic_form:
        pn_value = 0
        del_num = 1  #Nummer, die aus der Liste entfernt werden soll
        beginning = basic_form[0] #Setzen Sie das erste Wort auf Schlüssel

        if beginning in pn_dict:
            for index, word in enumerate(basic_form):
                if word == "。" or word == "、":  #Wenn der Satz bricht, hören Sie auf
                    break
                if index == 0:
                    joined_basic_forms = beginning
                else:
                    joined_basic_forms += ',' + word

                if word == "Abwesend" and del_num == index: #Positive negative Umkehrung erforderlich
                    print('reverse')
                    pn_value *= -1
                    del_num = index + 1

                if joined_basic_forms in pn_dict[beginning]:
                    pn_value = pn_dict[beginning][joined_basic_forms]
                    del_num = index + 1

        pn_values.append(pn_value)
        del basic_form[0:del_num]

    return sum(pn_values) / len(pn_values)

Verbesserungspunkte

Schließlich

Ich hatte etwas Zeit, um auf Korona zu verzichten, also machte ich es als Studie während der Frühlingsferien. Andere sind in Entwicklung! Wenn Sie möchten, folgen Sie bitte LGTM und Twitter!

Erweiterung: Opty Twitter: Tomohiro Inoue, Takeshi Watanabe

Verweise

  1. Ich habe einen Edelstein gemacht, um negativ / positiv zu beurteilen

Recommended Posts

Erstellt eine Chrome-Erweiterung, die die Möglichkeiten der Verarbeitung natürlicher Sprache nutzt, um dunkle Websites aus der Welt zu vertreiben
[Verarbeitung natürlicher Sprache] Ich habe versucht, die Bemerkungen jedes Mitglieds in der Slack-Community zu visualisieren
Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit
So schreiben Sie einen Test für die Verarbeitung mit BigQuery
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
[Word2vec] Lassen Sie uns das Ergebnis der Verarbeitung von Unternehmensbewertungen in natürlicher Sprache visualisieren
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
[Python] Ein Programm, das den Inhalt der Liste nach links dreht