Home > Mobile >  word not in vocabulary error in gensim model
word not in vocabulary error in gensim model

Time:03-22

from bs4 import BeautifulSoup
import requests
cont = requests.get("https://ichi.pro/tr/veri-biliminde-uzaklik-olculeri-159983401462266").content
soup = BeautifulSoup(cont,"html.parser")
metin = soup.text

import re
sonuç1 = re.search("1. Öklid Mesafesi",metin)
sonuç2 = re.search('Okuduğunuz için teşekkürler!',metin)
metin = metin[sonuç1.start():sonuç2.start()].split("\n")

from gensim.models import Word2Vec
model = Word2Vec(metin,size=200,window=15,min_count=5,sg=5)

model.wv["Jaccard mesafesi"]

metin is:

....'     Jaccard mesafesi',
 '    ',
 '',
 'Dezavantajları',
 'Jaccard endeksinin önemli bir dezavantajı, verilerin büyüklüğünden oldukça etkilenmesidir. Büyük veri kümelerinin endeks üzerinde büyük bir etkisi olabilir, çünkü kesişme noktasını benzer tutarken birleşmeyi önemli ölçüde artırabilir.',
 'Kullanım Durumları',
 'Jaccard indeksi, genellikle ikili veya ikili verilerin kullanıldığı uygulamalarda kullanılır. Bir görüntünün segmentlerini, örneğin bir arabayı tahmin eden bir derin öğrenme modeliniz olduğunda, Jaccard indeksi daha sonra, doğru etiketler verilen tahmin edilen segmentin ne kadar doğru olduğunu hesaplamak için kullanılabilir.',
 'Benzer şekilde, belgeler arasında ne kadar kelime seçiminin örtüştüğünü ölçmek için metin benzerlik analizinde kullanılabilir. Böylece, desen setlerini karşılaştırmak için kullanılabilir.',
 '8. Haversine',
 '',
 '',
 '',
 '     Haversine mesafesi. Yazar tarafından görüntü.',
 '    ',
....

note: ı am turkish so my content is turkish but this not important ı think if you are stranger this is not problem second note:ı try another words but ı can not train the model? what should ı do?

CodePudding user response:

There are multiple problems:

  1. If you want a Turkish model, you can try to find a pretrained Word2Vec model for Turkish (e.g. check out this repository) or train a model for Turkish yourself. The way you use it now you seem to train a model but only from a single website, which will barely do anything because the model needs a large amount of sentences to learn anything (like at least 10.000, better much more). Also you set min_count=5 anyway, so any word appearing less than 5 times is ignored generally. Try something like training it on the Turkish Wikipedia, see the linked repository.

  2. Word2Vec by default is a unigram model, so the input is a single word. If you hand it a bigram consisting of two words like "Jaccard mesafesi" it will not find anything. Also you should catch the case that the word is not in vocabulary, otherwise each unknown word will cause an error and your program to cancel. Search for the unigram representation of each token, then combine the two, e.g. by using the statistical mean of the vectors:

    import numpy
    
    ngram = "Jaccard mesafesi"
    split_ngram = ngram.split()
    try:
        ngram_vector = []
        for w in split_ngram:
            ngram_vector.append(model.wv[w])
        ngram_vector = numpy.mean(unigram_vectors, axis=0)
    except:
        ngram_vector = None
        print(f"Word {word} is not in vocabulary")
    
  3. The Word2Vec class for training takes as argument a list of tokenized sentences, so a list word lists. You handed it entire, untokenized sentences instead.

  • Related