دانستنی‌ها

پردازش زبان طبیعی در جاوا (جشنواره عید تا عید)

(این مقاله از طرف جناب آقای پورهادی برای جشنواره عید تا عید جاواکاپ ارسال شده است و محتوای این مطلب لزوماً موردتأیید جاواکاپ نیست. لطفاً با مطالعه، بازنشر و امتیازدهی به این مطلب، به انتخاب برترین مقاله در این جشنواره کمک نمایید.)

حتما فکر می کنید این مطلب هم یه مطلب کلیشه ای در مورد فریم ورک اسپرینگه مثل خیلی از مطالب دیگه ولی اینطور نیست . اگر این روزها در غار هم زندگی کرده باشید حتما کلمات big data ،پردازش زبان طبیعی (  Natural language processing ) را شنیده اید چه برسد در این دانشگاه های به اصطلاح معتبر . در این پست نیم نگاهی به این موضوعات با استفاده از جاوا داریم.

modeling

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

اینکار چه استفاده هایی داره ؟ آفرین سوال خوبیه . هر ابزاری استفاده خوب و بد داره .

  • استفاده خوب : شما می تونید با توجه به علایق کاربران اخبار مرتبط به هر کاربر را به او نشان بدید .
  • استفاده بد : فیلترینگ هوشمند . بجای اینکه کل اینترنت رو فیلتر کنیم می تونیم با پردازش متن ، اگر متن در دسته غیر اخلاقی قرار گرفت آن را فیلتر کنیم البته این مورد رو توی خونه امتحان نکنید چون ممکنه مطالب پزشکی ، به اشتباه فیلتر بشن .

انجام اینکار چهار مرحله ی ساده داره ( مراحل پیچیده آن به عهده ی شماست )

  1. گرفتن آدرس هر خبر و بیرون کشیدن محتوای آن
  2. پردازش متن خبر ، تمیز کردن آن ( حذف تگ های html )
  3.  پردازش متن پالایش شده و حذف کلمات بدرد نخور و ایندکس کردن کلمات  مهم
  4. توسعه سرویسی که بتواند میزان تکرار کلمات کلیدی را با درجه ی  اهمیت  به شما بگوید.

قسمت پیچیده اینکار یک مرحله دارد

  • با توجه به میزان تکرار پذیری کلمات کلیدی ، تشخیص دهد این متن متعلق به چه دسته ای است مثلا اگر کلمه جاوا در متنی بیشتر از بقیه کلمات کلیدی تکرار شد این متن متعلق به گروه برنامه نویسی است .

اگر پیش زمینه ای از جاوا داشته باشید حتما فکر می کنید که چه پروژه ی شلوغی در انتظار شماست اما تمام اینکارها تنها با یک فایل جاوا قابل انجام است .

 

برای انجام اینکار از سه ابزار ، کتابخانه ، تولکیت ، فریم ورک ( یا هر چیز دیگه ای که شما دوست دارید صداش کنید ) استفاده می کنیم :

اجازه بدید تا هر کدوم رو مختصری توضیح بدم

Vert.x

بعضی از توسعه دهندگانی که حس میکردن خیلی باهوشن و دیگه ۴۰۰۰ کلاس جاوا در مغزشون نمیگنجه  به فریم ورک هایی مثل نود جی اس و سیناترا رو آوردن . ورتکس الهام گرفته از این دو پروژه است. و برای ساخت اپلیکیشن هایی مبتنی بر معماری میکروسرویسز و اپلیکیشن های reactive استفاده میشه . کلمات قلمبه ای در این یک جمله گفته شد که توضیحشون خارج از بحثه ولی می تونید برای اطلاعات بیشتر به اینجا مراجعه کنید . مراحل یک و چهار  با ورتکس انجام میشن .

Apache Tika

تخصص تیکا استخراج کردن متادیتا و پردازش متن است . در این پروژه برای تمیز کردن محتوای اخبار وب سایت ها از آن استفاده می کنیم ( مرحله دوم ) .

Lucene

لوسین یک موتور جستجوی متنی  با الگورتیم های بسیار پیچیده است . (‌مرحله سوم )

این شرکت مولتی میلیاردی شما دو تا سرویس در اختیار بقیه قرار میده .

http://127.0.0.1:8585/parse?url=http://jedlab.ir/jedlog/story/2bd3b6c8-9a28-4d58-bb8e-78491e5a5051

سرویس اول با آدرس بالا که نیاز به توضیح ندارد . یک آدرس بصورت کوئری پارامتر میگیره و محتوا رو با کد زیر بیرون میکشه

public static class UrlContentHandler
    {


        private void handle(RoutingContext rc)
        {
            String url = rc.request().getParam("url");
            System.out.println("fetching content from : " + url);
            if (url != null && url.length() > 0)
            {
                WebClientOptions options = new WebClientOptions().setUserAgent("Mozilla/5.0").setUserAgentEnabled(true);
                options.setKeepAlive(true);
                options.setFollowRedirects(true);
                final WebClient client = WebClient.create(rc.vertx(), options);
                client.getAbs(url).send(ar->{
                    if(ar.succeeded())
                    {
                        rc.put(URLCONTENT, ar.result().bodyAsString());
                        rc.next();
                    }
                });
            }
            rc.response().end("process completed");
            
        }

    }

ورتکس با استفاده از وب کلاینت که مبتنی بر یکی دیگه از پروژه های اپاچی به اسم http client است می تونه به آدرس هایی که بهش داده میشه ریکوئست بفرست و محتواشو در اختیارتون بزاره.

حالا نوبت به مرحله دوم تمیز کردن محتواست .  اینجا ، جاییکه تیکا با چند خط کد ساده تمام تگ های اضافی HTML رو حذف می کنه و یه متن به شما میده تا بتونید در موتور جستجو ایندکس کنید. با استفاده از chain در routingcontext با صدا زدن next شما می تونید handler بعدی رو در ورتکس صدا بزنید .

private static final BodyContentHandler handler = new BodyContentHandler();
        private static final Metadata metadata = new Metadata();
        private static final ParseContext pcontext = new ParseContext();

        private static final HtmlParser htmlparser = new HtmlParser();
        private String content;
      
        public String parse()
        {

            try
            {
                htmlparser.parse(new ByteArrayInputStream(content.getBytes("UTF-8")), handler, metadata, pcontext);
                return handler.toString();
            }
            catch (IOException | SAXException | TikaException e)
            {
                System.out.println(e.getMessage());
            }
            return "";
	}

و در آخر ایندکس کردن متن در موتور جستجو با استفاده از لوسین

Analyzer analyzer = new PersianAnalyzer(Version.LUCENE_CURRENT);
                boolean recreateIndexIfExists = true;
                IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
                conf.setOpenMode(IndexWriterConfig.OpenMode.CREATE);

                IndexWriter indexWriter = new IndexWriter(new NIOFSDirectory(new File(INDEX_REPOSITORY)), conf);
                Document document = new Document();
                Reader reader = new StringReader(content);
                document.add(new TextField("text", reader));
                indexWriter.addDocument(document);

                reader.close();
		indexWriter.close();

بعد از تمام این کارها شما یک آدرس در اختیار بقیه قرار میدید تا بتونن کلمات کلیدی در متن هایی که شما ایندکس کردید رو پیدا کنن

http://127.0.0.1:8585/find/جاوا,جدلب,اخبار

خروجی آدرس بالا یک صفحه html است که میگه هر کدام از کلمات کلیدی داده شده چند بار در آدرسی که ایندکس کردید تکرار شده .

سورس پروژه برای اجرا رو می تونید از اینجا دانلود کنید .

https://github.com/omidp/vertx-nlp

 

نوشته های مشابه

یک دیدگاه

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

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

دکمه بازگشت به بالا