از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: شروع به کار با کتابخانه StanfordCoreNLP
سرفصلهای مطلب
این نهمین مقاله از سری مقالات من است روی پایتون برای 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