Python Web Scraping - Lidando com Texto
No capítulo anterior, vimos como lidar com vídeos e imagens que obtemos como parte do conteúdo de web scraping. Neste capítulo, vamos lidar com a análise de texto usando a biblioteca Python e aprenderemos sobre isso em detalhes.
Introdução
Você pode realizar a análise de texto usando a biblioteca Python chamada Natural Language Tool Kit (NLTK). Antes de prosseguirmos nos conceitos de NLTK, vamos entender a relação entre análise de texto e web scraping.
A análise das palavras do texto pode nos levar a saber quais palavras são importantes, quais palavras são incomuns, como as palavras são agrupadas. Essa análise facilita a tarefa de web scraping.
Primeiros passos com NLTK
O Kit de ferramentas de linguagem natural (NLTK) é uma coleção de bibliotecas Python projetadas especialmente para identificar e marcar classes gramaticais encontradas no texto de linguagem natural como o inglês.
Instalando NLTK
Você pode usar o seguinte comando para instalar o NLTK em Python -
pip install nltk
Se você estiver usando o Anaconda, então um pacote conda para NLTK pode ser construído usando o seguinte comando -
conda install -c anaconda nltk
Baixando dados do NLTK
Depois de instalar o NLTK, temos que baixar os repositórios de texto predefinidos. Mas antes de baixar os repositórios predefinidos de texto, precisamos importar NLTK com a ajuda deimport comando da seguinte forma -
mport nltk
Agora, com a ajuda do seguinte comando, os dados NLTK podem ser baixados -
nltk.download()
A instalação de todos os pacotes disponíveis do NLTK levará algum tempo, mas é sempre recomendável instalar todos os pacotes.
Instalando outros pacotes necessários
Também precisamos de alguns outros pacotes Python, como gensim e pattern para fazer análise de texto, bem como construir aplicativos de processamento de linguagem natural usando NLTK.
gensim- Uma biblioteca de modelagem semântica robusta que é útil para muitos aplicativos. Ele pode ser instalado pelo seguinte comando -
pip install gensim
pattern - Costumava fazer gensimpacote funcionar corretamente. Ele pode ser instalado pelo seguinte comando -
pip install pattern
Tokenização
O processo de quebrar o texto fornecido em unidades menores chamadas tokens é chamado de tokenização. Esses tokens podem ser palavras, números ou sinais de pontuação. Também é chamadoword segmentation.
Exemplo
O módulo NLTK fornece pacotes diferentes para tokenização. Podemos usar esses pacotes de acordo com nossa exigência. Alguns dos pacotes são descritos aqui -
sent_tokenize package- Este pacote irá dividir o texto de entrada em frases. Você pode usar o seguinte comando para importar este pacote -
from nltk.tokenize import sent_tokenize
word_tokenize package- Este pacote irá dividir o texto de entrada em palavras. Você pode usar o seguinte comando para importar este pacote -
from nltk.tokenize import word_tokenize
WordPunctTokenizer package- Este pacote irá dividir o texto de entrada, bem como os sinais de pontuação em palavras. Você pode usar o seguinte comando para importar este pacote -
from nltk.tokenize import WordPuncttokenizer
Stemming
Em qualquer idioma, existem diferentes formas de palavras. Um idioma inclui muitas variações devido a razões gramaticais. Por exemplo, considere as palavrasdemocracy, democratic, e democratization. Para projetos de aprendizado de máquina e de web scraping, é importante que as máquinas entendam que essas palavras diferentes têm a mesma forma básica. Portanto, podemos dizer que pode ser útil extrair as formas básicas das palavras durante a análise do texto.
Isso pode ser conseguido por radicais, que pode ser definido como o processo heurístico de extrair as formas básicas das palavras cortando as pontas das palavras.
O módulo NLTK fornece pacotes diferentes para lematização. Podemos usar esses pacotes de acordo com nossa exigência. Alguns desses pacotes são descritos aqui -
PorterStemmer package- O algoritmo de Porter é usado por este pacote de derivação do Python para extrair o formulário básico. Você pode usar o seguinte comando para importar este pacote -
from nltk.stem.porter import PorterStemmer
Por exemplo, depois de dar a palavra ‘writing’ como entrada para este lematizador, a saída seria a palavra ‘write’ após a retirada.
LancasterStemmer package- O algoritmo de Lancaster é usado por este pacote de derivação do Python para extrair o formulário básico. Você pode usar o seguinte comando para importar este pacote -
from nltk.stem.lancaster import LancasterStemmer
Por exemplo, depois de dar a palavra ‘writing’ como entrada para este lematizador, a saída seria a palavra ‘writ’ após a retirada.
SnowballStemmer package- O algoritmo do Snowball é usado por este pacote de lematização do Python para extrair o formulário básico. Você pode usar o seguinte comando para importar este pacote -
from nltk.stem.snowball import SnowballStemmer
Por exemplo, depois de fornecer a palavra 'escrita' como entrada para este lematizador, a saída seria a palavra 'escrever' após a lematização.
Lemmatização
Outra maneira de extrair a forma básica das palavras é por lematização, normalmente com o objetivo de remover terminações flexionais usando vocabulário e análise morfológica. A forma básica de qualquer palavra após a lematização é chamada de lema.
O módulo NLTK fornece os seguintes pacotes para lematização -
WordNetLemmatizer package- Ele irá extrair a forma básica da palavra dependendo se é usada como substantivo ou verbo. Você pode usar o seguinte comando para importar este pacote -
from nltk.stem import WordNetLemmatizer
Chunking
Chunking, que significa dividir os dados em pequenos pedaços, é um dos processos importantes no processamento da linguagem natural para identificar as classes gramaticais e frases curtas como frases nominais. Chunking é fazer a rotulagem de tokens. Podemos obter a estrutura da frase com a ajuda do processo de chunking.
Exemplo
Neste exemplo, vamos implementar o chunking de Noun-Phrase usando o módulo NLTK Python. O chunking NP é uma categoria de chunking que encontrará os chunks do sintagma nominal na frase.
Etapas para implementar a fragmentação de frases nominais
Precisamos seguir as etapas fornecidas abaixo para a implementação de chunking substantivo-frase -
Etapa 1 - definição da gramática do bloco
Na primeira etapa, definiremos a gramática para chunking. Consistiria nas regras que devemos seguir.
Etapa 2 - criação do analisador de bloco
Agora, vamos criar um analisador de pedaços. Ele analisaria a gramática e forneceria a saída.
Etapa 3 - O resultado
Nesta última etapa, a saída seria produzida em formato de árvore.
Primeiro, precisamos importar o pacote NLTK da seguinte maneira -
import nltk
Em seguida, precisamos definir a frase. Aqui DT: o determinante, VBP: o verbo, JJ: o adjetivo, IN: a preposição e NN: o substantivo.
sentence = [("a", "DT"),("clever","JJ"),("fox","NN"),("was","VBP"),("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]
A seguir, estamos fornecendo a gramática na forma de expressão regular.
grammar = "NP:{<DT>?<JJ>*<NN>}"
Agora, a próxima linha de código definirá um analisador para analisar a gramática.
parser_chunking = nltk.RegexpParser(grammar)
Agora, o analisador analisará a frase.
parser_chunking.parse(sentence)
A seguir, estamos dando nossa saída na variável.
Output = parser_chunking.parse(sentence)
Com a ajuda do código a seguir, podemos desenhar nossa saída na forma de uma árvore, conforme mostrado abaixo.
output.draw()
Modelo Bag of Word (BoW) Extraindo e convertendo o texto em formato numérico
Bag of Word (BoW), um modelo útil no processamento de linguagem natural, é basicamente usado para extrair os recursos do texto. Depois de extrair os recursos do texto, eles podem ser usados na modelagem em algoritmos de aprendizado de máquina, pois os dados brutos não podem ser usados em aplicativos de ML.
Trabalho do modelo BoW
Inicialmente, o modelo extrai um vocabulário de todas as palavras do documento. Posteriormente, usando uma matriz de termos de documento, ele construiria um modelo. Dessa forma, o modelo BoW representa o documento como um pacote de palavras apenas e a ordem ou estrutura é descartada.
Exemplo
Suponha que temos as seguintes duas sentenças -
Sentence1 - Este é um exemplo do modelo Saco de Palavras.
Sentence2 - Podemos extrair recursos usando o modelo Bag of Words.
Agora, considerando essas duas frases, temos as seguintes 14 palavras distintas -
- This
- is
- an
- example
- bag
- of
- words
- model
- we
- can
- extract
- features
- by
- using
Construindo um modelo de saco de palavras em NLTK
Vejamos o seguinte script Python que construirá um modelo BoW em NLTK.
Primeiro, importe o seguinte pacote -
from sklearn.feature_extraction.text import CountVectorizer
Em seguida, defina o conjunto de frases -
Sentences=['This is an example of Bag of Words model.', ' We can extract
features by using Bag of Words model.']
vector_count = CountVectorizer()
features_text = vector_count.fit_transform(Sentences).todense()
print(vector_count.vocabulary_)
Resultado
Isso mostra que temos 14 palavras distintas nas duas frases acima -
{
'this': 10, 'is': 7, 'an': 0, 'example': 4, 'of': 9,
'bag': 1, 'words': 13, 'model': 8, 'we': 12, 'can': 3,
'extract': 5, 'features': 6, 'by': 2, 'using':11
}
Modelagem de Tópico: Identificando Padrões em Dados de Texto
Geralmente, os documentos são agrupados em tópicos e a modelagem de tópicos é uma técnica para identificar os padrões em um texto que correspondem a um tópico específico. Em outras palavras, a modelagem de tópicos é usada para descobrir temas abstratos ou estruturas ocultas em um determinado conjunto de documentos.
Você pode usar a modelagem de tópicos nos seguintes cenários -
Classificação de Texto
A classificação pode ser melhorada pela modelagem de tópicos porque agrupa palavras semelhantes em vez de usar cada palavra separadamente como um recurso.
Sistemas de Recomendação
Podemos construir sistemas de recomendação usando medidas de similaridade.
Algoritmos de modelagem de tópicos
Podemos implementar a modelagem de tópicos usando os seguintes algoritmos -
Latent Dirichlet Allocation(LDA) - É um dos algoritmos mais populares que usa os modelos gráficos probabilísticos para implementar a modelagem de tópicos.
Latent Semantic Analysis(LDA) or Latent Semantic Indexing(LSI) - É baseado na Álgebra Linear e usa o conceito de SVD (Singular Value Decomposition) na matriz de termos do documento.
Non-Negative Matrix Factorization (NMF) - Também é baseado em Álgebra Linear como LDA.
Os algoritmos mencionados acima teriam os seguintes elementos -
- Número de tópicos: Parâmetro
- Matriz Documento-Word: Entrada
- WTM (Word Topic Matrix) e TDM (Topic Document Matrix): Saída