ویژگی تصویر

کتابخانه gensim در پایتون — معرفی جامع و کاربردی

  /  پایتون   /  کتابخانه gensim در پایتون
بنر تبلیغاتی الف

gensim یکی از برجسته‌ترین کتابخانه‌های متن‌محور در اکوسیستم پایتون است که برای مدل‌سازی موضوعی (topic modeling)، بازنمایی برداری کلمات و اسناد، و محاسبه شباهت‌ها طراحی شده است. این کتابخانه برای کار با مجموعه داده‌های بزرگ و جریانی (streaming) بهینه شده و قابلیت استفاده بدون بارگزاری کامل داده‌ها در حافظه را فراهم می‌کند.

ویژگی‌های کلیدی gensim

  • پیاده‌سازی‌های استاندارد: Word2Vec، FastText، Doc2Vec، LDA، TF-IDF و مدل‌های شباهت.
  • کار با داده‌های بزرگ: پردازش به‌صورت streaming و ذخیره‌سازی مدل‌ها روی دیسک.
  • سازگاری با فرمت‌های مختلف: corpora، mm/svmlight، و تبدیل بین قالب‌ها.
  • پرفورمنس و پارالل‌سازی: پشتیبانی از multi-worker در آموزش مدل‌های برداری.

موارد کاربردی (Use Cases)

  • استخراج موضوعات از مجموعه مقالات با LDA یا HDP.
  • تبدیل کلمات به بردار عددی با Word2Vec/ FastText برای ورودی مدل‌های یادگیری ماشین.
  • جستجوی مشابهت اسناد و بازیابی اطلاعات (Information Retrieval).
  • خلاصه‌سازی، تحلیل احساسات به‌کمک ویژگی‌های برداری و خوشه‌بندی متون.

مفاهیم پایه و جریان کار

پیش‌پردازش متن

قبل از آموزش مدل‌ها باید متن‌ها توکنیزه، عادی‌سازی (lowercase)، حذف توقف‌واژه‌ها و در صورت لزوم lemmatize شوند. gensim خودش ابزارهای محدودی برای پیش‌پردازش دارد ولی اغلب همراه با nltk یا spaCy استفاده می‌شود.

from gensim.utils import simple_preprocess
from gensim.parsing.preprocessing import STOPWORDS

def preprocess(text):
    return [token for token in simple_preprocess(text) if token not in STOPWORDS]

در کد بالا تابع simple_preprocess توکن‌سازی و پاک‌سازی اولیه را انجام می‌دهد و حذف توقف‌واژه‌ها با مجموعه پیش‌فرض gensim صورت می‌گیرد.

نمایش برداری: TF-IDF و Dictionary/Corpus

برای مدل‌های topic مانند LDA ابتدا باید دیکشنری (واژگان) و کورپوس (نمایش شمارشی) بسازید و سپس TF-IDF یا بُردار شمارشی را تولید کنید.

from gensim import corpora
texts = [preprocess(doc) for doc in documents]
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

در این بخش dictionary نگاشت id-to-word را می‌سازد و doc2bow هر سند را به لیست زوج (word_id, count) تبدیل می‌کند که ورودی استاندارد برای LDA و TF-IDF در gensim است.

آموزش Word2Vec — نمونه عملی

from gensim.models import Word2Vec

# texts: لیست جملات که هر کدام لیستی از توکن‌هاست
model = Word2Vec(sentences=texts, vector_size=100, window=5, min_count=5, workers=4, sg=1, epochs=5)
model.save("word2vec.model")

# استفاده: بردار یک کلمه
vec = model.wv['مثال']

در این مثال از پارامترهای مهم استفاده شده‌اند: vector_size طول بردار، window فاصله context، min_count حداقل فرکانس کلمه برای دخیل شدن، workers تعداد threadها، sg=1 برای skip-gram (و sg=0 برای CBOW) و epochs تعداد ایپاک‌ها. سپس مدل ذخیره می‌شود و با مدل.wv‌ می‌توان بردار کلمه را گرفت.

نکات بهینه‌سازی Word2Vec

  • برای دیتاست‌های کوچک مقدار min_count را پایین بیاورید؛ برای دیتاست بزرگ از negative sampling و subsampling استفاده کنید.
  • برای کیفیت بهتر بردارها epochs را افزایش دهید و از learning rate مناسب استفاده کنید.
  • اگر دقت بیشتری روی ریشه‌های کلمات لازم است از پیش‌پردازش بهتر یا استفاده از FastText برای نرمال‌سازی زیرکلمه‌ها بهره ببرید.

مدل موضوعی با LDA

gensim یک پیاده‌سازی کارا از LDA دارد که از الگوریتم online variational Bayes پشتیبانی می‌کند. مراحل شامل ساخت dictionary، تبدیل به قالب bow، و سپس آموزش مدل است.

from gensim.models import LdaModel

lda = LdaModel(corpus=corpus, id2word=dictionary, num_topics=10, passes=10, iterations=100, random_state=42)
lda.save("lda.model")

# مشاهده برترین کلمات هر موضوع
for i in range(10):
    print(i, lda.print_topic(i, topn=10))

پارامترهای کلیدی: num_topics تعداد موضوع‌ها، passes تعداد عبور کامل از داده، iterations تکرارهای الگوریتم در هر pass و random_state برای قابلیت تکرارپذیری. خروجی print_topic کمک می‌کند تا موضوع‌ها را تفسیر کنیم.

جستجوی شباهت و بازیابی اطلاعات

پس از تبدیل اسناد به بردارها (مثلاً tf-idf یا بردار موضوعی از LDA)، می‌توان از ماژول similarities برای محاسبه شباهت کوساین استفاده کرد و اسناد مشابه را بازیابی کرد.

from gensim.similarities import MatrixSimilarity
from gensim.models import TfidfModel

tfidf = TfidfModel(corpus)
index = MatrixSimilarity(tfidf[corpus])
vec_bow = dictionary.doc2bow(preprocess("متن پرس‌وجو"))
sims = index[tfidf[vec_bow]]
print(sorted(list(enumerate(sims)), key=lambda x: -x[1])[:10])

در این مثال ابتدا مدل TF-IDF ساخته شده، سپس یک ماتریس شباهت برای کل کورپوس ایجاد می‌شود. برای هر پرس‌وجو، آن را به فرم bow تبدیل و tf-idf می‌کنیم و شباهت‌های کوساین را محاسبه می‌کنیم تا نزدیک‌ترین اسناد را بیابیم.

مقایسه خلاصه مدل‌ها

مدلکاربرد اصلیمزایا
Word2Vecبردار کلمهبردارهای معنادار، سریع
FastTextبردار کلمه (با زیرکلمه)عملکرد بهتر برای کلمات نادیده
Doc2Vecبردار سندنمایش مستقیم اسناد
LDAمدل موضوعیتفسیر موضوع‌ها، مقیاس‌پذیر

نکات عملی و تجربه‌های تخصصی

  • برای مجموعه‌های بزرگ از streaming و مفهوم mmap، ذخیره‌ی مدل‌ها به‌صورت باینری و استفاده از load/load_fast استفاده کنید تا حافظه کاهش یابد.
  • قبل از آموزش، کیفیت پیش‌پردازش مهم‌تر از تنظیمات پیشرفته است؛ حذف نویز، نرمال‌سازی و نگه‌داشتن قالب‌های مفید (مثل entity‌ها) تأثیر زیادی دارد.
  • همواره مدل را با داده‌های خارج از مجموعه آموزش آزمایش کنید (intrinsic و extrinsic evaluation) تا کیفیت بردارها بسنجید.

gensim یک ابزار قدرتمند و انعطاف‌پذیر برای پژوهشگران و مهندسان متن است. با آشنایی با پارامترها و الگوهای پردازش، می‌توان از آن برای طیف وسیعی از مسایل NLP در زبان فارسی و سایر زبان‌ها بهره برد.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: