معرفی بهترین کتابخانه‌های پردازش متن – بخش دوم (TextBlob, Pattern, StanfordNLP)

در مقاله قبل به مقایسه ویژگی‌های کتابخانه‌ها و ابزارهای پردازش زبان طبیعی اشاره شد. سپس سه کتابخانه NLTK, SpaCy و CoreNLP معرفی و نمونه کد آن قرار داده شد. دیگر بخش‌های این مقاله:

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

مقایسه ویژگی‌ها و امکانات کتابخانه‌های (جعبه ابزار) محبوب و رایگان پردازش زبان طبیعی تا سال 2019
مقایسه ویژگی‌ها و امکانات کتابخانه‌های (جعبه ابزار) محبوب و رایگان پردازش زبان طبیعی تا سال 2019

ذکر چند نکته درباره این جدول را لازم می‌دانیم. ستون دوم سال تولید و سالی که آخرین نسخه ابزار (بروزرسانی) در آن ارائه شده است را نشان می‌دهد. در ستون ششم، تعداد ستاره‌ی داده شده به پروژه مربوط به هر کتابخانه‌ در گیت‌هاب (یا پرستاره‌ترین پروژه مرتبط با آنها) را به عنوان سنجه میزان محبوبیت درنظر گرفتیم. همچنین از شاخص تعداد سوالات پرسیده شده در StackoverFlow (درباره هر کتابخانه)، به عنوان مبنای میزان استفاده و جامعه بهره‌بردار آن کتابخانه استفاده شده است. ستون هفدهم به پشتیبانی از زبان فارسی هر کتابخانه (همه یا بعضی از ابزارهای آن) اختصاص داده شده است. این اطلاعات و ارقام در تاریخ 15 اسفند 97 جمع‌آوری شدند.

در این بخش به معرفی چند جعبه ابزار پردازش متن محبوب و کاربردی دیگر می‌پردازیم.

کتابخانه TextBlob

کتابخانه TextBlob، یکی از ابزارهای بسیار کامل و راحت برای پردازش داده‌های متنی در زبان پایتون است. این کتابخانه شامل ابزارهای مختلف پردازش زبان طبیعی از قبیل: استخراج عبارات اسمی، بن‌واژه‌یابی، برچسب‌زنی نقش ادت سخن، پارسر (تجزیه‌گر) جملات، تحلیل احساسات، دسته‌بندی (نایوبیز و درخت تصمیم)، ترجمه (بوسیله مترجم گوگل)، تصحیح اشتباهات املایی، اتصال به وردنت است.

نصب و راه‌اندازی:

pip install -U textblob
python -m textblob.download_corpora

نمونه کد استفاده از امکانات مختلف این کتابخانه:

from textblob import TextBlob

text = '''TextBlob is a Python (2 and 3) library for processing textual data. It provides a consistent API for diving into common natural language processing (NLP) tasks such as part-of-speech tagging, noun phrase extraction, sentiment analysis, and more.'''

blob = TextBlob(text)
print(blob.tags) 
print(blob.noun_phrases)

for sentence in blob.sentences:
    print(sentence.sentiment.polarity)

blob.translate(to="fa") 

خروجی:

[('TextBlob', 'NNP'), ('is', 'VBZ'), ('a', 'DT'), ('Python', 'NNP'), ('2', 'CD'), ('and', 'CC'), ('3', 'CD'), ('library', 'NN'), ('for', 'IN'), ('processing', 'VBG'), ('textual', 'JJ'), ('data', 'NNS'), ('It', 'PRP'), ('provides', 'VBZ'), ('a', 'DT'), ('consistent', 'JJ'), ('API', 'NNP'), ('for', 'IN'), ('diving', 'VBG'), ('into', 'IN'), ('common', 'JJ'), ('natural', 'JJ'), ('language', 'NN'), ('processing', 'NN'), ('NLP', 'NNP'), ('tasks', 'NNS'), ('such', 'JJ'), ('as', 'IN'), ('part-of-speech', 'JJ'), ('tagging', 'NN'), ('noun', 'JJ'), ('phrase', 'NN'), ('extraction', 'NN'), ('sentiment', 'NN'), ('analysis', 'NN'), ('and', 'CC'), ('more', 'JJR')]
['textblob', 'python', 'processing textual data', 'api', 'common natural language processing', 'nlp', 'noun phrase extraction', 'sentiment analysis']
120.0
0.11000000000000001
TextBlob یک کتابخانه پایتون (2 و 3) برای پردازش داده های متنی است. این یک API سازگار برای غواصی را به وظایف پردازش زبان مشترک طبیعی (NLP) مانند تگ های بخشی از گفتار، عبارات استخراج کلمات، تحلیل احساسات و موارد دیگر فراهم می کند.

کتابخانه Pattern

کتابخانه Pattern، یک مجموعه ماژول مناسب برای وب کاوی (Web Mining) با زبان پایتون ارائه داده است. این کتابخانه شامل API برای دریافت اطلاعات و استفاده از موتور جستجوی گوگل و مایکروسافت بینگ، مترجم گوگل، تویئتر، فیس‌بوک و ویکی‌پدیا است. همچنین مجهز به یک خزشگر وب (کرولر و پارسر قالب HTML) برای جمع‌آوری داده از سایر سایت‌هاست. ماژول پردازش زبان طبیعی این کتابخانه عملیات اصلی پردازش متن از قبیل: POS Tagger، n-gram search، تحلیل حس و اتصال به وردنت را داراست. ماژول سوم آن بخش یادگیری ماشین است که مدل بردار کلمات، خوشه‌بندی و دسته‌بندی SVM را شامل می‌شود. علاوه بر اینها، این کتابخانه ماژولی برای تحلیل گراف (شبکه) و مجسم‌سازی (visualization) نیز دارد.

توجه داشته باشید که برای کار با API تویئتر و … در ایران، باید از فیلترشکن استفاده کنید 🙂

نصب و راه‌اندازی:

pip install pattern

نمونه کد برای دریافت پیکره (مجموعه داده متنی) و استفاده از APIهای گوگل، تویئتر و کرولر:

from pattern.web import  URL, DOM, plaintext, Twitter, Google

url = URL("https://text-mining.ir")
dom = DOM(url.download(cached=True, unicode=True))
print(plaintext(dom.head.by_tag("title")[0]))

twitter = Twitter(language='en')
for tweet in twitter.search('#win OR #fail', start=1, count=3):
    print(tweet.text)
    
g = Google(license=None)  # Enter your license key.
q = "Persian language needs your online help."  # en
print(plaintext(g.translate(q, input="en", output="fa")))  # ar, de, es, fr, sv, ja, ... 

خروجی:

سامانه متن کاوی : ارائه دهنده سرویس‌های متن‌کاوی و پردازش متن فارسی همراه با API رایگان
RT @Cruise_118: RT & Follow this post before the weekend for a chance to #win these @MyRoyalUK goodies! UK only. #WinItWednesday #Competition https://t.co/5dSyXVveqz
RT @dkbooks: RT & follow by 5PM for your chance to #win 1 of 3 copies of @The_RHS Propagating Plants, publishing tomorrow! It's packed with hundreds of step-by-step tutorials and ideal for thrifty #gardening this Spring 🌿 #WinItWednesday #competition #giveaway https://t.co/lP74RJzXap
RT @lipsticktv: #Competition Just FOLLOW US & RETWEET🎬 https://t.co/QDwFJPFOBD to enter! #win this fab(sold out!) #DollBeauty Eye palette/pigments 💖All our #giveaways are International! Ends 10th March 💕💖💕💖 https://t.co/GU7eskh5V1
زبان فارسی نیاز به کمک آنلاین شما دارد.

نمونه کد ابزارهای پایه پردازش زبان طبیعی:

from pattern.en import parse, pprint, tag

s = "I eat pizza with a fork."
s = parse(s,
     tokenize = True,  # Tokenize the input, i.e. split punctuation from words.
     tags = True,  # Find part-of-speech tags.
     chunks = True,  # Find chunk tags, e.g. "the black cat" = NP = noun phrase.
     relations = True,  # Find relations between chunks.
     lemmata = True,  # Find word lemmata.
     light = False)

# The output is a string with each sentence on a new line.
# Words in a sentence have been annotated with tags,
# for example: fork/NN/I-NP/I-PNP  (NN = noun, NP = part of a noun phrase, PNP = part of a prepositional phrase.)
print(s)
# Prettier output can be obtained with the pprint() command:
pprint(s)

خروجی شبه کد فوق:

I/PRP/B-NP/O/NP-SBJ-1/i eat/VBP/B-VP/O/VP-1/eat pizza/NN/B-NP/O/NP-OBJ-1/pizza with/IN/B-PP/B-PNP/O/with a/DT/B-NP/I-PNP/O/a fork/NN/I-NP/I-PNP/O/fork ././O/O/O/.
...
          WORD   TAG    CHUNK   ROLE   ID     PNP    LEMMA
          I   PRP    NP      SBJ    1      -      i
          eat   VBP    VP      -      1      -      eat
          pizza   NN     NP      OBJ    1      -      pizza
          with   IN     PP      -      -      PNP    with
          a   DT     NP      -      -      PNP    a
          fork   NN     NP ^    -      -      PNP    fork
          .   .      -       -      -      -      .

نمونه کد تحلیل حس:

from pattern.en import sentiment, polarity, subjectivity, positive

# The polarity() function measures positive vs. negative, as a number between -1.0 and +1.0.
# The subjectivity() function measures objective vs. subjective, as a number between 0.0 and 1.0.
# The sentiment() function returns an averaged (polarity, subjectivity)-tuple for a given string.
for word in ("amazing", "horrible", "public"):
    print(word, sentiment(word))
    
print(sentiment("The movie attempts to be surreal by incorporating time travel and various time paradoxes,"
    "but it's presented in such a ridiculous way it's seriously boring."))

خروجی به شکل (نوع حس [-1,+1]، میزان حس بکاررفته[0-1]) :

amazing (0.6000000000000001, 0.9)
horrible (-1.0, 1.0)
public (0.0, 0.06666666666666667)
...
(-0.21666666666666665, 0.8)

کتابخانه StanfordNLP

کتابخانه StanfordNLP، یکی از جدیدترین کتابخانه‌های پردازش متن چندزبانه است که در سال 2018 ایجاد گردید. نکته قابل توجه و مهم این کتابخانه پشتیبانی بیش از 53 زبان با استفاده از آموزش مدل‌های یادگیری عمیق بوسیله Pytorch و با پیکره‌های آماده شده به فرمت استاندارد CoNLL است. خوشبخانه مدل‌های یادگیری عمیق ابزارهای مختلف این کتابخانه، براساس پیکره خانم دکتر سراجی، برای زبان فارسی نیز آموزش داده شده و در زبان فارسی نیز قابل استفاده هستند. تصمیم جالب دانشگاه استنفورد این بود که برخلاف کتابخانه Stanford CoreNLP که با زبان جاوا نوشته شده بود، این کتابخانه کلاً با زبان محبوب پایتون نوشته شده است.

نصب و راه‌اندازی:

pip install stanfordnlp

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

# -*- coding: utf-8 -*-
import stanfordnlp

MODELS_DIR = r'E:\Data'
# stanfordnlp.download('fa', MODELS_DIR, False)  # This downloads the Persian models for the neural pipeline (used only for the first time)
nlp = stanfordnlp.Pipeline(lang="fa", models_dir=MODELS_DIR, treebank='fa_seraji', use_gpu=False) # This sets up a default neural pipeline in Persian

doc = nlp(u"احمد و بردارش با هم به مدرسه شهید اسماعیل‌زاده در جنوب تهران می رفتند.")
print(*[f'text: {word.text+" "}\tlemma: {word.lemma}\tupos: {word.upos}\txpos: {word.xpos}' for sent in doc.sentences for word in sent.words], sep='\n')
print("----------------------------------------------")
doc.sentences[0].print_dependencies()

خروجی نمونه کد فوق:

text: احمد      lemma: احمد     upos: NOUN      xpos: N_SING
text: و         lemma: و        upos: CCONJ     xpos: CON
text: بردار     lemma: بردار    upos: NOUN      xpos: N_SING
text: ش         lemma: او       upos: PRON      xpos: PRO
text: با        lemma: با       upos: ADP       xpos: P
text: هم        lemma: هم       upos: PRON      xpos: PRO
text: به        lemma: به       upos: ADP       xpos: P
text: مدرسه     lemma: مدرسه    upos: NOUN      xpos: N_SING
text: شهید      lemma: شهید     upos: NOUN      xpos: N_SING
text: اسماعیل‌زاده      lemma: اسماعیل‌زاده     upos: ADJ       xpos: ADJ
text: در        lemma: در       upos: ADP       xpos: P
text: جنوب      lemma: جنوب     upos: NOUN      xpos: N_SING
text: تهران     lemma: تهران    upos: NOUN      xpos: N_SING
text: می        lemma: می       upos: NOUN      xpos: N_SING
text: رفتند     lemma: رفت#رو   upos: VERB      xpos: V_PA
text: .         lemma: .        upos: PUNCT     xpos: DELM
----------------------------------------------
('احمد', '15', 'nsubj')
('و', '3', 'cc')
('بردار', '1', 'conj')
('ش', '3', 'nmod:poss')
('با', '6', 'case')
('هم', '15', 'obl')
('به', '8', 'case')
('مدرسه', '15', 'obl')
('شهید', '8', 'nmod:poss')
('اسماعیل\u200cزاده', '9', 'amod')
('در', '12', 'case')
('جنوب', '9', 'nmod')
('تهران', '12', 'nmod:poss')
('می', '15', 'compound:lvc')
('رفتند', '0', 'root')
('.', '15', 'punct')

منتظر ما باشید: ان‌شاءالله در آینده مقاله‌ای درباره دقت و کارایی (زمانی) این کتابخانه برای زبان فارسی می‌نویسیم.

منابع برتر

استفاده از این مقاله با ذکر منبع “سامانه متن کاوی فارسی‌یار – text-mining.ir“، بلامانع است.