Gensim - wektor i model
Tutaj dowiemy się o podstawowych koncepcjach Gensim, ze szczególnym uwzględnieniem wektora i modelu.
Co to jest wektor?
A co jeśli chcemy wywnioskować ukrytą strukturę w naszym korpusie? W tym celu musimy przedstawić dokumenty w taki sposób, abyśmy mogli manipulować nimi matematycznie. Jednym z popularnych rodzajów reprezentacji jest przedstawienie każdego dokumentu korpusu jako wektora cech. Dlatego możemy powiedzieć, że wektor jest matematycznie wygodną reprezentacją dokumentu.
Aby dać przykład, przedstawmy pojedynczą funkcję z naszego powyżej używanego korpusu jako parę do kontroli jakości -
Q - Ile razy to słowo Hello pojawia się w dokumencie?
A - Zero (0).
Q - Ile akapitów znajduje się w dokumencie?
A - Dwa (2)
Pytanie jest generalnie reprezentowane przez jego całkowity id, stąd reprezentacja tego dokumentu to seria par, takich jak (1, 0,0), (2, 2,0). Taka reprezentacja wektora jest znana jakodensewektor. Czemudense, ponieważ zawiera jednoznaczną odpowiedź na wszystkie powyższe pytania.
Reprezentacja może być prosta, np. (0, 2), jeśli z góry znamy wszystkie pytania. Taka kolejność odpowiedzi (oczywiście jeśli pytania są znane z góry) tovector dla naszego dokumentu.
Innym popularnym rodzajem reprezentacji jest bag-of-word (BoW)Model. W tym podejściu każdy dokument jest zasadniczo reprezentowany przez wektor zawierający liczbę częstotliwości każdego słowa w słowniku.
Aby dać ci przykład, załóżmy, że mamy słownik zawierający słowa [„Hello”, „How”, „are”, „you”]. Dokument składający się z ciągu „How are you how” byłby wówczas reprezentowany przez wektor [0, 2, 1, 1]. Tutaj wpisy wektora są w kolejności wystąpienia „Hello”, „How”, „are” i „you”.
Dokument wektorowy a dokument
Z powyższego wyjaśnienia wektora, można prawie zrozumieć różnicę między dokumentem a wektorem. Ale żeby było jaśniej,document to tekst i vectorjest matematycznie wygodną reprezentacją tego tekstu. Niestety, czasami wiele osób używa tych terminów zamiennie.
Na przykład, załóżmy, że mamy jakiś arbitralny dokument A, a następnie zamiast mówić „wektor, który odpowiada dokumentowi A”, zwykli mawiać, „wektor A” lub „dokument A”. Prowadzi to do wielkiej niejednoznaczności. Jeszcze jedną ważną rzeczą, na którą należy zwrócić uwagę, jest to, że dwa różne dokumenty mogą mieć tę samą reprezentację wektorową.
Konwersja korpusu do listy wektorów
Zanim weźmiemy przykład implementacji konwersji korpusu na listę wektorów, musimy skojarzyć każde słowo w korpusie z unikalnym identyfikatorem całkowitym. W tym celu rozszerzymy przykład z powyższego rozdziału.
Przykład
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Wynik
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Pokazuje, że w naszym korpusie jest w tym 25 różnych tokenów gensim.corpora.Dictionary.
Przykład implementacji
Możemy użyć słownika, aby zamienić tokenizowane dokumenty na te 5-wymiarowe wektory w następujący sposób -
pprint.pprint(dictionary.token2id)
Wynik
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
I podobnie, możemy utworzyć reprezentację worka słów dla dokumentu w następujący sposób -
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Wynik
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
Co to jest model?
Po wektoryzacji korpusu, co dalej? Teraz możemy to przekształcić za pomocą modeli. Model można odnieść do algorytmu używanego do przekształcania reprezentacji jednego dokumentu w inny.
Jak już omówiliśmy, dokumenty w Gensim są reprezentowane jako wektory, dlatego możemy, chociaż modelować jako transformację między dwiema przestrzeniami wektorowymi. Zawsze istnieje faza szkoleniowa, w której modele uczą się szczegółów takich przekształceń. Model odczytuje korpus treningowy podczas fazy treningu.
Inicjowanie modelu
Zróbmy inicjalizację tf-idfModel. Model ten przekształca wektory z reprezentacji BoW (Bag of Words) do innej przestrzeni wektorowej, w której liczniki częstotliwości są ważone zgodnie ze względną rzadkością każdego słowa w korpusie.
Przykład implementacji
W poniższym przykładzie mamy zamiar zainicjować tf-idfModel. Będziemy trenować go na naszym korpusie, a następnie przekształcić ciąg „wykres drzew”.
Przykład
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Wynik
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Teraz, po utworzeniu modelu, możemy przekształcić cały korpus za pomocą tfidf i zindeksować go, a także zapytać o podobieństwo naszego dokumentu zapytania (podajemy dokument zapytania „system drzew”) względem każdego dokumentu w korpusie -
Przykład
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Wynik
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
Z powyższego wynika, że dokument 4 i dokument 5 mają wynik podobieństwa wynoszący około 49%.
Co więcej, możemy również posortować te dane wyjściowe dla większej czytelności w następujący sposób -
Przykład
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Wynik
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0