Python: analyse négative / positive: analyse négative / positive de Twitter à l'aide de RNN-Partie 1

Analyse négative / positive de Twitter à l'aide de RNN-Partie 1

Qu'est-ce que RNN

Il est difficile de juger négatif / positif en lisant le contexte de la phrase avec le dictionnaire polaire Une analyse correcte peut ne pas être possible.

Ici, à partir du flux de phrases utilisant le réseau de neurones récursif (RNN) Apprenez à effectuer une analyse négative / positive.

Parce que RNN peut mémoriser et apprendre des informations précédemment calculées Prédire le mot qui vient après la phrase Il est utilisé pour la traduction automatique en raison de la probabilité d'apparition des mots.

Bien sûr, vous pouvez le faire en japonais, mais en raison de la relation des données, je vais l'analyser en anglais cette fois.

Analyse négative / positive de Twitter

Puisque Twitter a une limite de 140 caractères L'utilisateur envoie une courte phrase.

Parce que vous pouvez obtenir beaucoup de données Il est utilisé pour l'analyse de divers traitements du langage naturel, y compris l'analyse négative et positive.

Cette fois, nous allons apprendre à utiliser les données Twitter sur la compagnie aérienne américaine. Pour les données, utilisez Airline Twitter sentiment distribué par Figure Eight.

Cliquez ici pour Licence

import pandas as pd

Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text', 'airline_sentiment']]
print(tweetData)

image.png

Créer une base de données

Supprimer les mots fréquents

RNN analyse la pertinence des mots, vous devez donc supprimer les mots fréquemment utilisés.

Des mots fréquemment utilisés comme I et ce qu'on appelle des mots vides. Le moteur de recherche de Google exclut les mots vides de la cible de recherche pour augmenter la pertinence des autres mots.

De plus, les mots @ et flight, qui signifient réponse, apparaissent fréquemment sur Twitter. Créez des données avec ces mots supprimés.

import nltk
import numpy as np
import pandas as pd
import re
from nltk.corpus import stopwords
#Si vous obtenez une erreur avec les mots vides, veuillez exécuter ↓
#
#nltk.download('stopwords')

#Charger les données du Tweet
Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

#Effectue une analyse morphologique du Tweet anglais
def tweet_to_words(raw_tweet):
    
    # a~Créer une liste de mots commençant par z séparés par des espaces
    letters_only = re.sub("[^a-zA-Z@]", " ",raw_tweet) 
    words = letters_only.lower().split()
    
    # '@'Quand'flight'が含まれる文字Quandストップワードを削除します
    stops = set(stopwords.words("english"))  
    meaningful_words = [w for w in words if not w in stops and not re.match("^[@]", w) and not re.match("flight",w)] 
    return( " ".join( meaningful_words )) 

cleanTweet = tweetData['text'].apply(lambda x: tweet_to_words(x))
print(cleanTweet)

image.png

Créer une base de données de mots

Pour découvrir quels mots affectent les négatifs et les positifs Créez une base de données de tous les mots une fois.

Nous utilisons cette base de données pour étiqueter des mots fréquemment et négativement et positivement.

import nltk
import numpy as np
import pandas as pd
import re
from nltk.corpus import stopwords

Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

def tweet_to_words(raw_tweet):
    
    # a~Créer une liste de mots commençant par z séparés par des espaces
    letters_only = re.sub("[^a-zA-Z@]", " ",raw_tweet) 
    words = letters_only.lower().split()
    
    # '@'Quand'flight'が含まれる文字Quandストップワードを削除します
    stops = set(stopwords.words("english"))  
    meaningful_words = [w for w in words if not w in stops and not re.match("^[@]", w) and not re.match("flight",w)] 
    return( " ".join( meaningful_words )) 

cleanTweet = tweetData['text'].apply(lambda x: tweet_to_words(x)) 

#Créer une base de données
all_text = ' '.join(cleanTweet)
words = all_text.split()
print(words)

image.png

Numérisez les mots

Un marquage numérique est effectué sur chaque mot en fonction du nombre d'occurrences du mot. De plus, nous allons créer une nouvelle liste en numérisant la chaîne de caractères cleanTweet utilisée pour l'apprentissage cette fois.

import nltk
import numpy as np
import pandas as pd
import re
from nltk.corpus import stopwords
from collections import Counter

Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

def tweet_to_words(raw_tweet):
    
    # a~Créer une liste de mots commençant par z séparés par des espaces
    letters_only = re.sub("[^a-zA-Z@]", " ",raw_tweet) 
    words = letters_only.lower().split()
    
    # '@'Quand'flight'が含まれる文字Quandストップワードを削除します
    stops = set(stopwords.words("english"))  
    meaningful_words = [w for w in words if not w in stops and not re.match("^[@]", w) and not re.match("flight",w)] 
    return( " ".join( meaningful_words )) 

cleanTweet = tweetData['text'].apply(lambda x: tweet_to_words(x))

#Créer une base de données
all_text = ' '.join(cleanTweet)
words = all_text.split()

#Comptez le nombre de fois qu'un mot apparaît
counts = Counter(words)
#Trier par ordre décroissant
vocab = sorted(counts, key=counts.get, reverse=True)
vocab_to_int = {word: ii for ii, word in enumerate(vocab, 1)}
#print(vocab_to_int)
#Stocke la chaîne numérisée dans une nouvelle liste
tweet_ints = []
for each in cleanTweet:
    tweet_ints.append([vocab_to_int[word] for word in each.split()])
    
print(tweet_ints)

image.png

Quantification négative / positive

Quantifiez l'évaluation négative / positive donnée pour chaque phrase. Cette fois, il est converti en négatif = 0, positif = 1, neutre = 2.

Ce nombre négatif / positif est utilisé lors de l'apprentissage de phrases générées à partir de mots.

import numpy as np
import pandas as pd

#Charger les données du Tweet
Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

#Tweet négatif/Convertit une chaîne positive en nombre
labels = np.array([0 if each == 'negative' else 1 if each == 'positive' else 2 for each in tweetData['airline_sentiment'][:]]) 

print(labels)

Aligner le nombre de colonnes

Dans les tweet_ints créés, le nombre de mots différents est stocké pour chaque tweet.

Vous devez aligner les colonnes de la liste au fur et à mesure que vous apprenez. De plus, les lignes dont le nombre de mots est devenu 0 en raison du processus cleanTweet sont supprimées de chaque liste.

from collections import Counter

#Le contenu du code de la section précédente-------------------------
import numpy as np
import pandas as pd

#Charger les données du Tweet
Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

#Tweet négatif/Convertit une chaîne positive en nombre
labels = np.array([0 if each == 'negative' else 1 if each == 'positive' else 2 for each in tweetData['airline_sentiment'][:]])

# ----------------------------------------

#Stocke la chaîne numérisée dans une nouvelle liste
tweet_ints = []
for each in cleanTweet:
    tweet_ints.append([vocab_to_int[word] for word in each.split()])

#Découvrez le nombre de mots dans Tweet
tweet_len = Counter([len(x) for x in tweet_ints])
print(tweet_len)
seq_len = max(tweet_len)
print("Zero-length reviews: {}".format(tweet_len[0]))
print("Maximum review length: {}".format(max(tweet_len)))

#Supprimer les lignes avec 0 mot de chaque liste avec cleanTweet
tweet_idx  = [idx for idx,tweet in enumerate(tweet_ints) if len(tweet) > 0]
labels = labels[tweet_idx]
tweetData = tweetData.iloc[tweet_idx]
tweet_ints = [tweet for tweet in tweet_ints if len(tweet) > 0]

#Créez un cadre avec des mots quantifiés sur i-row écrits à partir de la droite pour aligner le nombre de colonnes
features = np.zeros((len(tweet_ints), seq_len), dtype=int)
for i, row in enumerate(tweet_ints):
    features[i, -len(row):] = np.array(row)[:seq_len]

print(features)

image.png

Résumé

Créer un ensemble de données à partir des données de Tweet

1,Chargement des données du Tweet

2,Analyse morphologique des données de Tweet

3,Créer une base de données de mots

4,traits(Base de données)Création
import nltk
import numpy as np
import pandas as pd
import re
from collections import Counter
from nltk.corpus import stopwords

#Charger les données du Tweet
Tweet = pd.read_csv('./6020_negative_positive_data/data/Airline-Sentiment-2-w-AA.csv', encoding='cp932')
tweetData = Tweet.loc[:,['text','airline_sentiment']]

#Effectue une analyse morphologique du Tweet anglais
def tweet_to_words(raw_tweet):
    
    # a~Créer une liste de mots commençant par z séparés par des espaces
    letters_only = re.sub("[^a-zA-Z@]", " ",raw_tweet) 
    words = letters_only.lower().split()
    
    # '@'Quand'flight'が含まれる文字Quandストップワードを削除します
    stops = set(stopwords.words("english"))  
    meaningful_words = [w for w in words if not w in stops and not re.match("^[@]", w) and not re.match("flight",w)] 
    return( " ".join(meaningful_words)) 

cleanTweet = tweetData['text'].apply(lambda x: tweet_to_words(x))

#Créer une base de données
all_text = ' '.join(cleanTweet)
words = all_text.split()

#Comptez le nombre de fois qu'un mot apparaît
counts = Counter(words)

#Trier par ordre décroissant
vocab = sorted(counts, key=counts.get, reverse=True)
vocab_to_int = {word: ii for ii, word in enumerate(vocab, 1)}

#Stocke la chaîne numérisée dans une nouvelle liste
tweet_ints = []
for each in cleanTweet:
    tweet_ints.append([vocab_to_int[word] for word in each.split()])

#Découvrez le nombre de mots dans Tweet
tweet_len = Counter([len(x) for x in tweet_ints])
seq_len = max(tweet_len)
print("Zero-length reviews: {}".format(tweet_len[0]))
print("Maximum review length: {}".format(max(tweet_len)))

#Supprimer les lignes avec 0 mot de chaque liste avec cleanTweet
tweet_idx  = [idx for idx,tweet in enumerate(tweet_ints) if len(tweet) > 0]
tweet_ints = [tweet for tweet in tweet_ints if len(tweet) > 0]

#Créez un cadre avec des mots quantifiés sur i-row écrits à partir de la droite pour aligner le nombre de colonnes
features = np.zeros((len(tweet_ints), seq_len), dtype=int)
for i, row in enumerate(tweet_ints):
    features[i, -len(row):] = np.array(row)[:seq_len]
print(features)

Recommended Posts

Python: analyse négative / positive: analyse négative / positive de Twitter à l'aide de RNN-Partie 1
Analyse négative / positive 2 Analyse négative / positive Twitter (1)
Analyse négative / positive 3 Analyse négative / positive de Twitter (2)
Python: analyse négative / positive: application d'analyse de texte
Rechercher sur Twitter avec Python
Publier sur Twitter en utilisant Python
Analyse de données à l'aide de pandas python
Analyse négative / positive 1 Application de l'analyse de texte
Tutoriel de recommandation utilisant l'analyse d'association (implémentation python)
Création d'un classificateur négatif / positif à l'aide de BERT
Analyse de la variation temporelle des trous noirs en utilisant Python
twitter avec python3
Analyse de données python
Effectuer une analyse d'entité à l'aide de spaCy / GiNZA en Python
Raclage et analyse positive négative des articles en ligne Bunharu
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
Scraping à l'aide de Python
Explication du concept d'analyse de régression à l'aide de python Partie 2
[Python] [Word] [python-docx] Analyse simple des données de diff en utilisant python
Collecte d'informations sur Twitter avec Python (analyse morphologique avec MeCab)
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Analyse des composants principaux à l'aide de python de nim avec nimpy
Explication du concept d'analyse de régression à l'aide de Python Extra 1
[Livre technique] Introduction à l'analyse de données avec Python -1 Chapitre Introduction-
Python: analyse des séries chronologiques
Analyse des données à l'aide de xarray
Manipuler Redmine à l'aide de Python Redmine
Séquence de Fibonacci utilisant Python
Présentation de l'analyse de données python
Analyse vocale par python
Nettoyage des données à l'aide de Python
Utilisation des packages Python #external
Calcul de l'âge à l'aide de python
Modèle d'analyse de données Python
Analyse d'association en Python
Analyse orthologue à l'aide d'OrthoFinder
Identification de nom à l'aide de python
Notes sur l'utilisation de sous-processus Python
Analyse vocale par python
Essayez d'utiliser Tweepy [Python2.7]
Analyse de données avec Python
Analyse de régression avec Python
[Introduction] Analyse de données satellitaires artificielles à l'aide de Python (environnement Google Colab)
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)