در مقاله قبل به مقایسه ویژگیهای کتابخانهها و ابزارهای پردازش زبان طبیعی اشاره شد. سپس سه کتابخانه NLTK, SpaCy و CoreNLP معرفی و نمونه کد آن قرار داده شد. دیگر بخشهای این مقاله:
در جدول زیر بطور خلاصه لیست کتابخانهها و جعبه ابزارهای معروف و رایگان پردازش متن، ویژگیهای مهم آنها و ابزارهای پیادهسازی شده در هریک را گردآوری کردیم.
ذکر چند نکته درباره این جدول را لازم میدانیم. ستون دوم سال تولید و سالی که آخرین نسخه ابزار (بروزرسانی) در آن ارائه شده است را نشان میدهد. در ستون ششم، تعداد ستارهی داده شده به پروژه مربوط به هر کتابخانه در گیتهاب (یا پرستارهترین پروژه مرتبط با آنها) را به عنوان سنجه میزان محبوبیت درنظر گرفتیم. همچنین از شاخص تعداد سوالات پرسیده شده در StackoverFlow (درباره هر کتابخانه)، به عنوان مبنای میزان استفاده و جامعه بهرهبردار آن کتابخانه استفاده شده است. ستون هفدهم به پشتیبانی از زبان فارسی هر کتابخانه (همه یا بعضی از ابزارهای آن) اختصاص داده شده است. این اطلاعات و ارقام در تاریخ 15 اسفند 97 جمعآوری شدند.
در این بخش به معرفی چند جعبه ابزار پردازش متن محبوب و کاربردی دیگر میپردازیم.
کتابخانه 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']
0.0 0.11000000000000001
TextBlob یک کتابخانه پایتون (2 و 3) برای پردازش داده های متنی است. این یک API سازگار برای غواصی را به وظایف پردازش زبان مشترک طبیعی (NLP) مانند تگ های بخشی از گفتار، عبارات استخراج کلمات، تحلیل احساسات و موارد دیگر فراهم می کند.
کتابخانه 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، یکی از جدیدترین کتابخانههای پردازش متن چندزبانه است که در سال 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"، بلامانع است.