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:
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.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")
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.