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.
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)
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)
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)
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)
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)
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)
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)