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.