Skip to content

Commit

Permalink
Merge pull request #229 from imani/embedding
Browse files Browse the repository at this point in the history
Embedding
  • Loading branch information
imani authored Nov 20, 2022
2 parents 7cc2b35 + bc712ca commit 9d76a03
Showing 1 changed file with 78 additions and 83 deletions.
161 changes: 78 additions & 83 deletions hazm/embedding.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
from . import word_tokenize
from gensim.models import KeyedVectors, doc2vec, fasttext
from gensim.models import KeyedVectors, Doc2Vec
from gensim.scripts.glove2word2vec import glove2word2vec
import os
import fasttext, os

supported_embeddings = ['fasttext', 'keyedvector', 'glove']


class WordEmbedding:
""" .این کلاس شامل توابعی مرتبط با تبدیل کلمه به برداری از اعداد، یا همان امبدینگ کلمه است
""".این کلاس شامل توابعی مرتبط با تبدیل کلمه به برداری از اعداد، یا همان امبدینگ کلمه است
Args:
model_type (str): باشد ['fasttext', 'keyedvector', 'glove'] نام امبدینگ مورد نیاز که می‌تواند یکی از مقادیر
Expand All @@ -20,23 +20,23 @@ def __init__(self, model_type, model_path=None):
raise KeyError(f'Model type "{model_type}" is not supported! Please choose from {supported_embeddings}')
self.model_type = model_type
if model_path:
self.load_model(model_path)
self.model = self.load_model(model_path)


def load_model(self, model_path):
"""فایل امبدینگ را بارگذاری می‌کند
""".فایل امبدینگ را بارگذاری می‌کند
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'fasttext')
>>> wordEmbedding.load_model('resources/cc.fa.300.bin')
Args:
model_file (str): مسیر فایل امبدینگ
model_path (str): مسیر فایل امبدینگ
"""

if self.model_type == 'fasttext':
self.model = fasttext.load_facebook_model(model_file).wv
self.model = fasttext.load_model(model_path)
elif self.model_type == 'keyedvector':
if model_path.endswith('bin'):
self.model = KeyedVectors.load_word2vec_format(model_path, binary=True)
Expand All @@ -59,7 +59,7 @@ def __getitem__(self, word):


def doesnt_match(self, txt):
''' کلمه‌ نامرتبط را پیدا می‌کند
'''.کلمه‌ نامرتبط را پیدا می‌کند
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'model_type', model_path = 'resources/cc.fa.300.bin')
Expand All @@ -79,7 +79,7 @@ def doesnt_match(self, txt):


def similarity(self, word1, word2):
''' میزان شباهت دو کلمه را گزارش می‌کند
'''.میزان شباهت دو کلمه را گزارش می‌کند
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'model_type', model_path = 'resources/cc.fa.300.bin')
Expand All @@ -103,7 +103,7 @@ def similarity(self, word1, word2):


def get_vocab(self):
''' تمامی کلمات موجود در امبدینگ را گزارش می‌دهد
'''.تمامی کلمات موجود در امبدینگ را گزارش می‌دهد
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'model_type', model_path = 'resources/cc.fa.300.bin')
Expand All @@ -116,12 +116,15 @@ def get_vocab(self):

if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
return self.model.index_to_key
if self.model_type == 'fasttext':
return self.model.get_words(include_freq=False)
else:
return self.model.index_to_key



def nearest_words(self, word, topn=10):
''' مرتبط‌ترین کلمات را با کلمه ورودی گزارش می‌دهد
def nearest_words(self, word, topn):
'''.مرتبط‌ترین کلمات را با کلمه ورودی گزارش می‌دهد
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'model_type', model_path = 'resources/cc.fa.300.bin')
Expand All @@ -137,11 +140,14 @@ def nearest_words(self, word, topn=10):

if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
return self.model.most_similar(word, topn=topn)
if self.model_type == 'fasttext':
return self.model.get_nearest_neighbors(word, 10)
else:
return self.model.most_similar(word, topn=topn)


def get_normal_vector(self, word):
''' بردار امبدینگ نرمال‌شده کلمه ورودی را گزارش می‌دهد.
'''.بردار امبدینگ نرمال‌شده کلمه ورودی را گزارش می‌دهد.
Examples:
>>> wordEmbedding = WordEmbedding(model_type = 'model_type', model_path = 'resources/cc.fa.300.bin')
Expand All @@ -158,99 +164,88 @@ def get_normal_vector(self, word):
if not self.model:
raise AttributeError('Model must not be None! Please load model first.')

return self.model.get_vector(word, norm=True)
return self.model.get_vector(key=word, norm=True)



class SentenceEmbedding:
''' .این کلاس شامل توابعی مرتبط با تبدیل جمله به برداری از اعداد، یا همان امبدینگ جمله است
class SentEmbedding:
''' .این کلاس شامل توابعی مرتبط با تبدیل جمله به برداری از اعداد، یا همان امبدینگ جمله است
Args:
model_type (str): باشد ['fasttext', 'keyedvector', 'glove'] نام امبدینگ مورد نیاز که می‌تواند یکی از مقادیر
model_path (str, optional): مسیر فایل امبدینگ
'''
def __init__(self, model_path=None):
if model_path:
self.load_model(model_path)


def __init__(self, model_path=None):
if model_path:
self.load_model(model_path)

def load_model(self, model_path):
'''فایل امبدینگ را بارگذاری می‌کند

Examples:
>>> sentEmbedding = SentEmbedding()
>>> sentEmbedding.load_model('sent2vec_model_path')
def load_model(self, model_path):
'''.فایل امبدینگ را بارگذاری می‌کند
Args:
model_file (str): مسیر فایل امبدینگ
'''
Examples:
>>> sentEmbedding = SentEmbedding()
>>> sentEmbedding.load_model('sent2vec_model_path')
self.model = doc2vec.load(model_path)
Args:
model_path (str): مسیر فایل امبدینگ
'''

self.model = Doc2Vec.load(model_path)

def __getitem__(self, sent):
if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
return self.get_sentence_vector(sent)

def __getitem__(self, sent):
if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
return self.get_sentence_vector(sent)

def get_sentence_vector(self, sent):
''' جمله مورد نظر را دریافت و بردار امبدینگ متناظر با آن را گزارش می‌دهد

Examples:
>>> sentEmbedding = SentEmbedding(sent_embedding_file)
>>> sentEmbedding.get_sentence_vector('این متن به برداری متناظر با خودش تبدیل خواهد شد')
array([-0.28460968, 0.04566888, -0.00979532, ..., -0.4701098 , -0.3010612 , -0.18577948], dtype=float32)
def get_sentence_vector(self, sent):
'''.جمله مورد نظر را دریافت و بردار امبدینگ متناظر با آن را گزارش می‌دهد
Args:
sent (str): جمله‌ای که می‌خواهیم بردار مرتبط با آن را بدانیم
Examples:
>>> sentEmbedding = SentEmbedding(sent_embedding_file)
>>> sentEmbedding.get_sentence_vector('این متن به برداری متناظر با خودش تبدیل خواهد شد')
array([-0.28460968, 0.04566888, -0.00979532, ..., -0.4701098 , -0.3010612 , -0.18577948], dtype=float32)
Returns:
(numpy.ndarray(float32)): لیست بردار نرمال‌شده‌ مرتبط با جمله ورودی
'''

if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
else:
tokenized_sent = word_tokenize(sent)
return self.model.infer_vector(tokenized_sent)


def similarity(self, sent1, sent2):
''' میزان شباهت دو جمله را گزارش می‌دهد
Examples:
>>> sentEmbedding = SentEmbedding(sent_embedding_file)
>>> sentEmbedding.similarity('شیر حیوانی وحشی است', 'پلنگ از دیگر حیوانات درنده است')
0.6848713
>>> wordEmbedding.similarity('هضم یک محصول پردازش متن فارسی است', 'شیر حیوانی وحشی است')
0.2699288
Args:
sent1 (str): جمله اول
sent2 (str): جمله دوم
Returns:
(numpy.float32): میزان شباهت دو جمله
'''

if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
else:
tokenized_sent1 = word_tokenize(sent1)
tokenized_sent2 = word_tokenize(sent2)
return self.model.similarity_unseen_docs(tokenized_sent1, tokenized_sent2)
Args:
sent (str): جمله‌ای که می‌خواهیم بردار مرتبط با آن را بدانیم
Returns:
(numpy.ndarray(float32)): لیست بردار مرتبط با جمله ورودی
'''

if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
else:
tokenized_sent = word_tokenize(sent)
return self.model.infer_vector(tokenized_sent)


def similarity(self, sent1, sent2):
'''.میزان شباهت دو جمله را گزارش می‌دهد
Examples:
>>> sentEmbedding = SentEmbedding(sent_embedding_file)
>>> sentEmbedding.similarity('شیر حیوانی وحشی است', 'پلنگ از دیگر حیوانات درنده است')
0.8748713

>>> sentEmbedding.similarity('هضم یک محصول پردازش متن فارسی است', 'شیر حیوانی وحشی است')
0.2379288
Args:
sent1 (str): جمله اول
sent2 (str): جمله دوم
Returns:
(numpy.float32): میزان شباهت دو جمله
'''



if not self.model:
raise AttributeError('Model must not be None! Please load model first.')
else:
tokenized_sent1 = word_tokenize(sent1)
tokenized_sent2 = word_tokenize(sent2)
return self.model.similarity_unseen_docs(tokenized_sent1, tokenized_sent2)

0 comments on commit 9d76a03

Please sign in to comment.