Jak wytrenować model word2vec używając biblioteki gensim
Co to jest osadzanie słów ?
Osadzanie słów jest procesem rozumienia tekstu przez algorytmy uczenia maszynowego, również mówimy, że osadzanie słów jest wyuczoną reprezentacją dla tekstu, gdzie przechwytuje kontekst słowa w dokumencie, semantyczne i syntaktyczne podobieństwo, jak również relacje pomiędzy innymi słowami w korpusie.
To podejście posiada klucz do rozwiązania problemów przetwarzania języka naturalnego za pomocą uczenia maszynowego i głębokiego algorytmu uczenia. Zasadniczo, osadzanie słów jest wektorową reprezentacją słów. Poprzez obliczanie odległości lub pozycji słów, reprezentuje słowa znaczenia, zdania, akapity lub dokumenty.
Istnieje kilka technik osadzania słowo zostało wprowadzone do tej pory. Ogólnie rzecz biorąc, mówimy, że istnieją dwa rodzaje osadzania słów –
- Static Word Embedding
- Contextual Word Embedding
1. Static Word Embedding: Tradycyjne metody, takie jak Skip-Gram i Continuous Bag-of-Words uczą się statycznego osadzania poprzez trenowanie tablic lookup, które tłumaczą słowa na gęsty wektor. Statyczne osadzanie jest bezpośrednio przydatne do rozwiązywania zadań semantyki leksykalnej.
Problem: Nie można rozwiązać niejednoznaczności dla słów wieloznacznych. Na przykład, gdy słowo reprezentuje wiele znaczeń w dwóch różnych zdaniach wtedy metody Skip-Gram lub BOW zawodzą.
2. Kontekstowe osadzanie słów: Kontekstowe osadzanie słów ma na celu uchwycenie semantyki słowa w różnych kontekstach, aby rozwiązać problem polisemii i zależnej od kontekstu natury słów. Model LSTM, Bi-directional LSTM itp. pomaga uzyskać wektorową formę słów.
Model Word2Vec: Word2Vec jest metodą pozwalającą na skonstruowanie takiego statycznego osadzenia słów. Zostało to osiągnięte przy użyciu dwóch metod Skip Gram i Common Bag of Words (CBOW) z pomocą sieci neuronowych. Został on opracowany przez Tomasa Mikolova w 2013 roku w Google.
Dlaczego ich potrzebujemy?
Powiedzmy, że mamy poniższe zdania.
„I love coding in Jupyter.” i „I enjoy coding in Pycharm”.
Oba zdania są bardzo blisko siebie. Jeśli zbudujemy wyczerpujący słownik (nazwijmy go V), będzie on miał V = {I, love, enjoy, coding, in, Jupyter, Pycharm}. Jeśli pójdziemy z jednym gorącym kodowaniem. Nie będziemy w stanie uzyskać dokładne znaczenie jak miłość, cieszyć się, kodowanie każde słowo są traktowane jako takie same, podczas gdy miłość i cieszyć się i bardzo blisko siebie.
Naszym motywem jest mieć słowa z podobnym kontekście będzie bardzo blisko pozycji przestrzennej. Matematycznie, odległość cosinusowa będzie określić, jak blisko dwa słowa są. Najbliższe słowo odległość cosinusowa lub cosinus anioła będzie blisko 0 i dla najdalszych będzie blisko 1.
Jak działa Word2Vec?
Model Word2Vec może działać na dwóch algorytmach –
- Skip-gram
- CBOW (Continuous Bag of Words)
CBOW Model: Metoda ta przyjmuje kontekst każdego słowa jako dane wejściowe i próbuje przewidzieć słowo odpowiadające kontekstowi. W procesie przewidywania słowa docelowego, uczymy się reprezentacji wektorowej słowa docelowego. Jako wejście wiele słów będzie tam jak na rozmiar okna (5 słów), ale zwróci jedno słowo jako wyjście.
Spójrzmy głębiej na architekturę:
Model Skip-Gram: Jest to kolejny algorytm dla Word2Vec. Jest to przeciwieństwo modelu CBOW. Model przyjmuje jedno słowo jako dane wejściowe, ale zwróci wiele słów zgodnie z rozmiarem okna.
Implementacja osadzania słów za pomocą Gensim Word2Vec Model:
W tym miejscu wyjaśnię krok po kroku jak trenować model word2vec używając Gensim. Dataset, mam zebrane z platformy Kaggle. Ten zbiór danych pochodzi z publicznych danych Myers-Briggs Type Indicator. Zawiera on dwie kolumny typ i post. „type” definiuje 16 typów osobowości, a „post” definiuje komentarz z tych 16 typów spersonalizowanej jednostki.
1. Ładowanie danych i opis danych
# Ładowanie zbioru danych
data_df = pd.read_csv(„data/mbti_1.csv”)
data_df.head()
2. Czyszczenie i wstępne przetwarzanie danych
Po załadowaniu danych, musimy znaleźć czy dane zawierają wartości NA, jeśli wartość NA w zbiorze danych, usuniemy ją.
# Usuwanie wartości NA z dataframe
def data_na_value_cleaning(data):
print(„Przed czyszczeniem, Kształt danych : „, data.shape)
print(„Przed usunięciem wartości Null: – – – – – – – -„)
print(data.isna().sum())
data.dropna(inplace=True)
data.reset_index(inplace=True,drop=True)
print(„Po usunięciu wartości Null: – – – – – – – -„)
print(data.isna().sum())
print(„Po wyczyszczeniu, Kształt danych : „, data.shape)
return data
Jako, że nasze dane nie mają żadnych wartości NA. Zatem żaden wiersz nie został usunięty. Teraz sprawdzamy, czy w Dataset są jakieś zduplikowane wartości.
# Usuwanie zduplikowanych wartości
def duplicate_content_removal(data, col, ini_row):
print(„Przed usunięciem duplikatów liczba danych wynosiła : „, ini_row)
duplicate_count = data.duplicated().sum()
print(„\NLiczba duplikatów: „, duplicate_count)opis_danych = data.drop_duplicates()
cleaned_row = len(description_data)
if (ini_row – cleaned_row) > 0:
print(„\nTotalna redukcja danych : „, (ini_row – cleaned_row))
print(„\NPo usunięciu duplikatów liczba danych wynosi :”, cleaned_row)
else:
print(„\NZbiór danych nie zawiera żadnych duplikatów.”)
return list(description_data)posts = duplicate_content_removal(data_df, 'posts’, data_df.shape)
Teraz jako część procesu czyszczenia usuniemy linki i interpunkcję. Ponadto, dla lepszego szkolenia tylko będziemy brać pod uwagę słowa nie numer i słowa alfanumeryczne. Usuniemy stopwords dla lepszego zrozumienia modelu i dokładności.
def remove_link_punc(string):
# usuwanie linków
temp_string = re.sub(’http?://(?:|||(?:%))+’, ’ ’, string)# usuwając wszystko oprócz a-z english letters
regex = re.compile(”)
temp_string = regex.sub(’ ’, temp_string)# usuwając dodatkowe spacje
clean_string = re.sub(’ +’, ’ ’, temp_string).lower()return clean_string
Następna metoda data_cleaning
def data_cleaning(content):
sentences =
for idx in tqdm(range(len(content))):
if content !=””:
# Tokenizacja zdań przy użyciu biblioteki NLTK
for each_sent in sent_tokenize(str(content)):
if each_sent != „”:
temp_sent =
# Removing link and punctuation
each_sent = remove_link_punc(each_sent.lower())# Removing stopwords and applying lemmatization
for each_word in each_sent.split():
if each_word not in stop_words and len(each_word)>= 3:
temp_sent.append(lemmatizer.lemmatize(each_word))# Tylko biorąc długość listy słów jest większa niż równa 5
if len(temp_sent) >= 5:
sentences.append(temp_sent)
return sentences
sent_corpus = data_cleaning(posts)
# Sentence words stats
len_count =
for l in sent_corpus:
len_count.append(len(l))print(„Total number of Sentences : „, len(len_count))
word_sent_df = pd.DataFrame(sorted(Counter(len_count).items()), columns=)
word_sent_df.head(10)
Po oczyszczeniu i wstępnym przetworzeniu danych, dane wyglądają jak każde słowo w liście. Każda lista jest reprezentacją zdania. Genism word2vec wymaga formatu 'listy list’ do szkolenia, gdzie każdy dokument jest zawarty w liście, a każda lista zawiera listę tokenów z tego dokumentu.
3. Trening modelu
Teraz będziemy trenować model word2vec używając biblioteki Gensim z naszym własnym zbiorem danych.
model = Word2Vec(sentences=sent_corpus, size=200, window=4, min_count=1, workers=4)
sentences : gdzie możemy przekazać nasz przygotowany zbiór danych, którym jest sent_corpus
size : Wymiar wygenerowanej formy wektorowej każdego słowa, domyślnie rozmiar wynosi 100.
window : Maksymalna odległość między bieżącym a przewidywanym słowem w zdaniu, domyślnie 5
min_count : Ignoruj wszystkie słowa, gdzie częstotliwość każdego słowa jest mniejsza niż min_count, domyślnie 5. Ponieważ chcieliśmy dodać wszystkie słowa w korpusie, więc wartość jaką podaliśmy to 1.
workers : Używa tylu wątków do trenowania modelu. Domyślna wartość to 3
sg : Służy do wyboru algorytmu szkolenia: 1 dla skip-gram; 0 dla CBOW. Domyślnie CBOW jest używany do szkolenia.
Jeśli chcemy uzyskać podobne to możemy użyć poniższego kodu.
# Podobne słowo dla króla
model.wv.similar_by_word(’king’)
6. Inne techniki z użyciem word2Vec
# Odd one out from list of words
model.wv.doesnt_match()
To pomoże nam znaleźć nieparzyste słowa obecne na liście.
# ocena par słów
model.wv.evaluate_word_pairs(’data/SimLex-999/SimLex-999_2.txt’,)
To pomoże nam tp ocenić pary słów
# analogie słów z listy słów
model.wv.evaluate_word_analogies(’data/questions-words.txt’)
To będzie użyteczne dla analogii słów
7. Ładowanie wytrenowanego modelu
Jeśli potrzebujemy użyć wytrenowanego modelu, co można osiągnąć używając poniższego kodu.
# Loading google pre-train model
from gensim import models
models.KeyedVectors.load_word2vec_format(’data/GoogleNews-vectors-negative300.bin’, binary=True)
Próbowałem załadować google pre-trained model. Możemy go pobrać z linku. Ten model jest również bardzo potężny i wyszkolony na ogromnym zbiorze danych.
Po więcej szczegółów na temat implementacji, możesz rzucić okiem na mój kod na github.
Dziękuję za przeczytanie, proszę daj mi znać, jeśli pojawi się pytanie lub wątpliwość. Z przyjemnością odpowiem na Twoje pytania.
Leave a Reply