رفتن به نوشته‌ها

آموزش word2vec روی ویکی‌پدیا فارسی

قبل از اینکه شروع کنم به نوشتن قسمت دوم ورد۲وک کجا، چطور و چگونه تصمیم گرفتم یک پست درباره نحوه آموزش word2vec روی ویکی‌پدیا فارسی ارائه کنم. در این پست صرفا به این می‌پردازیم که چطور می‌توان ورد۲وک را در جنسیم (gensim) و تنسورفلو (tensorflow) آموزش داد و از آن استفاده کرد. دیروز که ارائه پردازش متن در دانشگاه برگزار شد خیلی از بچه‌ها راجع به آموزش word2vec سوال می‌کردند و بخاطر همین تصمیم به نوشتن این پست کردم.

خب ابتدا نحوه آموزش ورد۲وک در تنسورفلو را باهم بررسی میکنیم و بعد به سراغ gensim میریم. برای شروع باید موارد زیر را نصب کرده باشید:

  • git
  • پایتون ۳ نسخه ۶۴بیتی (دقت کنید حتما همین نسخه رو نصب کنید وگرنه در ویندوز به مشکل میخورید)
  • gensim با استفاده از دستور pip3 install gensim
  • tensorflow با استفاده از دستور pip3 install tensorflow

 

خب فرض کنیم که با موفقیت توانستید موارد بالا رو نصب کنید (شاید در نصب پکیج‌های بالا به مشکل بخورید ولی دلسرد نشید چون یک چیز متداول است :دی).

اولین کاری که باید انجام بدید این است که کد word2vec و دیتای ویکی‌پدیا را دانلود کنید کد را با دستور زیر می‌توانید clone بگیرید و از آنها استفاده کنید و ویکی‌پدیا میتونید از اینجا دانلود کنید (حواستون باشه ویکی‌پدیا باید در root پروژه باشه)‌:

اگر در داخل فولدر را مشاهده کنید یک سری فایل با پسوند ops وجود دارد که باید آنها را کامپایل کنید که اینکار را با دستور زیر میتوانید انجام دهید:

اگر در مک خواستید کامپایل را انجام دهید دستور زیر هم به انتهای دستور g++ بالا اضافه کنید:

حالا به پوشه‌ای که clone گرفتید برید و دستور زیر رو اجرا کنید:

قاعدتا باید الان شروع کند به آموزش مدل که تقریبا ۱ ساعت طول می‌کشد.
وقتی تمام شد اگر دوست دارید ببینید چه چیزی آموزش دادید می‌تونید از دستور زیر استفاده کنید و به تب Projector برید و اندکی از کاری که کردید لذت ببرید:

نمایش ورد۲وک در تنسوربورد

 

کتابخانه معروفی دیگری به نام gensim وجود دارد که معمولا برای استفاده از word2vec از آن استفاده می‌کنند. نحوه استفاده و با این کتابخانه بسیار راحت بوده و مستندات آن تقریبا تمام چیزی که لازم داریم را توضیح داده است. با این وجود در ادامه یک مدل skip-gram با کمک این کتابخانه آموزش میدهیم.

کد زیر تقریبا تمام اون چیزی هست که شما لازم دارید. ابتدا با استفاده از LineSentence ویکی‌پدیا رو به صورت خط خط تبدیل می‌کنیم (LineSentence یک فایل میتنی به عنوان ورودی میگیرد و یک لیست که هر خط از آن یک جمله است به ما بر میگرداند) و بعد LineSentence را به عنوان ورودی Word2Vec میدهیم (سایر پارامترهای Word2vec هم می‌توانید تغییر بدهید) و بعد از آموزش مدل‌ را به صورت باینری و متنی ذخیره می‌کنیم.

حالا اگر خواستید از مدلی که آموزش دادید استفاده کنید باید از تابع load_word2vec_format کمک بگیریم. تنها نکته‌ای که باید حواسمان باشد این است که در صورتی که فایل باینری را لوود کردید پارامتر ورودی این تابع را binary=True قرار بدهیم.

 

اگر دوست دارید ورد۲وک رو از پایه و خودتون پیاده‌سازی کنید به این پست نگاه کنید.

منتشر شده در آموزشپردازش زبان طبیعی

نظر

  1. hadi hadi

    سلام
    میشه لطفا راهنمایی بفرمایید قسمتی که فایل های ops رو باید کامپایل کرد اون دو خط کد رو دقیقا کجا باید نوشت و چه طور.
    من توی cmd توی فولدر word2vec می روم و تنسورفلو را فعال میکنم و بعد از نوشتن python این دو خط را می نویسم که خطا میدهد.

    • هادیفر هادیفر

      چه خطایی میدهد؟ دستور دوم باید حتما g++ رو نصب کرده باشید و دستور اول هم دارید یک متغییر درست میکنید و چیزه خاصی نیست.

      • hadi hadi

        بله نصب دارم. دستور اول رو که می نویسم این خطا رو میده :
        file stdin line 1
        tf_inc ….
        syntaxerror: invalid syntax

        • هادیفر هادیفر

          کدشو اپدیت کردم امیدوارم مشکلتون حل بشه.

        • hadi hadi

          نه متاسفانه هنوز همون مشکل رو دارم.
          ببخشید مسیری که گفتم درسته؟ توی command prompt میرم و cd میکنم توی فولدر word2vec و بعد تنسورفلو رو اکتیو میکنم بعد دستور python رو میزنم و بعد این خط اول را می نویسم.

  2. amir amir

    با سلام
    من هم همین مشکل رو دارم ممنون میشم اگه بفرمایید علت چیست. لطفا اگر دلیلش رو متوجه شدید نتیجه رو بذارید.
    با تشکر

  3. UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd8 in position 476: unexpected end of data

    AttributeError: ‘str’ object has no attribute ‘seek’

    همزمان این دو تا ارور رو در بخش ترین میده.

    • حامی حامی

      منم همین مشکل را دارم در اجرای بخش gensim . لطفا راهنمایی می کنید.ممنون میشم.

  4. محمد محمد

    با سلام من کدهای برنامه رو توی سایتتتون دیدم اما مثل اینکه
    کدهای کامپایل رو حذف کردید لطفا در صوذت امکان کدهای کامپایل و محیطی که داخل اون
    کامپایل رو باید انجام معرفی کنید با تشکر.

  5. محمد محمد

    با سلام
    کدهای کامپایل روی سات حذف شده لطف کنید کد ها رو با توضیح محیط کامپایل قرار بدید
    با تشکر

    • هادیفر هادیفر

      درست شد.

      • serenei_ma@yahoo.com serenei_ma@yahoo.com

        درست نشده که

  6. navid navid

    با سلام
    برای پاکسازی متن فارسی مشابه کاری که برای داده ویکی پدیا فارسی انجام دادید چه ابزاری را پیشنهاد می کنید؟
    با تشکر

    • هادیفر هادیفر

      پاک‌سازی متن منظورتون تمیز کردن تگ‌های html ویکیپدیا هست؟ برای اینکار میتونید از کلاس from gensim.corpora import WikiCorpus
      استفاده کنید.
      اگر نه منظورتون کلا تمیز کردن متن است من خودم از regex استفاده کردم و اندکی پیش پردازش (یکسان کردن یونیکد‌ها، تصحیح نیم فاصله و …) استفاده کردم.

      • navid navid

        منظورم مورد دوم بود. تصحیح نیم فاصله حذف اعداد و کلمات انگلیسی و …
        برنامه بدون مشکل اجرا میشه فقط در نهایت وقتی میخوام از ابزار تنسوربورد استفاده کنم به جای نمایش خود کلمه در فضای برداری کلمات با ایندکس های اونها نمایش داده میشه.

  7. صابر صابر

    سلام
    با تشکر از شما
    متغیر TF_CFLAGS و TF_LFLAGS رو موفق نشدم بسازم چون وقتی در command prompt کلمه python را میزدیم و متغیرها را تعریف میکردیم دیگر امکان اجرای g++ در آن نبود و باید از حالت python خارج میشدیم که آن وقت متغیرها هم نبودن

    برای همین من مجزا خروجی دو خط اول را گرفته و در خط سوم به صورت زیر قرار دادم

    g++ -std=c++11 -shared word2vec_ops.cc word2vec_kernels.cc -o word2vec_ops.so -fPIC -I “C:/Program Files/Python36/lib/site-packages/tensorflow/include” -L “C:/Program Files/Python36/lib/site-packages/tensorflow” -O2 -D_GLIBCXX_USE_CXX11_ABI=0

    اما متاسفانه بعد از نمایش کلی warning و… در نهایت خروجی فایل ساخته نشد
    ممنون میشم راهنمایی بفرمایید
    همچنین خروجی فایل .so تونو هم برای دانلود بذارید
    با تشکر

  8. ساره ساره

    سلام
    خسته نباشید ببخشید من یک پیکره زبان فارسی دارم که میخوام آن را بصورت word2vec تبدیل کنم مشکل اصلیم اینه که رشتم کامپیوتر نیست ولی آشنایی جزیی دارم نمیدونم باید از کجا و چظور شروع کنم. تنسورفلو رو نصب کردم بیشتر الان تو خوندن داده و این که خودم باید پیاده سازی کنم مشکل دارم. استادم شرط اصلی رو انجام دادن کار توسط خودم گذاشته لطفا بهم یاد بدید و کمکم کنید

    • هادیفر هادیفر

      از gensim استفاده کنید. تو همین پست هم در انتها توضیح دادم. بسیار راحته

      • ساره ساره

        خیلی ممنون از راهنمایی هاتون. این چند روز بقدری تو سایتتون رو نگاه کردم که تا حدودی تونستم قسمت اول پیاده سازی رو همونظور که در بالا گفته بودید انجام بدم. حقیقتش تو فکر اینم که اگه بشه پیکره خودم رو جایگزین پیکره ویکی فا بکنم و کلمات ذکر شده در question words رو با کلماتی که خودم میخواهم بررسی کنم جابجا کنم. به نظرتون این کار خروجی مناسب رو به من می‌دهد؟

        • هادیفر هادیفر

          نمیدونم قرار است چکار کنید باهاشون ولی ترجمه question words ها زمانگیر و عملا به درد شما نخواهد خورد. برای جایگزینی پیکره ویکی‌پدیا با پیکره خودتون کافیه فایلتون متنی (با پسوند txt) باشند. مسیر فایلتون رو در کد با ادرس ویکی‌پدیا جایگزین کنید و مدلتون رو آموزش بدید و احتمالا به نتیجه مدنظرتون خواهید رسید.

  9. ساره ساره

    با سلام
    من همچنان دارم سعی میکنم فایل مورد نظر خودم رو در gensim پیاده سازی کنم
    # -*- coding: utf-8 -*-

    import warnings
    import codecs

    warnings.filterwarnings(action=’ignore’, category=UserWarning, module=’gensim’)

    import gensim
    from gensim.models import KeyedVectors
    from gensim.models import Word2Vec
    from gensim.models.word2vec import LineSentence
    import logging

    logging.basicConfig(level=logging.INFO)

    OUTPUT_FILE_PATH = ‘D:\\’
    #INPUT_FILE_PATH = ‘D:\\normal happy.txt’
    sentences=[]
    Sentences=codecs.open(“D:\\normal.txt”,’rb’,’utf-8′).read().split(‘\n’)
    for line in Sentences:
    if len(line)!=0:
    sentences.append(line)
    این قسمت رو بخاظر نوع فایل خودم ، خودم نوشتم تا در انتها لیستی از جملات داشته باشم اما مشکل اینحاست که در قسمت تعریف مدل حتی پرینت ساده 1+1 رو هم انجام نمیده چه برسه بخش های بعدی

    def train_model():
    print(“1+1”)
    model = Word2Vec(sentences, size=200, window=5, sg=1)
    model.wv.save_word2vec_format(OUTPUT_FILE_PATH + ‘word2vec.txt’, binary=False)

  10. ساره ساره

    با سلام
    من همچنان دارم سعی میکنم فایل مورد نظر خودم رو در gensim پیاده سازی کنم
    # -*- coding: utf-8 -*-

    import warnings
    import codecs

    warnings.filterwarnings(action=’ignore’, category=UserWarning, module=’gensim’)

    import gensim
    from gensim.models import KeyedVectors
    from gensim.models import Word2Vec
    from gensim.models.word2vec import LineSentence
    import logging

    logging.basicConfig(level=logging.INFO)

    OUTPUT_FILE_PATH = ‘D:\\’
    #INPUT_FILE_PATH = ‘D:\\normal happy.txt’
    sentences=[]
    Sentences=codecs.open(“D:\\normal.txt”,’rb’,’utf-8′).read().split(‘\n’)
    for line in Sentences:
    if len(line)!=0:
    sentences.append(line)
    این قسمت رو بخاظر نوع فایل خودم ، خودم نوشتم تا در انتها لیستی از جملات داشته باشم اما مشکل اینحاست که در قسمت تعریف مدل حتی پرینت ساده 1+1 رو هم انجام نمیده چه برسه بخش های بعدی

    def train_model():
    print(“1+1”)
    model = Word2Vec(sentences, size=200, window=5, sg=1)
    model.wv.save_word2vec_format(OUTPUT_FILE_PATH + ‘word2vec.txt’, binary=False)

  11. ساره ساره

    این رو هم بگو که به برنامه نوشته شده این دو خط رو اضافه کردم که مرتبط با warning هستش به دلیل این خطا که بهم میداد
    C:\Users\sajjadd\AppData\Local\Programs\Python\Python35\lib\site-packages\gensim\utils.py:1212: UserWarning: detected Windows; aliasing chunkize to chunkize_serial
    warnings.warn(“detected Windows; aliasing chunkize to chunkize_serial”)
    منم تو نت که گشتم این کد رو براش پیدا کردم
    import warnings
    warnings.filterwarnings(action=’ignore’, category=UserWarning, module=’gensim’)

  12. ساره ساره

    با سلام
    بنده چندین سوال دیگه هم داشتم پیکره ای که آموزش میدهیم جملاتش باید به چه شکلی باشه؟ مثلا با n\ یا نقطه از هم جدا شده باشند یا این که بصورت متوالی باشد تا lineSentence بر آن کار کند و خروجی lineSentence نهایتا به چه شکلی هست
    با تشکر
    عذر خواهی میکنم بابت سوالها

    • هادیفر هادیفر

      هر سه حالتی که گفتید درست کار میکنه ولی اگر جملات خط به خط با \n جدا شده باشند یه مقداری کمی کیفیت بردارهاتون شاید بهتر بشه. در غیر این صورت Linespace ماکسیم ۱۰۰۰ کلمه درنظر می‌گیرد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *