وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پایتون برای NLP: شروع به کار با کتابخانه StanfordCoreNLP

0 3
زمان لازم برای مطالعه: 7 دقیقه


این نهمین مقاله از سری مقالات من است روی پایتون برای NLP. در مقاله قبلی، دیدیم که چگونه می‌توان از کتابخانه Pattern Python برای انجام انواع وظایف NLP از توکن‌سازی تا برچسب‌گذاری POS و طبقه‌بندی متن تا تحلیل احساسات استفاده کرد. قبل از آن، کتابخانه TextBlob را برای انجام وظایف پردازش زبان طبیعی مشابه بررسی کردیم.

در این مقاله به بررسی خواهیم پرداخت StanfordCoreNLP کتابخانه که یکی دیگر از کتابخانه های بسیار مفید برای پردازش زبان طبیعی است. ویژگی های مختلف StanfordCoreNLP را با کمک مثال ها مشاهده خواهیم کرد. بنابراین قبل از اتلاف وقت بیشتر، بیایید شروع کنیم.

راه اندازی محیط زیست

نصب process زیرا StanfordCoreNLP به اندازه سایر کتابخانه های پایتون ساده نیست. در واقع، StanfordCoreNLP یک کتابخانه است که در واقع به زبان جاوا نوشته شده است. بنابراین مطمئن شوید که جاوا را نصب کرده اید روی سیستم شما می توانید دانلود کنید آخرین نسخه جاوا آزادانه

هنگامی که جاوا را نصب کردید، باید فایل های JAR را برای کتابخانه های StanfordCoreNLP دانلود کنید. فایل JAR شامل مدل هایی است که برای انجام وظایف مختلف NLP استفاده می شود. برای دانلود فایل‌های JAR برای مدل‌های انگلیسی، پوشه موجود در آدرس را دانلود و از حالت فشرده خارج کنید وب سایت رسمی StanfordCoreNLP.

کاری که باید انجام دهید این است که سروری را اجرا کنید که درخواست های ارسال شده توسط پوشش پایتون را به کتابخانه StanfordCoreNLP ارائه می کند. به مسیری بروید که پوشه فایل های JAR را از حالت فشرده خارج کردید. داخل پوشه رفته و دستور زیر را اجرا کنید روی خط فرمان:

$ java -mx6g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -timeout 10000

دستور بالا سرور StanfordCoreNLP را راه اندازی می کند. پارامتر -mx6g مشخص می کند که حافظه مورد استفاده سرور نباید بیش از 6 گیگابایت باشد. ذکر این نکته ضروری است که شما باید یک سیستم 64 بیتی را اجرا کنید تا حجمی به اندازه 6 گیگابایت داشته باشید. اگر از یک سیستم 32 بیتی استفاده می کنید، ممکن است مجبور شوید حجم حافظه اختصاص داده شده به سرور را کاهش دهید.

پس از اجرای دستور بالا، باید خروجی زیر را مشاهده کنید:

(main) INFO CoreNLP - --- StanfordCoreNLPServer#main() called ---
(main) INFO CoreNLP - setting default constituency parser
(main) INFO CoreNLP - warning: cannot find edu/stanford/nlp/models/srparser/englishSR.ser.gz
(main) INFO CoreNLP - using: edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz instead
(main) INFO CoreNLP - to use shift reduce parser download English models jar from:
(main) INFO CoreNLP - http://stanfordnlp.github.io/CoreNLP/download.html
(main) INFO CoreNLP -     Threads: 8
(main) INFO CoreNLP - Starting server...
(main) INFO CoreNLP - StanfordCoreNLPServer listening at /0:0:0:0:0:0:0:0:9000

سرور در پورت 9000 کار می کند.

اکنون مرحله آخر نصب پوشش پایتون برای کتابخانه StanfordCoreNLP است. لفافی که ما استفاده خواهیم کرد این است pycorenlp. اسکریپت زیر کتابخانه wrapper را دانلود می کند:

$ pip install pycorenlp

اکنون همه ما آماده هستیم تا به سرور StanfordCoreNLP متصل شویم و وظایف NLP مورد نظر را انجام دهیم.

برای اتصال به سرور، باید آدرس سرور StanfordCoreNLP را که قبلاً مقداردهی اولیه کرده بودیم، به سرور منتقل کنیم. StanfordCoreNLP کلاس از pycorenlp مدول. سپس شیء برگشتی می تواند برای انجام وظایف NLP استفاده شود. به اسکریپت زیر نگاه کنید:

from pycorenlp import StanfordCoreNLP

nlp_wrapper = StanfordCoreNLP('http://localhost:9000')

انجام وظایف NLP

در این بخش، به طور مختصر استفاده از کتابخانه StanfordCoreNLP برای انجام وظایف رایج NLP را بررسی خواهیم کرد.

Lemmatization، POS Tagging و Named Entity Recognition

Lemmatization، بخش‌هایی از برچسب‌گذاری گفتار، و شناسایی موجودیت نام‌گذاری شده ابتدایی‌ترین وظایف NLP هستند. کتابخانه StanfordCoreNLP از عملکرد خط لوله پشتیبانی می کند که می تواند برای انجام این وظایف به روشی ساختاریافته استفاده شود.

در اسکریپت زیر، یک حاشیه نویس ایجاد می کنیم که ابتدا یک سند را به جملات تقسیم می کند و سپس جملات را به کلمات یا نشانه ها تقسیم می کند. سپس کلمات با POS حاشیه نویسی می شوند و برچسب های شناسایی موجودیت نامگذاری می شوند.

doc = "Ronaldo has moved from Real Madrid to Juventus. While messi still plays for Barcelona"
annot_doc = nlp_wrapper.annotate(doc,
    properties={
        'annotators': 'ner, pos',
        'outputFormat': 'json',
        'timeout': 1000,
    })

در اسکریپت بالا یک سند با دو جمله داریم. ما استفاده می کنیم annotate متد شیء wrapper StanfordCoreNLP که قبلاً مقداردهی اولیه کردیم. این روش سه پارامتر دارد. این annotator پارامتر نوع حاشیه نویسی را می گیرد که می خواهیم انجام دهیم روی متن. عبور می کنیم 'ner, pos' به عنوان ارزش برای annotator پارامتری که مشخص می کند ما می خواهیم سند خود را برای تگ های POS و موجودیت های نام گذاری شده حاشیه نویسی کنیم.

این outputFormat متغیر قالبی را که می خواهید متن حاشیه نویسی شده را در آن تعریف کنید. مقادیر ممکن هستند json برای اشیاء JSON، xml برای فرمت XML، text برای متن ساده و serialize برای داده های سریالی

پارامتر نهایی، مهلت زمانی بر حسب میلی ثانیه است که زمانی را مشخص می کند که wrapper باید قبل از اتمام زمان منتظر پاسخ از طرف سرور باشد.

در خروجی باید یک شی JSON را به صورت زیر مشاهده کنید:

{'sentences': ({'index': 0, 'entitymentions': ({'docTokenBegin': 0, 'docTokenEnd': 1, 'tokenBegin': 0, 'tokenEnd': 1, 'text': 'Ronaldo', 'characterOffsetBegin': 0, 'characterOffsetEnd': 7, 'ner': 'PERSON'}, {'docTokenBegin': 4, 'docTokenEnd': 6, 'tokenBegin': 4, 'tokenEnd': 6, 'text': 'Real Madrid', 'characterOffsetBegin': 23, 'characterOffsetEnd': 34, 'ner': 'ORGANIZATION'}, {'docTokenBegin': 7, 'docTokenEnd': 8, 'tokenBegin': 7, 'tokenEnd': 8, 'text': 'Juventus', 'characterOffsetBegin': 38, 'characterOffsetEnd': 46, 'ner': 'ORGANIZATION'}), 'tokens': ({'index': 1, 'word': 'Ronaldo', 'originalText': 'Ronaldo', 'lemma': 'Ronaldo', 'characterOffsetBegin': 0, 'characterOffsetEnd': 7, 'pos': 'NNP', 'ner': 'PERSON', 'before': '', 'after': ' '}, {'index': 2, 'word': 'has', 'originalText': 'has', 'lemma': 'have', 'characterOffsetBegin': 8, 'characterOffsetEnd': 11, 'pos': 'VBZ', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 3, 'word': 'moved', 'originalText': 'moved', 'lemma': 'move', 'characterOffsetBegin': 12, 'characterOffsetEnd': 17, 'pos': 'VBN', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 4, 'word': 'from', 'originalText': 'from', 'lemma': 'from', 'characterOffsetBegin': 18, 'characterOffsetEnd': 22, 'pos': 'IN', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 5, 'word': 'Real', 'originalText': 'Real', 'lemma': 'real', 'characterOffsetBegin': 23, 'characterOffsetEnd': 27, 'pos': 'JJ', 'ner': 'ORGANIZATION', 'before': ' ', 'after': ' '}, {'index': 6, 'word': 'Madrid', 'originalText': 'Madrid', 'lemma': 'Madrid', 'characterOffsetBegin': 28, 'characterOffsetEnd': 34, 'pos': 'NNP', 'ner': 'ORGANIZATION', 'before': ' ', 'after': ' '}, {'index': 7, 'word': 'to', 'originalText': 'to', 'lemma': 'to', 'characterOffsetBegin': 35, 'characterOffsetEnd': 37, 'pos': 'TO', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 8, 'word': 'Juventus', 'originalText': 'Juventus', 'lemma': 'Juventus', 'characterOffsetBegin': 38, 'characterOffsetEnd': 46, 'pos': 'NNP', 'ner': 'ORGANIZATION', 'before': ' ', 'after': ''}, {'index': 9, 'word': '.', 'originalText': '.', 'lemma': '.', 'characterOffsetBegin': 46, 'characterOffsetEnd': 47, 'pos': '.', 'ner': 'O', 'before': '', 'after': ' '})}, {'index': 1, 'entitymentions': ({'docTokenBegin': 14, 'docTokenEnd': 15, 'tokenBegin': 5, 'tokenEnd': 6, 'text': 'Barcelona', 'characterOffsetBegin': 76, 'characterOffsetEnd': 85, 'ner': 'ORGANIZATION'}), 'tokens': ({'index': 1, 'word': 'While', 'originalText': 'While', 'lemma': 'while', 'characterOffsetBegin': 48, 'characterOffsetEnd': 53, 'pos': 'IN', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 2, 'word': 'messi', 'originalText': 'messi', 'lemma': 'messus', 'characterOffsetBegin': 54, 'characterOffsetEnd': 59, 'pos': 'NNS', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 3, 'word': 'still', 'originalText': 'still', 'lemma': 'still', 'characterOffsetBegin': 60, 'characterOffsetEnd': 65, 'pos': 'RB', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 4, 'word': 'plays', 'originalText': 'plays', 'lemma': 'play', 'characterOffsetBegin': 66, 'characterOffsetEnd': 71, 'pos': 'VBZ', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 5, 'word': 'for', 'originalText': 'for', 'lemma': 'for', 'characterOffsetBegin': 72, 'characterOffsetEnd': 75, 'pos': 'IN', 'ner': 'O', 'before': ' ', 'after': ' '}, {'index': 6, 'word': 'Barcelona', 'originalText': 'Barcelona', 'lemma': 'Barcelona', 'characterOffsetBegin': 76, 'characterOffsetEnd': 85, 'pos': 'NNP', 'ner': 'ORGANIZATION', 'before': ' ', 'after': ''})})}

اگر به اسکریپت بالا با دقت نگاه کنید، می‌توانید تگ‌های POS، موجودیت‌های نام‌گذاری شده و نسخه‌ی کلمه‌سازی هر کلمه را بیابید.

Lemmatization

بیایید اکنون نتایج مشروح شده را بررسی کنیم. ما اول print واژه‌سازی برای کلمات موجود در دو جمله در مجموعه داده ما:

for sentence in annot_doc("sentences"):
    for word in sentence("tokens"):
        print(word("word") + " => " + word("lemma"))

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

Ronaldo=>Ronaldo
has=>have
moved=>move
from=>from
Real=>real
Madrid=>Madrid
to=>to
Juventus=>Juventus
.=>.
While=>while
messi=>messus
still=>still
plays=>play
for=>for
Barcelona=>Barcelona

به عنوان مثال، شما می توانید کلمه را ببینید moved شده است به move، به طور مشابه کلمه plays شده است به play.

برچسب گذاری POS

به همین ترتیب می‌توانیم تگ‌های POS را برای هر کلمه پیدا کنیم. به اسکریپت زیر نگاه کنید:

for sentence in annot_doc("sentences"):
    for word in sentence("tokens"):
        print (word("word") + "=>" + word("pos"))

در خروجی باید نتایج زیر را مشاهده کنید:

Ronaldo=>NNP
has=>VBZ
moved=>VBN
from=>IN
Real=>JJ
Madrid=>NNP
to=>TO
Juventus=>NNP
.=>.
While=>IN
messi=>NNS
still=>RB
plays=>VBZ
for=>IN
Barcelona=>NNP

مجموعه تگ های مورد استفاده برای تگ های POS مجموعه تگ Penn Treebank است و می توان آن را پیدا کرد اینجا.

به نام Entity Recognition

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

for sentence in annot_doc("sentences"):
    for word in sentence("tokens"):
        print (word("word") + "=>" + word("ner"))

خروجی به شکل زیر است:

Ronaldo=>PERSON
has=>O
moved=>O
from=>O
Real=>ORGANIZATION
Madrid=>ORGANIZATION
to=>O
Juventus=>ORGANIZATION
.=>O
While=>O
messi=>O
still=>O
plays=>O
for=>O
Barcelona=>ORGANIZATION

ما می توانیم آن را ببینیم Ronaldo به عنوان یک شناسایی شده است PERSON در حالی که Barcelona به عنوان شناسایی شده است Organization، که در این مورد صحیح است.

تحلیل احساسات

برای یافتن احساس یک جمله، تنها کاری که باید انجام دهید این است که بگذرید sentiment به عنوان ارزش برای annotators ویژگی. به اسکریپت زیر نگاه کنید:

doc = "I like this chocolate. This chocolate is not good. The chocolate is delicious. It's a very tasty chocolate. This is so bad"
annot_doc = nlp_wrapper.annotate(doc,
    properties={
       'annotators': 'sentiment',
       'outputFormat': 'json',
       'timeout': 1000,
    })

برای یافتن احساس، می‌توانیم روی هر جمله تکرار کنیم و سپس از آن استفاده کنیم sentimentValue دارایی برای یافتن احساس این sentimentValue مقداری بین 1 و 4 را برمی گرداند که در آن 1 مربوط به احساسات بسیار منفی و 4 مربوط به احساسات بسیار مثبت است. این sentiment ویژگی را می توان برای دریافت احساسات به صورت کلامی استفاده کرد positive، negative یا neutral.

اسکریپت زیر احساس هر جمله را در سندی که در بالا تعریف کردیم را پیدا می کند.

for sentence in annot_doc("sentences"):
    print ( " ".join((word("word") for word in sentence("tokens"))) + " => " \
        + str(sentence("sentimentValue")) + " = "+ sentence("sentiment"))

خروجی:

I like this chocolate . => 2 = Neutral
This chocolate is not good . => 1 = Negative
The chocolate is delicious . => 3 = Positive
It's a very tasty chocolate . => 3 = Positive
This is so bad => 1 = Negative

نتیجه

StanfordCoreNLP یک کتابخانه بسیار مفید دیگر برای پردازش زبان طبیعی است. در این مقاله روش تنظیم محیط برای اجرای StanfordCoreNLP را مطالعه کردیم. سپس استفاده از کتابخانه StanfordCoreNLP را برای کارهای رایج NLP مانند واژه‌سازی، برچسب‌گذاری POS و شناسایی موجودیت نام‌گذاری شده بررسی کردیم و در نهایت، مقاله را با تجزیه و تحلیل احساساتی با استفاده از StanfordCoreNLP کامل کردیم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-23 05:54:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید