English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Aprendizado de algoritmos de extração de características de texto e vectorização em Python

Este artigo compartilha o código específico de extração de características de texto e vectorização em Python, para referência, conforme o seguinte conteúdo

Supondo que acabamos de assistir ao grande filme de Nolan 'Interestelar', imagine como o machine learning pode analisar automaticamente as avaliações dos espectadores sobre o filme, se são 'positivas' (positive) ou 'negativas' (negative)?

Este tipo de problema pertence ao problema de análise de sentimentos. O primeiro passo para lidar com este tipo de problema é transformar o texto em características.

Portanto, neste capítulo, nos concentramos apenas no primeiro passo, como extrair características do texto e transformá-las em vetores.

Devido ao processamento de chinês envolver problemas de segmentação de palavras, este artigo usa um exemplo simples para explicar como usar a biblioteca de aprendizado de máquina do Python para extrair características de textos em inglês.

1、preparação de dados

O sklearn.datasets de Python suporta a leitura de todos os textos classificados a partir de um diretório. No entanto, o diretório deve ser organizado de acordo com a regra de um diretório por nome de rótulo. Por exemplo, o conjunto de dados usado neste artigo tem2um rótulo, um é 'net', um é 'pos', cada diretório tem6um arquivo de texto. O diretório é mostrado da seguinte forma:

neg
    1.txt
    2.txt
    ......
pos
    1.txt
    2.txt
    ....

12O conteúdo do arquivo é resumido da seguinte forma:

neg: 
  lixo. 
  perdi meu dinheiro. 
  perda de dinheiro. 
  filme de merda. 
  perda de tempo. 
  um filme lixo. 
pos: 
  nb! nb movie! 
  nb! 
  worth my money. 
  I love this movie! 
  a nb movie. 
  worth it! 

2、características de texto

Como extrair atitudes emocionais desses textos em inglês e fazer classificação?

A maneira mais direta é extrair palavras. Comumente se acredita que muitos termos-chave podem refletir a atitude do falante. Por exemplo, neste conjunto de dados simples, é fácil descobrir que quem disse 'shit' pertence ao negativo.

Claro, o conjunto de dados mencionado acima foi projetado de maneira simples para facilitar a descrição. Na realidade, uma palavra frequentemente tem uma atitude ambígua. No entanto, ainda há razão para acreditar que quanto mais uma palavra aparecer na classe neg, maior é a probabilidade de que ela represente uma atitude negativa.
Também notamos que algumas palavras são sem significado para a classificação de sentimentos. Por exemplo, as palavras 'of', 'I' mencionadas acima. Essas palavras têm um nome, chamado de “Stop_Word”(stop word). Esses tipos de palavras podem ser completamente ignorados na estatística. Claramente, ignorar essas palavras pode otimizar o espaço de armazenamento do registro de frequência de palavras e acelerar a construção.
Tornar a frequência de cada palavra um importante caractere também traz um problema. Por exemplo, a palavra 'movie' mencionada acima, em12nos exemplos.5vezes, mas apareceu tanto em lados positivos quanto negativos, não tendo muita distinção. Enquanto isso, a palavra 'worth' apareceu2vezes, mas apareceu apenas na classe pos, o que indica uma forte cor de céu, ou seja, uma alta distinção.

Portanto, precisamos introduzirTF-IDF(Frequência de Termo-Inverse Document Frequency,Frequência de Palavra e Frequência Inversa de Documento) considerar cada palavra de maneira mais detalhada.

TF (Frequency of Word)A calcular é muito simples, é a frequência com que uma palavra Nt aparece em um documento t. Por exemplo, no documento 'I love this movie', a frequência TF da palavra 'love' é1/4. Se removemos o stop word 'I' e 'it', então1/2.

IDF (Frequency of Inverse Document)O significado é, para uma palavra t, o número de documentos Dt que contêm essa palavra, representando a proporção de todos os documentos de teste D, e então tomar o logaritmo natural.
por exemplo, a palavra 'movie' apareceu5vezes, enquanto o número total de documentos é12,portanto, o IDF é ln(5/12).
Claramente, o IDF é para destacar palavras que aparecem pouco, mas têm forte carga emocional. Por exemplo, a palavra 'movie' tem IDF = ln(12/5)=0.88,é significativamente menor do que o IDF de 'love' = ln(12/1)=2.48.

TF-IDFBasta multiplicá-los simplesmente. Dessa forma, podemos calcular o TF (Frequência de Palavra) de cada palavra em cada documento.-IDF, é o valor de característica de texto extraído.

3、向量化

Com a base mencionada acima, podemos quantificar o documento. Vamos primeiro olhar para o código e, em seguida, analisar o significado da quantificação:

# -*- coding: utf-8 -*- 
import scipy as sp 
import numpy as np 
from sklearn.datasets import load_files 
from sklearn.cross_validation import train_test_split 
from sklearn.feature_extraction.text import TfidfVectorizer 
'''Carregar conjunto de dados, dividir conjunto de dados80% de treinamento20% de teste 
movie_reviews = load_files('endata')  
doc_terms_train, doc_terms_test, y_train, y_test\ 
  = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3) 
'''Modelo de espaço vetorial booleano, atente-se, o chamado de amostra de teste é o interface transform''' 
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\ 
              stop_words = 'english' 
x_train = count_vec.fit_transform(doc_terms_train) 
x_test = count_vec.transform(doc_terms_test) 
x    = count_vec.transform(movie_reviews.data) 
y    = movie_reviews.target 
print(doc_terms_train) 
print(count_vec.get_feature_names()) 
print(x_train.toarray()) 
print(movie_reviews.target) 

Os resultados da execução são os seguintes:
["perda de tempo.", "um filme lixo.", "um ótimo filme.", "Adoro esse filme!", "lixo.", "vale o dinheiro.", "um filme medíocre.", "vale a pena!"]
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0.          0.          0.          0.          0.          0.   0.70710678  0.70710678  0.        ]
 [ 0.          0.          0.60335753  0.          0.          0.79747081   0.          0.          0.        ]
 [ 0.          0.          0.53550237  0.84453372  0.          0.          0.   0.          0.        ]
 [ 0.84453372  0.          0.53550237  0.          0.          0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          1.          0.   0.          0.        ]
 [ 0.          0.76642984  0.          0.          0.          0.          0.   0.          0.64232803]
 [ 0.          0.          0.53550237  0.          0.84453372  0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.          0.   0.          1.        ]]
[1 1 0 1 0 1 0 1 1 0 0 0]

A saída do python é muito confusa. Aqui está uma tabela que fiz:

Do gráfico acima, podemos observar os seguintes pontos:

1Filtragem de termos de parada.

Ao inicializar o count_vec, passamos stop_words = 'english' no construtor do count_vec, o que indica o uso dos termos de parada padrão em inglês. Você pode usar count_vec.get_stop_words() para verificar todos os termos de parada internos do TfidfVectorizer. Claro, você pode passar sua própria lista de termos de parada (por exemplo, 'movie')

2e TF-IDF ao cálculo básico de frequência de palavras.

Aqui, o cálculo da frequência de palavras usa o TfidfVectorizer do sklearn. Esta classe herda do CountVectorizer, adicionando funcionalidades como TF-funções como IDF.
Descobriremos que os resultados calculados aqui são um pouco diferentes dos calculados anteriormente. Porque ao construir count_vec, o valor padrão passado é max_df=1Portanto, TF-IDF foram tratados para padronização, para que todos os valores sejam restringidos a [0,1entre

3entre. O resultado de count_vec.fit_transform é uma matriz enorme. Podemos ver que há muitos 0 na tabela acima, então o sklearn usa matrizes esparsas internamente. Este exemplo de dados é pequeno. Se os leitores estiverem interessados, podem experimentar dados reais usados por pesquisadores de aprendizado de máquina, provenientes da Universidade de Cornell:http://www.cs.cornell.edu/people/pabo/movie-review-data/. Este site oferece muitos conjuntos de dados, alguns dos quais2um banco de dados de M, exemplos positivos e negativos7cerca de 00. Tamanho de dados assim não é grande1minutos ainda pode ser concluído, recomendo que você experimente. No entanto, atenção, esses conjuntos de dados podem conter caracteres ilegais. Portanto, ao construir count_vec, passe decode_error = 'ignore' para ignorar esses caracteres ilegais.

Os resultados na tabela acima são os resultados de treinamento8dos exemplos8um resultado de uma característica. Este resultado pode ser classificado usando várias algoritmos de classificação.

Isso é tudo sobre o conteúdo deste artigo. Esperamos que isso ajude no seu aprendizado e que você apóie o tutorial Yell.

Declaração: O conteúdo deste artigo foi extraído da internet, pertence ao respectivo proprietário. O conteúdo foi contribuído e carregado voluntariamente pelos usuários da internet. Este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por eventuais questões legais. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#oldtoolbag.com (ao enviar e-mail, substitua # por @ para denunciar e forneça provas relevantes. Apenas após a verificação, o site deletará o conteúdo suspeito de violação de direitos autorais.)

Você também pode gostar