Você está visualizando atualmente Como implementar o algoritmo Latent Semantic Analysis em Python

Como implementar o algoritmo Latent Semantic Analysis em Python

Nesse post você vai compreender como pode reduzir a dimensionalidade dos seus vetores, usando Latent Semantic Analysis. Esse algoritmo, simplificadamente reduz um vetor aos seus componentes principais e isso pode ajudar em várias tarefas de PLN.

Quer saber mais sobre Processamento de Linguagem Natural? Veja nosso curso gratuito.

O que é Latent Semantic Analisys?

  A análise semântica latente (Latent Semantic Analisys) é uma técnica no processamento de linguagem natural, em particular a semântica distribucional, de analisar as relações entre um conjunto de documentos e os termos que eles contêm, produzindo um conjunto de conceitos relacionados aos documentos e termos. A LSA assume que palavras com significado próximo ocorrerão em textos semelhantes (a hipótese distributiva). Uma matriz contendo contagens de palavras por parágrafo (linhas representam palavras únicas e colunas representam cada parágrafo) é construída a partir de um grande pedaço de texto e uma técnica matemática chamada decomposição de valor singular (SVD) é usada para reduzir o número de linhas preservando a estrutura de similaridade. entre colunas. As palavras são então comparadas tomando o cosseno do ângulo entre os dois vetores (ou o produto de ponto entre as normalizações dos dois vetores) formado por quaisquer duas linhas. Valores próximos de 1 representam palavras muito semelhantes, enquanto valores próximos de 0 representam palavras muito diferentes.  

Como utilizar o LSA em python?

O primeiro passo para utilizar o LSA é importar os pacotes:  

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD

  Em seguida criamos um array de frases chamado dataset:  

# inserimos um texto aleatório
dataset = [ "the amount of polution is increasing day by day",
          "The concert was just great",
          "I love to see Gordom Ramsay Cook",
          "Google is introducing a new technology",
          "AI Robots are examples of great technology present today",
          "All of us were singing in the concert",
           "We have launch campaings to stop pollution and  global warming"]

  Percorremos o dataset passando todas as linhas para caracteres minúsculos. Em seguida criamos modelo LSA.  

dataset = [line.lower() for line in dataset]
vectorizer = TfidfVectorizer()
x = vectorizer.fit_transform(dataset)

lsa = TruncatedSVD(n_components = 4, n_iter = 100)

lsa.fit(x)

row1 = lsa.components_[0]

[ 1.24191973e-01 1.78240252e-01 1.14460798e-01 7.78505294e-17 1.24191973e-01 1.14460798e-01 7.78505294e-17 3.44988739e-01 -1.58354960e-16 2.28921595e-01 1.24191973e-01 7.78505294e-17 9.72770950e-02 -1.58354960e-16 3.00124026e-01 7.78505294e-17 1.78240252e-01 1.14460798e-01 9.72770950e-02 1.75760635e-01 2.37365829e-01 7.78505294e-17 -1.58354960e-16 9.72770950e-02 2.95798061e-01 7.78505294e-17 1.14460798e-01 1.24191973e-01 -1.58354960e-16 1.24191973e-01 -1.58354960e-16 1.78240252e-01 7.78505294e-17 1.83838346e-01 3.76098295e-01 -6.68255908e-17 1.24191973e-01 1.78240252e-01 7.78505294e-17 2.37365829e-01 7.78505294e-17 1.78240252e-01]  

Logo em seguida devemos pegar a lista de feature_names() realizar uma ordenação dos termos mais relevantes de acordo com o LSA.  

terms = vectorizer.get_feature_names()
for i,comp in enumerate(lsa.components_):
    componentTerms = zip(terms, comp)
    sortedTerms = sorted(componentTerms, key = lambda x:x[1], reverse = True)
    sortedTerms = sortedTerms [:10]
    print ("n Concept", i, ":")
    for term in sortedTerms:
        print(term)
 Concept 0 :
('the', 0.37609829529263766)
('concert', 0.34498873923306617)
('great', 0.3001240258948736)
('of', 0.295798060952667)
('just', 0.23736582929791203)
('was', 0.23736582929791203)
('day', 0.2289215954150454)
('technology', 0.18383834567413398)
('all', 0.17824025175629002)
('in', 0.17824025175629002)

 Concept 1 :
('to', 0.415788443967007)
('cook', 0.28359165793510743)
('gordom', 0.28359165793510743)
('love', 0.28359165793510743)
('ramsay', 0.28359165793510743)
('see', 0.28359165793510743)
('and', 0.21730644711292454)
('campaings', 0.21730644711292454)
('global', 0.21730644711292454)
('have', 0.21730644711292454)

 Concept 2 :
('technology', 0.37791806767144065)
('is', 0.3419614380631981)
('google', 0.34139694419097444)
('introducing', 0.34139694419097444)
('new', 0.34139694419097444)
('day', 0.14112432680994638)
('are', 0.11387892195373125)
('examples', 0.11387892195373125)
('present', 0.11387892195373125)
('robots', 0.11387892195373125)

 Concept 3 :
('day', 0.4654267679041111)
('amount', 0.23271338395205565)
('by', 0.23271338395205554)
('increasing', 0.23271338395205554)
('polution', 0.23271338395205554)
('is', 0.21264455202450178)
('the', 0.12724213180694274)
('in', 0.056446647527264485)
('singing', 0.056446647527264485)
('us', 0.056446647527264485)

Esse resultado indica em pontos flutuantes qual termos estão mais próximos ao termo avaliado. Por exemplo: a palavra technology possui o score de 0,3779 com relação ao conceito 2.

Vinicius dos Santos

Apenas um apaixonado por Ciência da Computação e a forma com que ela pode transformar vidas!

Deixe um comentário

5 + 20 =