سکو-نمایش طیفی کلمات- word embedding

سرویس: نمایش طیفی کلمات | Word Vector

تعریف مسئله

در یادگیری عمیق، برای آموزش مدل از شبکه های عصبی استفاده می شود. در این مدل ها باید متن ها را در قالب بردارهایی از اعداد حقیقی، به مدل ورودی بدهیم. یک راه برای تبدیل هر کلمه به بردار، استفاده از نمایش one hot آن است. در این روش، هر کلمه را در قالب برداری با طول تعداد کلمات منحصر به فرد کل پیکره نمایش می دهند که هر بعد از آن، متناظر با یک کلمه است. در نمایش برداری یک کلمه مشخص، به این روش، بعد مربوط به آن کلمه ۱ و سایر ابعاد ۰ است. این نحوه نمایش، سبب می شود تا بردارهای کلمات مختلف بر هم عمود شده و هیچ رابطه ای بین آن ها وجود نداشته باشد. همچنین با افزایش اسپارسیتی، در این حالت، عمومیت مدل به شدت کاهش پیدا می کند.

چگونه کار میکند

سرویس ما یک کلمه واحد که فاقد فاصله یا نیم فاصله است را به عنوان ورودی دریافت می‌کند و بر حسب نیاز نمایش‌های ۲ بعدی یا نمایش‌های در ابعاد بالاتر آن را خروجی می‌دهد. در نهایت بردارهای ۳۰۰ بعدی و ۲ بعدی برای متون خبری برای بیش از ۲ میلیون کلمه منحصر به فرد به دست آمدند. برای متون تلگرامی نیز بردارهای ۵۰ بعدی و ۲ بعدی برای بیش از ۲۲ میلیون کلمه منحصر به فرد به دست آمد. نمایش ۲ بعدی که بعد از PCA زدن روی بردارهای بزرگتر به دست آمده است، به منظور مصورسازی بردارها انجام شده است. تعدد کلمات سبب می‌شود تا بتوانیم به کلمات نادر، انواع نوشتار مختلف کلمات، کلمات با غلط املایی‌های رایج و غیره برسیم. این اتفاق در متون تلگرامی بسیار مهم است، چرا که ادبیات کاربران مختلف در تلگرام با یکدیگر متفاوت است و این موضوع سبب ایجاد کلمات متنوع‌تر می‌شود که تحلیل تمام آن‌ها برای ما اهمیت دارد.

الگوریتم

 

Distributional Hypothesis

باید از داده خام و بدون هیچ برچسبی، به ارتباط بین کلمات برسیم. Distributional Hypothesis فرضیه‌ای که در سال ۱۹۵۴  در پردازش زبان طبیعی معرفی شده است که می‌گوید، کلمات اطراف هر کلمه، آن کلمه را توصیف می‌کند و کلماتی که محیط مشابه دارند با یکدیگر مشابه هستند.

جمله زیر را در نظر بگیرید:

«باشگاه … قهرمان دهمین دوره مسابقات لیگ برتر فوتبال کشور شد.»

بدون اینکه بدانیم چه تیمی قهرمان این دوره از مسابقات شد، به نظر شما چه عبارتی می‌تواند در جای خالی قرار بگیرد؟!

روشن است که یک باشگاه و تیم، در این بخش قرار خواهد گرفت. همچنین مشخص است که این تیم یک تیم فوتبال است. علاوه بر این سابقه قهرمانی در رقابت‌های لیگ برتر را دارد. حال، چه عباراتی می‌توانند در این قسمت قرار بگیرند؟! عباراتی مثل «پرسپولیس تهران»، «استقلال» «پرسپولیس» «سپاهان» و غیره.

این موضوع دقیقا تاییدی بر فرضیه مطرح شده است. ما تنها با توجه به context جای خالی، توانستیم کلمات یا عباراتی را که با یکدیگر ارتباطات معنایی دارند را شناسایی کنیم.

بنابراین توانستیم با همین فرضیه به یک تعریف برای مشابهت کلمات برسیم. روش‌های مختلفی از این تعریف استفاده کردند و توانسته‌اند به یک نمایش برداری برای کلمات برسند.

روش Word2vec

در سال ۲۰۱۳ میکولو، در مقاله ای، روش word2vec را برای نمایش برداری کلمات معرفی کرد. در این روش هر کلمه با یک بردار به طول مشخص(مثلا ۳۰۰) نشان داده می شود. در این روش کلماتی که محیط مشابهی دارند، بردارهای نزدیک به یکدیگر دارند. میکولو نشان داد که نمایش کلمات در این بردارها، می تواند مفهوم هر کلمه را در سطوح مختلف معنایی و نحوی مشخص کند.

 

در روش word2vec یک context window با طول مشخص در نظر گرفته می شود. دو روش مشابه cbow و skipgram در word2vec معرفی شدند. در روش skipgram از ابتدای پیکره حرکت آغاز می شود و کلمات داخل context window که از x1 تا xC هستند، کلمه وسط پنجره که x_i است را شناسایی می‌کنند.  در نهایت با اعمال maximum likelihood روی کل پنجره های پیکره، آموزش بردارها انجام می‌شود.

شکل زیر معماری استفاده شده در این روش را نشان می‌دهد

دیتای مورد استفاده

پیکره متون خبری شامل حدود ۳۷ میلیون خبر خبرگزاری‌های مختلف و معادل ۱۴۵ گیگابایت متن نرمال شده است. این پیکره برای متون تلگرامی به بیش از ۷۸۴ میلیون پست که بیش از ۲۵۵ گیگابایت است، می‌رسد. پست‌های تلگرامی شامل پست‌های کانال‌های تلگرامی است. ما بردارها را برای کلماتی به دست آوردیم که حداقل ۵ بار در پیکره دیده شده باشند.

کاربرد سرویس

مهمترین کاربرد این سرویس، استفاده از آن به عنوان یک پیش‌نیاز اساسی، در حل بسیاری از مسائل پردازش زبان طبیعی است. اکثر روش‌های مبتنی بر یادگیری عمیق در پردازش زبان‌های طبیعی که هم اکنون به عنوان یکی از موثرترین روش‌ها در هوش مصنوعی شناخته می‌شوند، کاملا متکی به بردار کلمات هستند و کیفیت این بردارها روی کیفیت مدل نهایی، تاثیر زیادی دارند.

نحوه استفاده

برای فراخوانی سرویس باید پارامترهای زیر را در query string مقدار دهی کنید.

ورودی API

متن های ورودی در قالب یک فایل ورودی json داده می‌شوند. پارامترهای زیر را در نظر بگیرید: querystring = {"platform" : "news", "option" : "300"} یک متن json ورودی برای این پارامترها به صورت زیر را در نظر بگیرید: {"text": ["علی"] }

خروجی API

در خروجی، نمایش ۳۰۰ بعدی کلمه علی روی پیکره news برگردانده می‌شود.

نمونه کد PHP

                                        $ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://sakoo.dataak.com/api/services/nlp/word_vector");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
 $data = [
     'text'=>'ژاپن',
     'token'=> 'token'
 ];          
 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 $server_output = curl_exec($ch);
 print_r($server_output);
                                    

نمونه کد java

                                        import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

    public class MTest {

        public static void main(String[] args) throws Exception{
            URL url = new URL("https://sakoo.dataak.com/api/services/nlp/word_vector");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            Map<String, String> parameters = new HashMap<>();
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            con.setConnectTimeout(5000);
            con.setReadTimeout(5000);
            con.setInstanceFollowRedirects(false);
            
            String token="token";
            token=java.net.URLEncoder.encode(token, "UTF-8").replace("+","%20");
            
            String urlParameters  = "text=ژاپن&lang=telegram&token="+token;
            try(OutputStream os = con.getOutputStream()) {
                byte[] input = urlParameters.getBytes("utf-8");
                os.write(input, 0, input.length);
            }
            
            DataOutputStream out = new DataOutputStream(con.getOutputStream());
            out.flush();
            out.close();

            int status = con.getResponseCode();
            String s=con.getResponseMessage();
            Reader streamReader = null;
            
            if (status > 299) {
               
                streamReader = new InputStreamReader(con.getErrorStream());
            } else {
                streamReader = new InputStreamReader(con.getInputStream());

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(con.getInputStream()));
                String inputLine;
                StringBuffer content = new StringBuffer();
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                in.close();
                
                System.out.println(content);
            }
            con.disconnect();
        }
    }
                                    

نمونه کد python

                                        import requests
url = 'https://sakoo.dataak.com/api/services/nlp/word_vector'
data = {
    'text': 'ژاپن',
    'lang': 'telegram', or news
    'token': 'token'
    
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3'}
response = requests.post(url, data=data, headers=headers)

print(response.text)