Realizando análise de sentimento usando dados do Twitter!

Conteúdo

daddy-model-hwgigxe-rg4-unsplash-scaled-7021910

Foto de Daddy Mohlala no Unsplash

Dados são água, purificá-los para torná-los comestíveis é uma função do analista de dados: Rastogi Kashish

Tabela de conteúdo:

  • Exposição do problema
  • Descrição dos dados
  • Limpeza de texto com PNL
  • Descubra se o texto tem: com espaço
  • Limpeza de texto com biblioteca de pré-processador
  • Análise de sentimento dos dados
  • Visualização de dados

Estou pegando os dados do twitter que estão disponíveis aqui na plataforma DataPeaker.

Importação de bibliotecas

importar pandas como pd
importar re
import plotly.express as px
importar nltk
import Spacy

Estou carregando um modelo pequeno e espaçoso. Existem 3 tamanhos de modelo que você pode baixar spacy (pequeno, médio e grande) de acordo com seus requisitos.

nlp = spacy.load('en_core_web_sm')

Os dados são assim

df = pd.read_csv(r'localização do ficheiro')
do DF['id']
df.head(5)

Exposição do problema

O ponto principal é encontrar o sentimento dos dados de texto. O texto fornecido é de clientes de várias empresas de tecnologia que fazem telefones, laptops, aparelhos, etc. A tarefa é identificar se os tweets têm um sentimento negativo, positivo ou neutro em relação à empresa.

Descrição dos dados

Rótulo: A coluna de rótulo tem 2 valores únicos 0 e 1.

Pío: As colunas do tweet têm o texto fornecido pelos clientes

Manipulação de dados

Encontre a forma dos dados

Existem 2 colunas e 7920 filas.

df.shape

Classificação de tweets

fig = px.pie(df, names = df.label, buraco = 0,7, título ="Classificação de Tweets",
             altura = 250, color_discrete_sequence = px.colors.qualitative.T10)
fig.update_layout(margem = dict(t = 100, b = 40, l = 60, r = 40), 
                  plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                  title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                  font = dict(color ="#8a8d93"),
                  )

Reserve um momento e observe os dados. O que você vê?

magnet-me-ldcc7acwvlo-unsplash-scaled-2505564

Fonte da imagem: https://unsplash.com/photos/LDcC7aCWVlo

  • Não há marcação para analisar, é texto simples (¡Yaa!).
  • Existem muitas coisas para filtrar, como:
    • O identificador do Twitter está mascarado (@Nome do usuário), o que não tem utilidade para nós.
    • Etiquetas
    • Links (editar)
    • Caracteres especiais
  • Vemos que o texto tem valor numérico neles.
  • Existem muitos erros de digitação e contrações no texto.
  • Existem muitos nomes de empresas (Sony, maçã).
  • O texto não está em minúsculas

Vamos limpar o texto

Descubra se o texto tem:

  • Nomes de usuário do Twitter
  • Etiquetas
  • Valores numéricos
  • Links (editar)

Excluindo se o texto tiver:

  • Nome de usuário do Twitter porque você não fornecerá nenhuma informação adicional neste momento, já que por razões de segurança, nome de usuário foi alterado para nomes fictícios
  • Palavras de hashtag não fornecem nenhum significado útil para o texto na análise de sentimento.
  • O link do URL também não adicionará informações ao texto.
  • Removendo
    • Pontuação para texto limpo
    • Palavras mais curtas que 3 são seguros para remover do texto porque as palavras serão como (soja, soja, isto é) que não têm nenhum significado ou função específica no texto
    • Palavras irrelevantes são sempre a melhor opção para remover

Removendo Nome de usuário do texto

Faça uma função para remover o nome de usuário do texto com o simples encontrar tudo() função de pandas. Onde vamos selecionar as palavras que começam com ‘@’.

def remove_pattern(input_txt):
    r = re.findall(r"@(w +)", input_txt)
    para eu em r:
        input_txt = re.sub(eu, '', input_txt)      
    return input_txt
df['@_remove'] = np.vectorize(remove_pattern)(df['tweet'])
df['@_remove'][:3]
12663re-4321561

Encontrando Etiquetas no texto

Fazendo uma função para extrair hashtags de texto com o simples encontrar tudo() função de pandas. Onde vamos selecionar as palavras que começam com ‘#’ e armazená-los em um quadro de dados.

hashtags = []
def hashtag_extract(x):
    # Faça um loop sobre as palavras do tweet
    para i em x:
        ht = re.findall(r"#(w +)", eu)
        hashtags.append(ht)
    devolver hashtags
31434hash-7316011

Passando função e extraindo hashtags agora podemos visualizar quantas hashtags existem em tweets positivos e negativos

# extração de hashtags de tweets neg / pos
dff_0 = hashtag_extract(df['tweet'][df['label'] == 0])
dff_1 = hashtag_extract(df['tweet'][df['label'] == 1])
dff_all = hashtag_extract(df['tweet'][df['label']])
# lista desaninhada
dff_0 = soma(dff_0,[])
dff_1 = soma(dff_1,[])
dff_all = sum(dff_all,[])

Contando as hashtags frequentes usadas quando label = 0. FreqDist significa que nos dirá quantas vezes aquela palavra apareceu em todo o documento.

data_0 = nltk.FreqDist(dff_0)
data_0 = pd.DataFrame({'Hashtag': Lista(data_0.keys()),
                  'Count': Lista(data_0.values())}).sort_values(by='Count', ascendente = falso)
data_0[:5]
48203a1-2224066

Se você quiser saber mais sobre o Plotly e como usá-lo, visitas é Blog. Cada gráfico é bem explicado com diferentes parâmetros que você precisa ter em mente ao traçar gráficos.

fig = px.bar(data_0[:30], x='Hashtag', y='Count', altura = 250,
             título ="Principal 30 hashtags",
             color_discrete_sequence = px.colors.qualitative.T10)
fig.update_yaxes(showgrid = False),
fig.update_xaxes(ordem de categorias ="total descendente")
fig.update_traces(hovertemplate = Nenhum)
fig.update_layout(margem = dict(t = 100, b = 0, l = 60, r = 40), 
                  hovermode ="x unificado",
                  xaxis_tickangle = 300,
                  xaxis_title =" ", yaxis_title =" ",
                  plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                  title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                  font = dict(color ="#8a8d93")
                  )

Texto de passagem

sentenças = nlp(str(texto))

Encontrando Nortevalores numéricos no texto

spacy fornece funções como_num que indica se o texto tem valores numéricos ou não

para token em frases:
    if token.like_num:
        text_num = token.text
imprimir(text_num)
14763num-4155207

Encontrando Link de URL no texto

spacy fornece a função like_url que indica se o texto tem um link de url ou não

# encontrar links
para token em frases:
    if token.like_url:
        text_links = token.text
        imprimir(text_links)
43127url-1473338

Existe uma biblioteca em Python que ajuda a limpar o texto, você pode encontrar a documentação. aqui

Atualmente, esta biblioteca suporta limpeza, tokenização e análise

  • URLs
  • Etiquetas
  • Menções
  • Palavras reservadas (RT, FAV)
  • Emojis
  • Emoticons

Importando biblioteca

!pip instalar pré-processador de tweet
importar pré-processador como p

Chame uma função para limpar o texto

def preprocess_tweet(fileira):
    texto = linha['tweet']
    text = p.clean(texto)
    texto de retorno
df['clean_tweet'] = df.apply(preprocess_tweet, eixo = 1)
df[:6]
89383d1-7491773

Como vemos, colunas clean_tweet só têm texto, todos os nomes de usuário são removidos, hashtag e links de url

Algumas das etapas para limpeza ainda são como

  • baixando todo o texto
  • Removendo pontuações
  • Remova os números

Código:

def preprocessing_text(texto):
     # Faça minúsculas
     text = text.str.lower()
     # Remover pontuação
     text = text.str.replace('[^ ws]', '', regex = True)
     # Remover dígitos
     text = text.str.replace('[d]+', '', regex = True)
     texto de retorno
 pd.set_option('max_colwidth', 500)
 df['clean_tweet'] = preprocessing_text(df['clean_tweet'])
 df['clean_tweet'][:5]
81643d2-5017227

Temos nosso texto limpo, vamos remover as palavras vazias.

O que são palavras vazias? Você precisa remover as palavras irrelevantes?

Palavras irrelevantes são as palavras mais comuns em qualquer linguagem natural. Palavras vazias são como eu, soja, sua, quando, etc., não adicione nenhuma informação adicional ao texto.

Não há necessidade de remover palavras irrelevantes sempre que depender do estudo de caso, aqui estamos encontrando o sentimento do texto, então não precisamos parar as palavras.

de nltk.corpus import stopwords
# Remover palavras de parada
stop = stopwords.words('inglês')
df['clean_tweet'] = df['clean_tweet'].Aplique(lambda x: ' '.join([palavra por palavra em x.split() se a palavra não estiver em (Pare)]))
df['clean_tweet'][:5]
77187d3-3609472

Depois de implementar todas as etapas, obtivemos nosso texto limpo. Agora, O que fazer com o texto?

  • Podemos descobrir quais palavras são usadas com frequência?
  • Quais palavras são usadas mais negativamente / positivamente no texto?

Tokenizar palavras e calcular a frequência e contagem de palavras e armazená-los em um quadro de dados.

Uma distribuição de frequência registra o número de vezes que cada palavra ocorreu. Por exemplo, uma nova palavra tem sido usada com frequência em dados completos seguida por outras palavras iPhone, Telefone, etc.

a = df['clean_tweet'].str.cat(sep=' ')
words = nltk.tokenize.word_tokenize(uma)
word_dist = nltk.FreqDist(palavras)
dff = pd.DataFrame(word_dist.most_common(), 
                    colunas =['Word', 'Frequency'])
dff['Word_Count'] = dff.Word.apply(len)
dff[:5]
58134d4-8066235
fig = px.histogram(dff[:20], x='Word', y='Frequency', altura = 300, 
                   título ="Mais comum 20 palavras em tweets", color_discrete_sequence = px.colors.qualitative.T10)
fig.update_yaxes(showgrid = False),
fig.update_xaxes(ordem de categorias ="total descendente")
fig.update_traces(hovertemplate = Nenhum)
fig.update_layout(margem = dict(t = 100, b = 0, l = 70, r = 40),
                        hovermode ="x unificado",
                        xaxis_tickangle = 360,
                        xaxis_title =" ", yaxis_title =" ",
                        plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                        title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                        font = dict(color ="#8a8d93"),
                          )

fig = px.bar(dff.tail(10), x='Word', y='Frequency', altura = 300, 
                   título ="Menos comum 10 palavras em tweets", color_discrete_sequence = px.colors.qualitative.T10)
fig.update_yaxes(showgrid = False),
fig.update_xaxes(ordem de categorias ="total descendente")
fig.update_traces(hovertemplate = Nenhum)
fig.update_layout(margem = dict(t = 100, b = 0, l = 70, r = 40),
                        hovermode ="x unificado",
                        xaxis_title =" ", yaxis_title =" ",
                        plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                        title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                        font = dict(color ="#8a8d93"),
                          )
fig = px.bar(uma, altura = 300, título ="Frequência de palavras em tweets", 
             color_discrete_sequence = px.colors.qualitative.T10)
fig.update_yaxes(showgrid = False),
fig.update_xaxes(ordem de categorias ="total descendente")
fig.update_traces(hovertemplate = Nenhum)
fig.update_layout(margem = dict(t = 100, b = 0, l = 70, r = 40), showlegend = False,
                        hovermode ="x unificado",
                        xaxis_tickangle = 360,
                        xaxis_title =" ", yaxis_title =" ",
                        plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                        title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                        font = dict(color ="#8a8d93"),
                          )

Análise de sentimentos


from nltk.sentiment.vader import SentimentIntensityAnalyzer
from nltk.sentiment.util import *
#Análise de sentimentos
SIA = SentimentIntensityAnalyzer()
df["clean_tweet"]= df["clean_tweet"].astype(str)
# Aplicando modelo, Criação de Variável
df['Polarity Score']= df["clean_tweet"].Aplique(lambda x:SIA.polarity_scores(x)['compound'])
df['Neutral Score']= df["clean_tweet"].Aplique(lambda x:SIA.polarity_scores(x)['neu'])
df[Negative Score']= df["clean_tweet"].Aplique(lambda x:SIA.polarity_scores(x)['neg'])
df['Positive Score']= df["clean_tweet"].Aplique(lambda x:SIA.polarity_scores(x)['pos'])
# Convertendo 0 para 1 Pontuação decimal para uma variável categórica
df['Sentiment']=''
df.loc[df['Polarity Score']>0,'Sentiment']='Positive'
df.loc[df['Polarity Score']==0,'Sentiment']='Neutral'
df.loc[df['Polarity Score']<0,'Sentiment']='Negative'
df[:5]
93046senti-9804848

Classificação de tweets com base no sentimento

fig_pie = px.pie(df, nomes ="Sentimento", título ="Classificação de Tweets", altura = 250,
                 buraco = 0,7, color_discrete_sequence = px.colors.qualitative.T10)
fig_pie.update_traces(textfont = dict(color ="#fff"))
fig_pie.update_layout(margem = dict(t = 80, b = 30, l = 70, r = 40),
                      plot_bgcolor ="#2d3035", paper_bgcolor ="#2d3035",
                      title_font = dict(tamanho = 25, color ="#a5a7ab", familia ="Lado, sem serifa"),
                      font = dict(color ="#8a8d93"),
                      legend = dict(orientação ="h", yanchor ="fundo", y = 1, xanchor ="direito", x = 0,8)
                      )

conclusão:

Vimos como limpar dados de texto quando temos um nome de usuário do Twitter, hashtag, Links de URL, dígitos e fez análise de sentimento em dados de texto.

Vimos como descobrir se o texto contém links de URL ou dígitos com a ajuda de spacy.

Sobre o autor:

Você pode me conectar

Linkedin

Metade

A mídia mostrada neste artigo não é propriedade da DataPeaker e é usada a critério do autor.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.

Datapeaker