Gensim - Przemiany

Ten rozdział pomoże ci poznać różne przemiany w Gensim. Zacznijmy od zrozumienia przekształcających się dokumentów.

Przekształcanie dokumentów

Przekształcanie dokumentów oznacza przedstawienie dokumentu w taki sposób, aby można było nim manipulować matematycznie. Oprócz wydedukowania ukrytej struktury korpusu przekształcanie dokumentów będzie służyć również następującym celom -

  • Odkrywa związek między słowami.

  • Wydobywa ukrytą strukturę w korpusie.

  • Opisuje dokumenty w nowy i bardziej semantyczny sposób.

  • Sprawia, że ​​przedstawienie dokumentów jest bardziej zwarte.

  • Poprawia wydajność, ponieważ nowa reprezentacja zużywa mniej zasobów.

  • Poprawia skuteczność, ponieważ w nowej reprezentacji marginalne trendy danych są ignorowane.

  • Szum jest również redukowany w nowej reprezentacji dokumentu.

Zobaczmy kroki implementacji przekształcania dokumentów z jednej reprezentacji przestrzeni wektorowej na inną.

Etapy wdrażania

Aby przekształcić dokumenty, musimy wykonać następujące kroki -

Krok 1: Tworzenie korpusu

Pierwszym i podstawowym krokiem jest stworzenie korpusu z dokumentów. Stworzyliśmy już korpus w poprzednich przykładach. Stwórzmy kolejny z kilkoma ulepszeniami (usunięcie popularnych słów i słów, które pojawiają się tylko raz) -

import gensim
import pprint
from collections import defaultdict
from gensim import corpora

Teraz podaj dokumenty do stworzenia korpusu -

t_corpus = ["CNTK dawniej znany jako Computational Network Toolkit", "to darmowy, łatwy w użyciu zestaw narzędzi klasy komercyjnej o otwartym kodzie źródłowym", "który umożliwia nam trenowanie algorytmów głębokiego uczenia, aby uczyć się jak ludzki mózg.", " Możesz znaleźć darmowy samouczek na tutorialspoint.com ”,„ Tutorialspoint.com zapewnia również najlepsze samouczki techniczne na temat technologii takich jak uczenie maszynowe AI deep learning ”]

Następnie musimy zrobić tokenizację, a wraz z nią usuniemy również popularne słowa -

stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [
      word for word in document.lower().split() if word not in stoplist
   ]
	for document in t_corpus
]

Poniższy skrypt usunie te słowa, które pojawiają się tylko -

frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)

Wynik

[
   ['toolkit'],
   ['free', 'toolkit'],
   ['deep', 'learning', 'like'],
   ['free', 'on', 'tutorialspoint.com'],
   ['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]

Teraz przekaż to do corpora.dictionary() obiekt, aby uzyskać unikalne obiekty w naszym korpusie -

dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

Wynik

Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)

Następnie poniższy wiersz kodów utworzy model Bag of Word dla naszego korpusu -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

Wynik

[
   [(0, 1)],
   [(0, 1), (1, 1)],
   [(2, 1), (3, 1), (4, 1)],
   [(1, 1), (5, 1), (6, 1)],
   [(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]

Krok 2: Tworzenie transformacji

Przekształcenia to niektóre standardowe obiekty Pythona. Możemy zainicjować te transformacje, czyli obiekty Pythona, używając wytrenowanego korpusu. Tutaj będziemy używaćtf-idf model, aby stworzyć transformację naszego wyszkolonego korpusu tj BoW_corpus.

Najpierw musimy zaimportować pakiet modeli z gensim.

from gensim import models

Teraz musimy zainicjalizować model w następujący sposób -

tfidf = models.TfidfModel(BoW_corpus)

Krok 3: Przekształcanie wektorów

Teraz, w ostatnim kroku, wektory zostaną przekonwertowane ze starej reprezentacji do nowej reprezentacji. Ponieważ zainicjowaliśmy model tfidf w powyższym kroku, tfidf będzie teraz traktowany jako obiekt tylko do odczytu. Tutaj, używając tego obiektu tfidf, przekonwertujemy nasz wektor z zestawu reprezentacji słów (stara reprezentacja) na wagi o wartościach rzeczywistych Tfidf (nowa reprezentacja).

doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]

Wynik

[(1, 0.4869354917707381), (3, 0.8734379353188121)]

Zastosowaliśmy transformację na dwóch wartościach korpusu, ale możemy również zastosować ją do całego korpusu w następujący sposób -

corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
   print(doc)

Wynik

[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
   (1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543), 
   (4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]

Pełny przykład implementacji

import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
   "CNTK formerly known as Computational Network Toolkit", 
   "is a free easy-to-use open-source commercial-grade toolkit", 
   "that enable us to train deep learning algorithms to learn like the human brain.", 
   "You can find its free tutorial on tutorialspoint.com", 
   "Tutorialspoint.com also provide best technical tutorials on 
   technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [word for word in document.lower().split() if word not in stoplist]
   for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
   from gensim import models
   tfidf = models.TfidfModel(BoW_corpus)
   doc_BoW = [(1,1),(3,1)]
   print(tfidf[doc_BoW])
   corpus_tfidf = tfidf[BoW_corpus]
   for doc in corpus_tfidf:
print(doc)

Różne przemiany w Gensim

Korzystając z Gensima możemy zaimplementować różne popularne transformacje, czyli algorytmy Vector Space Model. Niektóre z nich są następujące -

Tf-Idf (termin odwrotna częstotliwość dokumentu)

Podczas inicjalizacji ten algorytm modelu tf-idf oczekuje, że korpus szkoleniowy ma wartości całkowite (takie jak model Bag-of-Words). Następnie, w momencie transformacji, przyjmuje reprezentację wektorową i zwraca inną reprezentację wektorową.

Wektor wyjściowy będzie miał taką samą wymiarowość, ale wartość rzadkich cech (w czasie uczenia) zostanie zwiększona. Zasadniczo konwertuje wektory o wartościach całkowitych na wektory o wartościach rzeczywistych. Poniżej znajduje się składnia transformacji Tf-idf -

Model=models.TfidfModel(corpus, normalize=True)

LSI (ukryte indeksowanie semantyczne)

Algorytm modelu LSI może przekształcić dokument z modelu wektorowego o wartościach całkowitych (takiego jak model Bag-of-Words) lub z przestrzeni ważonej Tf-Idf w przestrzeń utajoną. Wektor wyjściowy będzie miał mniejszą wymiarowość. Poniżej znajduje się składnia transformacji LSI -

Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)

LDA (Latent Dirichlet Allocation)

Algorytm modelu LDA to kolejny algorytm, który przekształca dokument z przestrzeni modelu Bag-of-Words w przestrzeń tematyczną. Wektor wyjściowy będzie miał mniejszą wymiarowość. Poniżej znajduje się składnia transformacji LSI -

Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)

Losowe projekcje (RP)

RP, bardzo wydajne podejście, ma na celu zmniejszenie wymiarowości przestrzeni wektorowej. To podejście jest w zasadzie przybliżeniem odległości Tf-Idf między dokumentami. Robi to, rzucając trochę przypadkowości.

Model=models.RpModel(tfidf_corpus, num_topics=500)

Hierarchiczny proces Dirichleta (HDP)

HDP to nieparametryczna metoda bayesowska, która jest nowym dodatkiem do Gensim. Powinniśmy zachować ostrożność podczas korzystania z niego.

Model=models.HdpModel(corpus, id2word=dictionary