word2vec余弦相似度大于1个阿拉伯文本



我已经从gensim训练了我的word2vec模型,并且我正在为语料库中的一些单词获取最近的邻居。以下是相似性得分:

top neighbors for الاحتلال:
الاحتلال: 1.0000001192092896
الاختلال: 0.9541053175926208
الاهتلال: 0.872565507888794
الاحثلال: 0.8386293649673462
الاكتلال: 0.8209128379821777

相似度大于1是很奇怪的。我不能对我的文本应用任何词干,因为文本包含许多OCR拼写错误(我从ORC ed文档中获得文本(。如何解决此问题?

注意我使用的是model.similarity(t1, t2)

这就是我训练Word2Vec模型的方式:

documents = list()
tokenize = lambda x: gensim.utils.simple_preprocess(x)
t1 = time.time()
docs = read_files(TEXT_DIRS, nb_docs=5000)
t2 = time.time()
print('Reading docs took: {:.3f} mins'.format((t2 - t1) / 60))
print('Number of documents: %i' % len(docs))
# Training the model
model = gensim.models.Word2Vec(docs, size=EMBEDDING_SIZE, min_count=5)
if not os.path.exists(MODEL_DIR):
os.makedirs(MODEL_DIR)
model.save(os.path.join(MODEL_DIR, 'word2vec'))
weights = model.wv.vectors
index_words = model.wv.index2word
vocab_size = weights.shape[0]
embedding_dim = weights.shape[1]
print('Shape of weights:', weights.shape)
print('Vocabulary size: %i' % vocab_size)
print('Embedding size: %i' % embedding_dim)

下面是我定义的read_files函数:

def read_files(text_directories, nb_docs):
"""
Read in text files
"""
documents = list()
tokenize = lambda x: gensim.utils.simple_preprocess(x)
print('started reading ...')
for path in text_directories:
count = 0
# Read in all files in directory
if os.path.isdir(path):
all_files = os.listdir(path)
for filename in all_files:
if filename.endswith('.txt') and filename[0].isdigit():
count += 1
with open('%s/%s' % (path, filename), encoding='utf-8') as f:
doc = f.read()
doc = clean_text_arabic_style(doc)
doc = clean_doc(doc)
documents.append(tokenize(doc))
if count % 100 == 0:
print('processed {} files so far from {}'.format(count, path))
if count >= nb_docs and count <= nb_docs + 200:
print('REACHED END')
break
if count >= nb_docs and count <= nb_docs:
print('REACHED END')
break
return documents

我尝试了这个线程,但它对我没有帮助,因为我宁愿arabic拼写错误文本

更新我尝试了以下操作:(获取完全相同的单词之间的相似性(

print(model.similarity('الاحتلال','الاحتلال'))

它给了我以下结果:

1.0000001

根据定义,余弦相似性度量的最大值应为1.0。

但在实践中,计算机中的浮点数表示在深小数中有微小的不精确性。而且,特别是当一行中发生多个计算时(如该余弦距离的计算(,这些计算有时会导致与预期的最大值或完全正确的答案"略有偏差;应该";是

(类似地:有时,无论如何重新排序/重组,在数学上都应该得到完全相同答案的计算在以不同顺序进行时会略有偏差。(

但是,由于这些代表性错误通常是"错误";非常小";,它们通常没有实际意义。(它们在-1.0到1.0之间的数字范围内特别小,但在处理巨型数字时可能会变得很大。(

在您的原始情况下,偏差仅为0.000000119209289。在单词本身的情况下,偏差仅为0.0000001。也就是说,大约有一千万分之一的偏差。(你的其他亚1.0值与完美计算有类似的微小偏差,但它们并不明显。(

在大多数情况下,你应该忽略它

如果你发现在数字显示/日志记录中会分散你或你的用户的注意力,那么简单地选择将所有这些值显示为小数点后的有限数字——比如4,甚至5或6——就会隐藏那些嘈杂的数字。例如,使用Python 3格式字符串:

sim = model.similarity('الاحتلال','الاحتلال')
print(f"{sim:.6}")

(像numpy这样处理大型浮点数组的库甚至可以设置显示精度的全局默认值——请参见numpy.set_print_options——尽管这不应该影响您正在检查的原始Python浮点。(

如果出于某种原因,您绝对需要将值限制在1.0,那么您可以添加额外的代码来实现这一点。但是,选择你的测试通常是一个更好的主意;打印输出要稳健;忽略了与完美数学的微小偏差。

最新更新