پیش پردازش متن در پایتون — راهنمای جامع

۳۲۹۰ بازدید
آخرین به‌روزرسانی: ۳۰ بهمن ۱۴۰۲
زمان مطالعه: ۲۳ دقیقه
پیش پردازش متن در پایتون — راهنمای جامع

در این مطلب، مراحل و روش‌های لازم برای پیش پردازش متن مورد بررسی قرار می‌گیرند. روش‌های پیش پردازش متن از آن جهت حائز اهمیت هستند که ابزارهای لازم را برای تبدیل (Transform) متن از «زبان طبیعی» (Natural Language) به فرمت «قابل خواندن توسط ماشین» (Machine-Readable) فراهم می‌کنند. همچنین در این مطلب، ابزارهای تعریف شده در «زبان برنامه‌نویسی پایتون» (Python Programming Language) جهت پیش پردازش متن مورد بررسی قرار گرفته خواهند شد.

مهم‌ترین روش‌های پیش پردازش متن

مرحله بعد از «جمع‌آوری متن» (Collecting Text Data)، نرمال‌سازی داده‌های متنی جمع‌آوری شده است.

مهم‌ترین روش‌های نرمال‌سازی جهت پیش پردازش متن عبارتند از:

  • تبدیل کردن تمامی حروف موجود در داده‌های متنی به «حروف کوچک» (Lowercase letters) یا «حروف بزرگ» (Uppercase Letters)
  • تبدیل کردن اعداد به کلمات و یا حذف کردن اعداد از داده‌های متنی
  • پاک کردن علائم نقطه‌گذاری (Punctuations)، «علائم لهجه» (Accent Marks) و «علائم تشخیص» (Diacritics)
  • پاک کردن «فضاهای خالی» (Whitespaces) از داده‌های متنی
  • گسترش یا بسط دادن «اختصارها» (Abbreviations)
  • پاک کردن «کلمات بی اثر» (Stopwords)، «عبارات اسپارس» (Sparse Terms) و «کلمات خاص» (Particular Words).
  • «کانونی‌سازی داده‌های متنی» (Text Canonicalization)

در بخش‌های بعدی، هر کدام از روش‌های پیش پردازش متن، به تفصیل شرح داده خواهند شد.

تبدیل متن به حروف کوچک

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

کد پایتون:

1input_str = ”The 5 biggest countries by population in 2017 are China, India, United States, Indonesia, and Brazil.2input_str = input_str.lower()
3print(input_str)

خروجی:

the 5 biggest countries by population in 2017 are china, india, united states, indonesia, and brazil.

پاک کردن اعداد از داده‌های متنی

این امکان برای برنامه‌نویسان و توسعه‌دهندگان فراهم شده است تا هنگام پیش پردازش متن و اعداد موجود در داده‌های متنی، اعدادی که به «تحلیل متن» (Text Analysis) مرتبط نیستند و منجر به تولید اطلاعات با معنی نمی‌شوند، از داده‌های متنی حذف کنند. معمولا، از روش «عبارات منظم یا با قاعده» (Regular Expressions) جهت حذف اعداد از داده‌های متنی استفاده می‌شود.

کد پایتون:

1import re
2input_str = ’Box A contains 3 red and 5 white balls, while Box B contains 4 red and 2 blue balls.3result = re.sub(r’\d+, ‘’, input_str)
4print(result)

خروجی:

Box A contains red and white balls, while Box B contains red and blue balls.

پاک کردن علائم نقطه‌گذاری (Punctuations) از داده‌های متنی

از قطعه کدی که در ادامه نمایش داده شده است، جهت پاک کردن مجموعه علائم [!”#$%&’()*+,-./:;<=>?@[\]^_`{|}~] استفاده می‌شود.

در ادامه، قطعه کد نوشته شده به زبان پایتون جهت پاک کردن علائم نقطه‌گذاری نمایش داده خواهد شد:

کد پایتون:

1import string
2input_str = 'This &is [an] example? {of} string. with.? punctuation!!!!' # Sample string
3result = input_str.translate(string.maketrans('',''), string.punctuation)
4print(result)

خروجی:

1This is an example of string with punctuation

پاک کردن فضاهای خالی (Whitespaces) از داده‌های متنی

جهت پاک کردن فضاهای خالی (Whitespaces) از داده‌های متنی، می‌توان از تابع strip()‎ در زبان برنامه‌نویسی پایتون استفاده کرد. در دادمه، قطعه کد نوشته شده به زبان پایتون، جهت پاک کردن فضاهای خالی (Whitespaces) از داده‌های متنی نمایش داده خواهد شد:

کد پایتون:

1input_str = “ \t a string example\t “
2input_str = input_str.strip()
3input_str

خروجی:

1‘a string example’

جداسازی واژگان (Tokenization) داده‌های متنی

جداسازی واژگان (Tokenization) فرایندی است که در آن یک داده متنی داده شده، به واحدهای زبانی کوچک‌تری به نام «توکن» (Token) تقسیم‌بندی می‌شود. کلمات، اعداد، علائم نقطه‌گذاری و سایر موارد، از جمله واحدهای زبانی هستند که به عنوان توکن (Token) شناخته می‌شوند.

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

نام ابزار پیش پردازش متنتوسعه دهنده و سال عرضه ویژگی‌های ابزار پیش پردازش متنزبان
Natural Language Toolkit (NLTK)The University of Pennsylvania, 2001

پشتیبانی از سیستم‌های عامل Mac/Unix/Windows

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

قابلیت شناسایی الگوهای اطلاعاتی بر اساس قواعد نحوی و گرامری

استفاده از مدل‌های از پیش آموزش داده شده جهت پیش پردازش متن

Python
TextBlobSteven Loria, 2013

تقسیم‌بندی کردن داده‌های متنی به واحدهای زبانی تشکیل دهنده نظیر کلمه و جمله

امکان یکپارچه‌سازی با پایگاه دانش وردنت (WordNet)

Python
SpacyExplosion AI, 2016

پشتیبانی از سیستم‌های عامل Mac/Unix/Windows

استفاده از مدل‌های شبکه عصبی مصنوعی (Artificial Neural Network) جهت پیش پردازش متن

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

Python
GensimRaRe Technologies, 2009

قابلیت پردازش حجم عظیمی از داده‌ها (در مقیاس وب)

پشتیبانی از سیستم‌های عامل Mac/Unix/Windows

امکان استفاده از مدل‌سازی فضای برداری (Vector space Modeling) و مدل‌سازی موضوعی (Topic Modelling)

Python
Apache OpenNLPApache Software Foundation, 2004

در این ابزار پیش پردازش داده‌های متنی، تعداد زیادی مدل از پیش ساخته شده برای زبان‌های مختلف گنجانده شده است.

این ابزار، منابع متنی «حاشیه نویسی شده» (Annotated) زیادی را در خود جای داده است.

Java
OpenNMTYoon Kim, harvardnlp, 2016

این ابزار یک چارچوب عمومی «یادگیری عمیق» (Deep Learning) است که بیشتر برای مقاصد تولید مدل‌های Seq2Seq (مدل‌های Sequence-to-Sequence) طراحی شده است.

از طریق واسط خط دستور (Command Line Interface)، واسط Client-Server و یا کتابخانه‌های برنامه‌نویسی مختلف، می‌توان از این ابزار برای پیش پردازش متن استفاده کرد.

Python و Lua
General Architecture for Text Engineering (GATE)GATE research team, University of Sheffield, 1995

یک سیستم استخراج اطلاعات (Information Extraction)، جهت پیش پردازش متن، در این ابزار گنجانده شده است.

در این ابزار، پیش پردازش متن در زبان‌های مختلف پشتیبانی می‌شود.

این ابزار، ورودی‌های متنوعی را در قالب‌های مختلف می‌پذیرد.

Java
Apache UIMAIBM, Apache Software Foundation, 2006

افزونه‌های متنوعی در این ابزار پیش پردازش متن توسعه و در اختیار برنامه‌نویسان قرار داده شده است.

چندسکویی (Cross Platform) بودن، یکی از ویژگی‌های مهم این ابزار محسوب می‌شود.

ارسال و دریافت درخواست‌های REST در این ابزار پشتیبانی می‌شود.

Java وC++‎
Memory-Based Shallow Parser (MBSP)Vincent Van Asch, Tom De Smedt, 2010

معماری Client-Server

باینری‌های از پیش کامپایل شده TiMBL ،MBT و MBLEM برای سیستم عامل مک

انتشار توزیع Cygwin برای کاربران سیستم عامل ویندوز

Python
RapidMinerRapidMiner, 2006

پلتفرم یکپارچه برای پیش پردازش متن

طراحی مبتنی بر «جریان کاری بصری» (Visual Workflow)

دسترسی به مجموعه وسیعی از ابزارهای پیش پردازش متن

ابزار RapidMiner، یک «واسط کاربری گرافیکی» برای طراحی و اجرای جریان‌‌های کاری تحلیلی فراهم می‌آورد.
MAchine Learning for LanguagE Toolkit (MALLET)Andrew Kachites McCallum, University of Massachusetts Amherst, 2002

این کتابخانه شامل ابزارهای پیشرفته‌ای جهت دسته‌بندی اسناد متنی و برچسب‌گذاری دنباله (Sequence Tagging) است.

این ابزار، اجازه «استنتاج» (Inference) در مدل‌های گرافی (Graphical Models) را به کاربر و برنامه‌نویس می‌دهد.

Java
PatternT. De Smedt & W. Daeleman,  2012

این ابزار، ماژولی برای «وب کاوی» (Web Mining) محسوب می‌شود.

پشتیبانی از سیستم‌های عامل Mac/Unix/Windows

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

Python
Stanford TokenizerThe Stanford Natural Language Processing Group, 2010

یکی از ویژگی‌های مهم این ابزار، سرعت فوق‌العاده آن در پیش پردازش متن است (چیزی در حدود 1 میلیون توکن در ثانیه).

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

Java
FreeLingTALP Research Center, Universitat Politècnica de Catalunya

قابلیت‌های «تحلیل زبانی» (Language Analysis) مختلفی در این ابزار گنجانده شده است.

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

تولید خروجی در قالب‌های مختلف

C++‎

کد پایتون:

1# import the existing word and sentence tokenizing  
2# libraries 
3from nltk.tokenize import sent_tokenize, word_tokenize 
4  
5text = "Natural language processing (NLP) is a field " + \ 
6       "of computer science, artificial intelligence " + \ 
7       "and computational linguistics concerned with " + \ 
8       "the interactions between computers and human " + \ 
9       "(natural) languages, and, in particular, " + \ 
10       "concerned with programming computers to " + \ 
11       "fruitfully process large natural language " + \ 
12       "corpora. Challenges in natural language " + \ 
13       "processing frequently involve natural " + \ 
14       "language understanding, natural language" + \ 
15       "generation frequently from formal, machine" + \ 
16       "-readable logical forms), connecting language " + \ 
17       "and machine perception, managing human-" + \ 
18       "computer dialog systems, or some combination " + \ 
19       "thereof."
20  
21print(sent_tokenize(text)) 
22print(word_tokenize(text))

خروجی:

1[‘Natural language processing (NLP) is a field of computer science, artificial intelligence and computational linguistics concerned with the interactions between computers and human (natural) languages, and, in particular, concerned with programming computers to fruitfully process large natural language corpora., ‘Challenges in natural language processing frequently involve natural language understanding, natural language generation (frequently from formal, machine-readable logical forms), connecting language and machine perception, managing human-computer dialog systems, or some combination thereof.]
2[‘Natural’, ‘language’, ‘processing’,(, ‘NLP’,), ‘is’, ‘a’, ‘field’, ‘of’, ‘computer’, ‘science’,,, ‘artificial’, ‘intelligence’, ‘and’, ‘computational’, ‘linguistics’, ‘concerned’, ‘with’, ‘the’, ‘interactions’, ‘between’, ‘computers’, ‘and’, ‘human’,(, ‘natural’,), ‘languages’,,, ‘and’,,,in, ‘particular’,,, ‘concerned’, ‘with’, ‘programming’, ‘computers’, ‘to’, ‘fruitfully’, ‘process’, ‘large’, ‘natural’, ‘language’, ‘corpora’,., ‘Challenges’,in, ‘natural’, ‘language’, ‘processing’, ‘frequently’, ‘involve’, ‘natural’, ‘language’, ‘understanding’,,, ‘natural’, ‘language’, ‘generation’,(, ‘frequently’, ‘from’, ‘formal’,,, ‘machine-readable’, ‘logical’, ‘forms’,),,, ‘connecting’, ‘language’, ‘and’, ‘machine’, ‘perception’,,, ‘managing’, ‘human-computer’, ‘dialog’, ‘systems’,,, ‘or’, ‘some’, ‘combination’, ‘thereof’,.]

حذف کردن کلمات بی اثر (Stop Words) از داده‌های متنی

کلمات بی اثر (Stop Words)، شایع‌ترین کلمات استفاده شده در یک زبان هستند؛ به عنوان نمونه، کلماتی نظیر The ،On ،Is ،All و a، کلمات بی اثر در زبان انگلیسی محسوب می‌شوند. از آنجایی که این کلمات بار معنایی خاصی ندارند و محتوای معنایی قابل توجهی را انتقال نمی‌دهند، معمولا از داده‌های متنی حذف می‌شوند.

این امکان برای برنامه‌نویسان و توسعه‌دهندگان برنامه‌های کاربردی وجود دارد که کلمات بی اثر (Stop Words) را با استفاده از کتابخانه NLTK (مخفف Natural Language Toolkit) از داده‌های متنی حذف کنند. کتابخانه NLTK، مجموعه‌ای از کتابخانه‌ها (Libraries) و ماژول‌های برنامه‌نویسی قدرتمند جهت پیش پرداز متن و «پردازش زبان طبیعی آماری و نمادین» (Symbolic and Statistical Natural Language Processing) فراهم می‌کند.

کد پایتون:

1input_str = “NLTK is a leading platform for building Python programs to work with human language data.2stop_words = set(stopwords.words(‘english’))
3from nltk.tokenize import word_tokenize
4tokens = word_tokenize(input_str)
5result = [i for i in tokens if not i in stop_words]

خروجی:

1[‘NLTK’, ‘leading’, ‘platform’, ‘building’, ‘Python’, ‘programs’, ‘work’, ‘human’, ‘language’, ‘data’,.]

از کتابخانه scikit-learn نیز می‌توان جهت پیش پردازش متن و حذف کلمات بی اثر در داده‌های متنی استفاده کرد:

1from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS

کتابخانه منبع باز spaCy نیز ابزارهای لازم جهت پیش پردازش متن و حذف کلمات بی اثر در داده‌های متنی را در اختیار کاربر و برنامه‌نویس قرار می‌دهد:

1from spacy.lang.en.stop_words import STOP_WORDS

حذف کردن واژگان اسپارس (Sparse Terms) و کلمات خاص (Particular Words)

در برخی از مواقع لازم است تا واژگان اسپارس (Sparse Terms) و کلمات خاص (Particular Words) از داده‌های متنی حذف شوند. از آنجایی که مجموعه کلمات بی اثر (Stop Words) می‌تواند شامل هر مجموعه از کلمات دلخواه باشد، می‌توان با استفاده از روشی مشابه حذف کردن کلمات بی اثر (Stop Words)، واژگان اسپارس و کلمات خاص را از داده‌های متنی حذف کرد.

ریشه‌یابی کلمات با استفاده از عملیات Stemming

به فرایند بازگرداندن کلمات به شکل ریشه‌ای (Root Form) آن‌ها، عملیات Stemming گفته می‌شود (به عنوان نمونه، شکل ریشه‌ای Looking، کلمه Look است). دو الگوریتم عمده‌ای که جهت بازگرداندن کلمات به شکل ریشه‌ای مورد استفاده قرار می‌گیرند، الگوریتم Porter و الگوریتم Lancaster هستند.

الگوریتم Porter، بخش‌های «عطفی» (Inflectional) و «مورفولوژیک» (Morphological) را از انتهای کلمات حذف می‌کند. الگوریتم Lancaster نیز، مانند الگوریتم Porter عمل می‌کند ولی قوانین سخت‌گیرانه‌تری جهت حذف بخش‌های عطفی و مورفولوژیک از انتهای کلمات وضع می‌کند. در جدول زیر، ابزارهای معرفی شده جهت ریشه‌یابی کلمات با استفاده از عملیات Stemming، در زبان‌های برنامه‌نویسی مختلف، نمایش داده شده‌اند.

نام ابزار پیش پردازش متنتوسعه دهنده و سال عرضه ویژگی‌های ابزار پیش پردازش متنزبان
Natural Language Toolkit (NLTK)The University of Pennsylvania, 2001

در این کتابخانه، ابزارهایی نظیر الگوریتم Porter، الگوریتم Snowball و الگوریتم Lancaster جهت پیش پردازش متن و ریشه‌یابی کلمات در اختیار کاربران و برنامه‌نویسان قرار داده شده است.

نوعی ریشه‌یاب (Stemmer) در این کتابخانه گنجانده شده است که از عبارات منظم برای پیدا کردن ضمیمه‌های مورفولوژیکی (Morphological Affixes) در داده‌های متنی استفاده می‌کند.

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

Python
SnowballMartin Porter, 2002

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

یک زبان «پردازش رشته» (String Processing) بسیار کوچک محسوب می‌شود که برای تولید الگوریتم‌های ریشه‌یابی طراحی شده است.

Java

PyStemmerRichard Boulton, 2006

الگوریتم بسیار مؤثر و کارآمد جهت محاسبه شکل ریشه‌ای کلمات

الگوریتم‌های مختلفی جهت پشتیبانی از ریشه‌یابی داده‌های متنی نوشته شده به زبان‌هایی غیر از بان انگلیسی (بیشتر زبان‌های کشورهای اروپایی)، در این ابزار توسعه داده شده است.

پیاده‌سازی نسخه‌ای خاص از الگوریتم Porter جهت ریشه‌یابی کلمات در زبان انگلیسی

MPython
Hunspell stemmerکاربری به نام lopusz در GitHub

پشتیبانی از ریشه‌یابی کلمات در زبان لهستانی

ریشه‌یابی مبتنی بر Dictionary

Java
CoreNLP StemmerThe Stanford Natural Language Processing Group, 2010در این ابزار، کلاس خاصی برای ریشه‌یابی کلمات و پیش پردازش متن پیاده‌سازی شده است.Java
Apache LuceneApache Software Foundation, 1999

شاخص‌گذاری مقیاس‌پذیر (Scalable) و با عملکرد بالا

پیاده‌سازی الگوریتم‌های جستجوی قدرتمند، دقیق و کارآمد

این ابزار، یک سیستم چندسکویی برای پیش پردازش متن محسوب می‌شود.

Python
DKPro CoreThe Ubiquitous Knowledge Processing Lab (UKP) at the Technische Universität Darmstadt, 2009پیاده‌سازی مدل‌های مختلف جهت پشتیبانی از پیش پردازش متن به زبان‌های مختلف

پشتیبانی از پیش پردازش داده‌های متنی به فرمت‌های مختلف

امکان یکپارچه‌سازی آسان این ابزار با پروژه‌های پایتون و استفاده از آن‌ها جهت پیش پردازش متن وجود دارد.

Python

مثال اول

کد پایتون:

1from nltk.stem import PorterStemmer
2from nltk.tokenize import word_tokenize
3stemmer= PorterStemmer()
4input_str=”There are several types of stemming algorithms.5input_str=word_tokenize(input_str)
6for word in input_str:
7    print(stemmer.stem(word))

خروجی:

1There are sever type of stem algorithm.

مثال دوم

کد پایتون:

1# import these modules 
2from nltk.stem import PorterStemmer 
3from nltk.tokenize import word_tokenize 
4   
5ps = PorterStemmer() 
6  
7# choose some words to be stemmed 
8words = ["program", "programs", "programer", "programing", "programers"] 
9  
10for w in words: 
11    print(w, " : ", ps.stem(w))

خروجی:

1program  :  program
2programs  :  program
3programer  :  program
4programing  :  program
5programers  :  program

مثال سوم

کد پایتون:

1# importing modules 
2from nltk.stem import PorterStemmer 
3from nltk.tokenize import word_tokenize 
4   
5ps = PorterStemmer() 
6   
7sentence = "Programers program with programing languages"
8words = word_tokenize(sentence) 
9   
10for w in words: 
11    print(w, " : ", ps.stem(w))

خروجی:

1Programers  :  program
2program  :  program
3with  :  with
4programing  :  program
5languages  :  languag

ریشه‌یابی کلمات با استفاده از عملیات Lemmatization

همانند عملیات Stemming، هدف فرایند Lemmatization بازگرداندن کلمات به شکل ریشه‌ای (Root Form) آن‌ها است. با این حال، بر خلاف عملیات Stemming، فرایند Lemmatization بخش‌های عطفی (Inflectional) و مورفولوژیکی (Morphological) را حذف نمی‌کند، بلکه از «پایگاه‌های دانش لغوی» (Lexical Knowledge Base) جهت پیدا کردن شکل ریشه‌ای صحیح کلمات استفاده می‌کند.

از ابزارهای زیر برای انجام عملیات Lemmatization با هدف پیش پردازش متن استفاده می‌شود:

  • کتابخانه NLTK (WordNet Lemmatizer)‎.
  • کتابخانه spaCy
  • کتابخانه TextBlob
  • کتابخانه Pattern
  • کتابخانه gensim
  • کتابخانه Stanford CoreNLP
  • کتابخانه Memory-Based Shallow Parser (MBSP)‎
  • کتابخانه Apache OpenNLP
  • کتابخانه Apache Lucene
  • کتابخانه General Architecture for Text Engineering (GATE)‎
  • ابزار Illinois Lemmatizer
  • کتابخانه DKPro Core

مثال اول

کد پایتون:

1from nltk.stem import WordNetLemmatizer
2from nltk.tokenize import word_tokenize
3lemmatizer=WordNetLemmatizer()
4input_str=”been had done languages cities mice”
5input_str=word_tokenize(input_str)
6for word in input_str:
7    print(lemmatizer.lemmatize(word))

خروجی:

1be have do language city mouse

مثال دوم

کد پایتون:

1# import these modules 
2from nltk.stem import WordNetLemmatizer 
3  
4lemmatizer = WordNetLemmatizer() 
5  
6print("rocks :", lemmatizer.lemmatize("rocks")) 
7print("corpora :", lemmatizer.lemmatize("corpora")) 
8  
9# a denotes adjective in "pos" 
10print("better :", lemmatizer.lemmatize("better", pos ="a"))

خروجی:

1rocks : rock
2corpora : corpus
3better : good

مثال سوم

کد پایتون:

1# from textblob lib import Word method 
2from textblob import Word 
3  
4# create a Word object. 
5u = Word("rocks") 
6  
7# apply lemmatization. 
8print("rocks :", u.lemmatize()) 
9  
10# create a Word object. 
11v = Word("corpora") 
12  
13# apply lemmatization. 
14print("corpora :", v.lemmatize()) 
15  
16# create a Word object. 
17w = Word("better") 
18   
19# apply lemmatization with  
20# parameter "a", "a" denotes adjective. 
21print("better :", w.lemmatize("a"))

خروجی:

1rocks : rock
2corpora : corpus
3better : good

برچسب‌گذاری نقش دستوری (Part of Speech tagging | POS Tagging) کلمات در داده‌های متنی

هدف الگوریتم‌های POS Tagging این است که بر اساس تعریف یک کلمه و زمینه محتوایی که کلمه در آن ظاهر می‌شود، یک نقش دستوری به هر کدام از واحدهای زبانی موجود در یک داده متنی اختصاص دهد (نقش‌های دستوری نظیر اسم (Noun)، فعل (Verb)، صفت (Adjectives) و سایر موارد).

تاکنون، کتابخانه‌ها، ابزارهای برنامه‌نویسی متنوعی جهت برچسب‌گذاری نقش دستوری کلمات ارائه شده‌اند. مهم‌ترین کتابخانه‌های برنامه‌نویسی، که حاوی ابزارهای لازم جهت برچسب‌گذاری نقش دستوری کلمات هستند، عبارتند از:

  • کتابخانه NLTK (WordNet Lemmatizer)‎.
  • کتابخانه spaCy
  • کتابخانه TextBlob
  • کتابخانه Pattern
  • کتابخانه Stanford CoreNLP
  • کتابخانه Memory-Based Shallow Parser (MBSP)‎
  • کتابخانه Apache OpenNLP
  • کتابخانه Apache Lucene
  • کتابخانه General Architecture for Text Engineering (GATE)‎
  • ابزار Illinois Part of Speech Tagger
  • کتابخانه DKPro Core
  • کتابخانه FreeLing

مثال اول

کد پایتون:

1input_str=”Parts of speech examples: an article, to write, interesting, easily, and, of”
2from textblob import TextBlob
3result = TextBlob(input_str)
4print(result.tags)

خروجی:

1[(‘Parts’, u’NNS’), (‘of’, u’IN’), (‘speech’, u’NN’), (‘examples’, u’NNS’), (‘an’, u’DT’), (‘article’, u’NN’), (‘to’, u’TO’), (‘write’, u’VB’), (‘interesting’, u’VBG’), (‘easily’, u’RB’), (‘and’, u’CC’), (‘of’, u’IN’)]

مثال دوم

کد پایتون:

1import nltk 
2from nltk.corpus import stopwords 
3from nltk.tokenize import word_tokenize, sent_tokenize 
4stop_words = set(stopwords.words('english')) 
5  
6// Dummy text 
7txt = "Sukanya, Rajib and Naba are my good friends. " \ 
8    "Sukanya is getting married next year. " \ 
9    "Marriage is a big step in one’s life." \ 
10    "It is both exciting and frightening. " \ 
11    "But friendship is a sacred bond between people." \ 
12    "It is a special kind of love between us. " \ 
13    "Many of you must have tried searching for a friend "\ 
14    "but never found the right one."
15  
16# sent_tokenize is one of instances of  
17# PunktSentenceTokenizer from the nltk.tokenize.punkt module 
18  
19tokenized = sent_tokenize(txt) 
20for i in tokenized: 
21      
22    # Word tokenizers is used to find the words  
23    # and punctuation in a string 
24    wordsList = nltk.word_tokenize(i) 
25  
26    # removing stop words from wordList 
27    wordsList = [w for w in wordsList if not w in stop_words]  
28  
29    #  Using a Tagger. Which is part-of-speech  
30    # tagger or POS-tagger.  
31    tagged = nltk.pos_tag(wordsList) 
32  
33    print(tagged)

خروجی:

1[('Sukanya', 'NNP'), ('Rajib', 'NNP'), ('Naba', 'NNP'), ('good', 'JJ'), ('friends', 'NNS')]
2[('Sukanya', 'NNP'), ('getting', 'VBG'), ('married', 'VBN'), ('next', 'JJ'), ('year', 'NN')]
3[('Marriage', 'NN'), ('big', 'JJ'), ('step', 'NN'), ('one', 'CD'), ('’', 'NN'), ('life', 'NN')]
4[('It', 'PRP'), ('exciting', 'VBG'), ('frightening', 'VBG')]
5[('But', 'CC'), ('friendship', 'NN'), ('sacred', 'VBD'), ('bond', 'NN'), ('people', 'NNS')]
6[('It', 'PRP'), ('special', 'JJ'), ('kind', 'NN'), ('love', 'VB'), ('us', 'PRP')]
7[('Many', 'JJ'), ('must', 'MD'), ('tried', 'VB'), ('searching', 'VBG'), ('friend', 'NN'), 
8('never', 'RB'), ('found', 'VBD'), ('right', 'RB'), ('one', 'CD')]

مثال سوم

کد پایتون:

1# from textblob lib import TextBlob method 
2from textblob import TextBlob 
3  
4text = ("Sukanya, Rajib and Naba are my good friends. " +
5    "Sukanya is getting married next year. " +
6    "Marriage is a big step in one’s life." +
7    "It is both exciting and frightening. " + 
8    "But friendship is a sacred bond between people." +
9    "It is a special kind of love between us. " +
10    "Many of you must have tried searching for a friend "+ 
11    "but never found the right one.") 
12  
13# create a textblob object 
14blob_object = TextBlob(text) 
15  
16# Part-of-speech tags can be accessed  
17# through the tags property of blob object.' 
18  
19# print word with pos tag. 
20print(blob_object.tags)

خروجی:

1[('Sukanya', 'NNP'),
2 ('Rajib', 'NNP'),
3 ('and', 'CC'),
4 ('Naba', 'NNP'),
5 ('are', 'VBP'),
6 ('my', 'PRP$'),
7 ('good', 'JJ'),
8 ('friends', 'NNS'),
9 ('Sukanya', 'NNP'),
10 ('is', 'VBZ'),
11 ('getting', 'VBG'),
12 ('married', 'VBN'),
13 ('next', 'JJ'),
14 ('year', 'NN'),
15 ('Marriage', 'NN'),
16 ('is', 'VBZ'),
17 ('a', 'DT'),
18 ('big', 'JJ'),
19 ('step', 'NN'),
20 ('in', 'IN'),
21 ('one', 'CD'),
22 ('’', 'NN'),
23 ('s', 'NN'),
24 ('life.It', 'NN'),
25 ('is', 'VBZ'),
26 ('both', 'DT'),
27 ('exciting', 'VBG'),
28 ('and', 'CC'),
29 ('frightening', 'NN'),
30 ('But', 'CC'),
31 ('friendship', 'NN'),
32 ('is', 'VBZ'),
33 ('a', 'DT'),
34 ('sacred', 'JJ'),
35 ('bond', 'NN'),
36 ('between', 'IN'),
37 ('people.It', 'NN'),
38 ('is', 'VBZ'),
39 ('a', 'DT'),
40 ('special', 'JJ'),
41 ('kind', 'NN'),
42 ('of', 'IN'),
43 ('love', 'NN'),
44 ('between', 'IN'),
45 ('us', 'PRP'),
46 ('Many', 'JJ'),
47 ('of', 'IN'),
48 ('you', 'PRP'),
49 ('must', 'MD'),
50 ('have', 'VB'),
51 ('tried', 'VBN'),
52 ('searching', 'VBG'),
53 ('for', 'IN'),
54 ('a', 'DT'),
55 ('friend', 'NN'),
56 ('but', 'CC'),
57 ('never', 'RB'),
58 ('found', 'VBD'),
59 ('the', 'DT'),
60 ('right', 'JJ'),
61 ('one', 'NN')]

مثال چهارم

کد پایتون:

1import spacy 
2  
3# Load English tokenizer, tagger,  
4# parser, NER and word vectors 
5nlp = spacy.load("en_core_web_sm") 
6  
7# Process whole documents 
8text = ("""My name is Shaurya Uppal.  
9I enjoy writing articles on GeeksforGeeks checkout 
10my other article by going to my profile section.""") 
11  
12doc = nlp(text) 
13  
14# Token and Tag 
15for token in doc: 
16  print(token, token.pos_) 
17  
18# You want list of Verb tokens 
19print("Verbs:", [token.text for token in doc if token.pos_ == "VERB"]) 

خروجی:

1My DET
2name NOUN
3is VERB
4Shaurya PROPN
5Uppal PROPN
6. PUNCT
7I PRON
8enjoy VERB
9writing VERB
10articles NOUN
11on ADP
12GeeksforGeeks PROPN
13checkout VERB
14my DET
15other ADJ
16article NOUN
17by ADP
18going VERB
19to ADP
20my DET
21profile NOUN
22section NOUN
23. PUNCT
24
25# Verb based Tagged Reviews:-
26Verbs: ['is', 'enjoy', 'writing', 'checkout', 'going']

روش تقطیع (Chunking) یا «تجزیه و تحلیل سطحی جملات» (Shallow Parsing)

تقطیع (Chunking) یک فرایند پردازش زبان طبیعی محسوب می‌شود که اجزای تشکیل دهنده جملات (اسم‌ها، فعل‌ها، صفت‌ها و سایر موارد) را شناسایی و به واحدهای زبانی با مرتبه بالاتر متصل می‌کند؛ واحدهای زبانی مرتبه بالاتر، معانی دستوری گسسته دارند (نظیر گروه‌های اسمی (یا عبارات)، گروه‌های فعلی و سایر موارد).

مهم‌ترین کتابخانه‌هایی که حاوی ابزارهای لازم جهت تقطیع (Chunking) یا تجزیه و تحلیل سطحی جملات (Shallow Parsing) هستند، عبارتند از:

  • کتابخانه NLTK (WordNet Lemmatizer)‎.
  • کتابخانه TreeTagger chunker
  • کتابخانه Apache OpenNLP
  • کتابخانه General Architecture for Text Engineering (GATE)‎
  • کتابخانه FreeLing

مثال اول

اولین گام در تقطیع یا تجزیه و تحلیل سطحی جملات، مشخص کردن نقش دستوری (Part of Speech) تک تک کلمات موجود در آن‌ها است.

کد پایتون:

1input_str=”A black television and a white stove were bought for the new apartment of John.2from textblob import TextBlob
3result = TextBlob(input_str)
4print(result.tags)

خروجی:

1[(‘A’, u’DT’), (‘black’, u’JJ’), (‘television’, u’NN’), (‘and’, u’CC’), (‘a’, u’DT’), (‘white’, u’JJ’), (‘stove’, u’NN’), (‘were’, u’VBD’), (‘bought’, u’VBN’), (for, u’IN’), (‘the’, u’DT’), (new, u’JJ’), (‘apartment’, u’NN’), (‘of’, u’IN’), (‘John’, u’NNP’)]

سپس در مرحله بعد، عملیات تقطیع یا تجزیه و تحلیل سطحی روی کلماتی که با نقش دستوری متناظرشان برچسب‌گذاری شده‌اند، انجام می‌شود:

کد پایتون:

1reg_exp = “NP: {<DT>?<JJ>*<NN>}2rp = nltk.RegexpParser(reg_exp)
3result = rp.parse(result.tags)
4print(result)

خروجی:

1(S (NP A/DT black/JJ television/NN) and/CC (NP a/DT white/JJ stove/NN) were/VBD bought/VBN for/IN (NP the/DT new/JJ apartment/NN)
2of/IN John/NNP)

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

1result.draw()
برای مشاهده اندازه بزرگتر تصویر، روی آن کلیک کنید.

مثال دوم

کد پایتون:

1from nltk.tokenize import word_tokenize  
2from nltk import pos_tag 
3  
4# define chunking function with text and regular 
5# expression representing grammar as parameter 
6def chunking(text, grammar): 
7    word_tokens = word_tokenize(text) 
8  
9    # label words with part of speech 
10    word_pos = pos_tag(word_tokens) 
11  
12    # create a chunk parser using grammar 
13    chunkParser = nltk.RegexpParser(grammar) 
14  
15    # test it on the list of word tokens with tagged pos 
16    tree = chunkParser.parse(word_pos) 
17      
18    for subtree in tree.subtrees(): 
19        print(subtree) 
20    tree.draw() 
21      
22sentence = 'the little yellow bird is flying in the sky'
23grammar = "NP: {<DT>?<JJ>*<NN>}"
24chunking(sentence, grammar)

خروجی:

1(S
2(NP the/DT little/JJ yellow/JJ bird/NN)
3is/VBZ
4flying/VBG
5in/IN
6(NP the/DT sky/NN))
7(NP the/DT little/JJ yellow/JJ bird/NN)
8(NP the/DT sky/NN)

روش «بازشناسی موجودیت نام‌دار» (Named Entity Recognition)

روش‌های بازشناسی موجودیت نام‌دار، با هدف شناسایی موجودیت‌های نام‌دار در داده‌های متنی و دسته‌بندی کردن آن‌ها در طبقه‌بندی‌های از پیش تعریف شده (نام شخصیت‌ها، مکان‌ها، سازمان‌ها، اشیاء و سایر موارد) پدید آمده‌اند. تاکنون، کتابخانه‌ها، ابزارهای برنامه‌نویسی متنوعی جهت بازشناسی موجودیت‌های نام‌دار در داده‌های ارائه شده‌اند. مهم‌ترین ابزارهایی که جهت بازشناسی موجودیت‌های نام‌دار توسعه داده شده‌اند و در اختیار برنامه‌نویسان و کاربران قرار گرفته شده‌اند، عبارتند از:

  • کتابخانه NLTK (WordNet Lemmatizer)‎.
  • کتابخانه spaCy
  • کتابخانه Stanford CoreNLP
  • کتابخانه Apache OpenNLP
  • کتابخانه Apache Lucene
  • کتابخانه General Architecture for Text Engineering (GATE)‎
  • ابزار MITIE
  • کتابخانه DKPro Core
  • کتابخانه FreeLing
  • کتابخانه Watson Natural Language Understanding
  • کتابخانه TextRazor

همچنین در جدول زیر، ابزارهای پیش پردازش معرفی شده جهت بازشناسی موجودیت‌های نام‌دار (Named Entity Recognition)، در زبان‌های برنامه‌نویسی مختلف، نمایش داده شده‌اند.

نام ابزار پیش پردازش متنتوسعه دهنده و سال عرضه ویژگی‌های ابزار پیش پردازش متنزبان
BaleenDefence Science and Technology Laboratory (Dstl), 2014این ابزار، توانایی انجام عملیات روی داده‌های نیمه ساخت یافته و غیر ساخت یافته را دارد.

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

Java
CogComp NER Tagger (Illinois Named Entity Tagger)L. Ratinov, D. Roth, Cognitive Computation Group, 2009این ابزار، داده‌های متنی را توسط موجودیت‌های نام‌دار برچسب‌گذاری می‌کند.

در این ابزار، از 4 نوع برچسب مختلف برای برچسب‌گذاری موجودیت‌های نام‌دار استفاده می‌شود (اشخاص، سازمان‌ها، مکان‌ها و متفرقه).

همچنین از 18 نوع برچسب دیگر نیز می‌توان برای برچسب‌گذاری موجودیت‌های نام‌دار استفاده کرد(بر اساس مجموعه داده متنی OntoNotes)

Java
Minimal Named-Entity Recognizer (MER)LaSIGE, Faculdade de Ciências, Universidade de Lisboa, Portugal, 2017خروجی این ابزار، لیستی از نام‌های شناسایی شده در یک داده متنی، به همراه مکان دقیق آن‌ها است (حاشیه‌نویسی نام‌ها به وسیله مکان آن‌ها).

برای بازشناسی موجودیت‌های نام‌دار تنها به یک لغت نامه (فایل متنی) مورد نیاز است که باید نمایش دهنده موجودیت‌های مورد علاقه و قابل شناسایی در داده‌های متنی باشد (جهت بازشناسی موجودیت‌های نام‌دار از وب سرویس‌های RESTful استفاده می‌شود).

GNU awk
ParallelDotsParallelDotsاز فناوری یادگیری عمیق برای مشخص کردن گروه‌بندی‌های کاراکتری در داده‌های متنی استفاده می‌کند.

این ابزار، مرتبط‌ترین موجودیت‌های نام‌دار موجود در داده‌های متنی را کشف می‌کند.

ابزاری دقیق، بلادرنگ (Real-Time) و قابل سفارشی‌سازی شدن جهت بازشناسی موجودیت‌های نام‌دار محسوب می‌شود.

 AI APIs and excel add-in
Open CalaisThomson Reuters Corporationبا استفاده از این ابزار، قابلیت استخراج موجودیت‌ها (اشخاص، مکان‌ها، محصولات، روابط، حقایق، رویدادها و موضوعات)، از داده‌های متنی، برای برنامه‌نویسان و توسعه‌دهندگان فراهم می‌آید.API
LingPipeBreck Baldwin, 1999بازشناسی نام‌های اشخاص، سازمان‌ها یا مکان‌ها در داده‌های متنی، توسط این ابزار امکان‌پذیر است.

پیاده‌سازی مدل‌های مختلف جهت پشتیبانی از پیش پردازش متن به زبان‌های مختلف و پشتیبانی از پیش پردازش داده‌های متنی به فرمت‌های مختلف

Java
Named Entity Recognition ToolGuillaume Lample, Miguel Ballesteros, Sandeep Subramanian, Kazuya Kawakami, Chris Dyer, 2016بهره‌گیری از معماری مبتنی بر شبکه‌های عصبی مصنوعی، یکی از ویژگی‌های مهم این ابزار محسوب می‌شود.

این ابزار، عملکرد بسیار بهینه و با دقت بالایی روی مجموعه داده‌های CoNLL (داده‌های متنی به زبان‌های انگلیسی، آلمانی، اسپانیایی و هلندی) از خود نشان می‌دهد.

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

Python
MinorThirdWilliam W. Cohen, Carnegie Mellon University, 2004این ابزار، روش‌های پیشرفته یادگیری را با ابزارهای حاشیه‌نویسی و بصری‌سازی داده‌های متنی ترکیب و از این طریق، موجودیت‌های نام‌دار را شناسایی می‌کند.

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

Java
Watson Named Entity Recognition annotatorIBMابزاری جهت حاشیه‌نویسی داده‌‌های متنی با موجودیت‌های نام‌دار نظیر اشخاص، مکان‌ها و سازمان‌ها محسوب می‌شود.

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

Python SDK
PoolParty Semantic SuiteSemantic Web Company, 2009یک ابزار ماژولار (Modular) و انعطاف‌پذیر جهت پیش پردازش متن محسوب می‌شود.

از فناوری‌های استاندارد تعریف شده توسط سازمان W3C جهت پیاده‌سازی این ابزار استفاده شده است.

این ابزار، از فراداده‌های (Metadata) معنایی جهت غنی‌سازی اطلاعات موجود در داده‌های متنی استفاده می‌کند.

داده‌ها ابتدا به گراف‌های RDF تبدیل و پس از آن توسط SPARQL قابل Query هستند.
Rosette Entity ExtractorBasis Technology, 1995پشتیبانی از پیش پردازش متن به زبان‌های مختلف

این ابزار، از مجموعه‌ای متشکل از 18 نوع برچسب مختلف برای برچسب‌گذاری موجودیت‌های نام‌دار استفاده می‌کند.

همچنین، هنگام برچسب‌گذاری داده‌های متنی به وسیله موجودیت‌های نام‌دار، ضریب اطمینان هر کدام از موجودیت‌های شناسایی شده محاسبه و به کاربر نمایش داده می‌شود.

 Python

مثال اول

کد پایتون:

1from nltk import word_tokenize, pos_tag, ne_chunk
2input_str = “Bill works for Apple so he went to Boston for a conference.3print ne_chunk(pos_tag(word_tokenize(input_str)))

خروجی:

1(S (PERSON Bill/NNP) works/VBZ for/IN Apple/NNP so/IN he/PRP went/VBD to/TO (GPE Boston/NNP) for/IN a/DT conference/NN ./.)

مثال دوم

کد پایتون:

1pip install spacy
2python -m spacy download en_core_web_sm
1import spacy 
2  
3nlp = spacy.load('en_core_web_sm') 
4  
5sentence = "Apple is looking at buying U.K. startup for $1 billion"
6  
7doc = nlp(sentence) 
8  
9for ent in doc.ents: 
10    print(ent.text, ent.start_char, ent.end_char, ent.label_) 

خروجی:

1Apple 0 5 ORG
2U.K. 27 31 GPE
3$1 billion 44 54 MONEY

مثال سوم

کد پایتون:

1import nltk.tag 
2from nltk.chunk.util import conlltags2tree 
3from nltk.corpus import ieer 
4  
5def ieertree2conlltags(tree, tag = nltk.tag.pos_tag): 
6    words, ents = zip(*tree.pos()) 
7    iobs = [] 
8    prev = None
9    for ent in ents: 
10        if ent == tree.label(): 
11            iobs.append('O') 
12            prev = None
13        elif prev == ent: 
14            iobs.append('I-% s' % ent) 
15        else: 
16            iobs.append('B-% s' % ent) 
17            prev = ent 
18      
19    words, tags = zip(*tag(words)) 
20      
21    return zip(words, tags, iobs)
1import nltk.tag 
2from nltk.chunk.util import conlltags2tree 
3from nltk.corpus import ieer 
4  
5def ieer_chunked_sents(tag = nltk.tag.pos_tag): 
6    for doc in ieer.parsed_docs(): 
7        tagged = ieertree2conlltags(doc.text, tag) 
8        yield conlltags2tree(tagged) 
1from nltk.corpus import ieer 
2from chunkers import ieer_chunked_sents, ClassifierChunker 
3from nltk.corpus import treebank_chunk 
4  
5ieer_chunks = list(ieer_chunked_sents()) 
6  
7print ("Length of ieer_chunks : ", len(ieer_chunks)) 
8  
9# initializing chunker 
10chunker = ClassifierChunker(ieer_chunks[:80]) 
11print("\nparsing : \n", chunker.parse( 
12        treebank_chunk.tagged_sents()[0])) 
13  
14# evaluating 
15score = chunker.evaluate(ieer_chunks[80:]) 
16  
17a = score.accuracy() 
18p = score.precision() 
19r = score.recall() 
20  
21print ("\nAccuracy : ", a) 
22print ("\nPrecision : ", p) 
23print ("\nRecall : ", r)

خروجی:

1Length of ieer_chunks : 94
2
3parsing : 
4Tree('S', [Tree('LOCATION', [('Pierre', 'NNP'), ('Vinken', 'NNP')]),
5(', ', ', '), Tree('DURATION', [('61', 'CD'), ('years', 'NNS')]),
6Tree('MEASURE', [('old', 'JJ')]), (', ', ', '), ('will', 'MD'), ('join', 'VB'), 
7('the', 'DT'), ('board', 'NN'), ('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'),
8('director', 'NN'), Tree('DATE', [('Nov.', 'NNP'), ('29', 'CD')]), ('.', '.')])
9
10Accuracy : 0.8829018388070625
11
12Precision : 0.4088717454194793
13
14Recall : 0.5053635280095352

روش‌های مشخص کردن مرجع مشترک (Coreference resolution) در پیش پردازش متن

در فرایند پیش پردازش متن و پیش از پیاده‌سازی کاربردهای پردازش زبان طبیعی (Natural Language Processing) نیاز است تا ضمایر (Pronouns) و دیگر عبارات اشاره کننده (Referring Expressions)، به موجودیت‌های صحیح و متناظر خود متصل شوند.

روش‌های مشخص کردن مرجع مشترک، ضمایر و دیگر عبارات اشاره‌کننده‌ای را که به یک موجودیت جهان واقعی یکسان اشاره می‌کنند، در داده‌های متنی مشخص می‌کنند. به عنوان نمونه، در جمله Andrew said he would buy a car، ضمیر he به شخص Andrew اشاره دارد. مهم‌ترین کتابخانه‌هایی که حاوی ابزارهای لازم جهت مشخص کردن مرجع مشترک (Coreference resolution) در داده‌های متنی هستند، عبارتند از:

  • کتابخانه Stanford CoreNLP
  • کتابخانه Apache OpenNLP
  • کتابخانه Open Calais

همچنین در جدول زیر، ابزارهای معرفی شده جهت مشخص کردن مرجع مشترک (Coreference resolution)، در زبان‌های برنامه‌نویسی مختلف، نمایش داده شده‌اند.

نام ابزار پیش پردازش متنتوسعه دهنده و سال عرضه ویژگی‌های ابزار پیش پردازش متنزبان
Beautiful Anaphora Resolution Toolkit (BART)Massimo Poesio, Simone Ponzetto, Yannick Versley, Johns Hopkins Summer Workshop, 2007 از مجموعه متنوعی از روش‌ها، مدل‌ها و ابزارهای یادگیری ماشین (Machine Learning) برای مشخص کردن مرجع مشترک عبارات در داده‌های متنی استفاده می‌کند.

در این ابزار، خروجی حاصل از عملیات مشخص کردن مرجع مشترک، در قالب XML تولید می‌شود.

REST-based web service
 JavaRAPLong Qiu, 2004 این ابزار، قابلیت مشخص کردن مرجع مشترک بسیاری از ضمایر و عبارات اشاره کننده را در داده‌های متنی دارد.

این ابزار، سرعت بسیار خوبی دارد و قادر است بیش از 1500 کلمه در ثانیه را پردازش کند.

Java
 A General Tool for Anaphora Resolution - GuiTARUniversity of Essex, 2007این ابزار، فایل متنی ورودی را در قالب XML دریافت و یک فایل نشانه‌گذاری شده به وسیله مراجع مشترک را به عنوان خروجی تولید می‌کند.

همچنین، یک ماژول خاص برای ارزیابی عملکرد در این ابزار تعبیه شده است.

 Java
ReconcileCornell University, The University of Utah, Lawrence Livermore National Labs, 2009 عملکردهای تعبیه شده در این ابزار، روی داده‌های متنی معمولی و یا داده‌های متنی غیر ساخت یافته قابل اجرا هستند.

این ابزار، از تکنیک‌های نظارت شده یادگیری ماشین (نظیر مدل‌های تعریف شده در Weka، ابزار Berkley Parser و سیستم بازشناسی موجودیت‌های نام‌دار Stanford) جهت شناسایی مرجع مشترک در واحدهای زبان طبیعی استفاده می‌کند.

 Java
ARKrefBrendan O'Connor, Michael Heilman, 2009 این ابزار، یک سیستم مبتنی بر قاعده (Rule-based) و قطعی (Deterministic) برای مشخص کردن مرجع مشترک محسوب می‌شود.

در این ابزار، از اطلاعات نحوی به دست آمده از یک مدل تجزیه و تحلیل سطحی (Syntactic parser) و اطلاعات معنایی حاصل از یک سیستم بازشناسی موجودیت‌های نام‌دار (NER) جهت شناسایی مراجع مشترک در داده‌های متنی استفاده می‌شود.

 Java
Illinois Coreference PackageDan Roth, Eric Bengtson, 2008این ابزار، یک سیستم دسته‌بندی ویژگی با هدف شناسایی مراجع مشترک (در داده‌های متنی) محسوب می‌شود. Java
Neural corefHugging Face, 2017این ابزار، از شبکه‌های عصبی مصنوعی و کتابخانه Spacy جهت مشخص کردن مراجع مشترک در داده‌های متنی استفاده می‌کند.Python
coreference resolution toolkit (cort)Sebastian Martschat, Thierry Goeckel, Patrick Clausاین ابزار، از مؤلفه‌های خاصی جهت شناسایی مرجع مشترک و تحلیل خطا بهره می‌برد.

در این ابزار، از رویکردهای مبتنی بر متغیرهای نهان (Latent Variables) جهت شناسایی مرجع مشترک استفاده می‌شود.

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

Python
CherryPickerAltaf Rahman, Vincent Ng, University of Texas at Dallas, 2009این ابزار، یک مدل «رتبه‌بندی خوشه» (Cluster-Ranking) جهت شناسایی مرجع مشترک محسوب می‌شود.

همچنین، این برای اجرا در سیستم‌های عمل لینوکس و مبتنی بر Unix طراحی شده است.

-
FreeLingTALP Research Center, Universitat Politècnica de Catalunyaاین ابزار، قابلیت‌های تحلیل زبان را برای کاربران و برنامه‌نویسان فراهم آورده است.

پشتیبانی از پیش پردازش متن به زبان‌های مختلف

در این ابزار، از واسط خط دستور (Command line) پشتیبانی می‌شود.

C++‎
eXternally configurable REference and Non Named Entity Recognizer (xrenner)Zeldes, Amir and Zhang, Shuo, Department of Linguistics at

Georgetown University, 2016

یک سیستم مستقل از زبان برای شناسایی مرجع مشترک در زبان‌های طبیعی مختلف محسوب می‌شود.

این ابزار، از مدل‌های دسته‌بندی (یادگیری ماشین) جهت شناسایی مرجع مشترک بهره می‌برد.

Python

کد پایتون:

1from xrenner import Xrenner
2
3xrenner = Xrenner()
4# Get a parse in basic Stanford Dependencies (not UD)
5my_conllx_result = some_parser.parse("Mrs. Hills said that the U.S. is still concerned about disturbing developments in Turkey and continuing slow progress in Malaysia . She did n't elaborate.")
6
7sgml_result = xrenner.analyze(my_conllx_result,"sgml")
8print(sgml_result)

خروجی:

1<referent id="referent_197" entity="person" group="34" antecedent="referent_142" type="coref">
2Mrs.
3Hills
4</referent>
5said
6that
7<referent id="referent_198" entity="place" group="2" antecedent="referent_157" type="coref">
8the
9U.S.
10</referent>
11is
12still
13concerned
14about
15``
16disturbing
17developments
18in
19<referent id="referent_201" entity="place" group="20" antecedent="referent_193" type="coref">
20Turkey
21</referent>
22and
23continuing
24slow
25progress
26in
27<referent id="referent_203" entity="place" group="20" antecedent="referent_201" type="coref">
28Malaysia
29</referent>
30.
31''
32<referent id="referent_204" entity="person" group="34" antecedent="referent_197" type="ana">
33She
34</referent>
35did
36n't
37elaborate

استخراج عبارات هم‌اتفاق یا باهم‌گذار (Collocation) در پیش پردازش متن

عبارات هم‌اتفاق یا باهم‌گذار (Collocation)، ترکیبی از کلمات هستند که معمولا در زمینه‌های محتوایی مختلف، در کنار یکدیگر ظاهر می‌شوند (به عبارت دیگر، ظاهر شدن این کلمات در کنار یکدیگر تصادفی نیست). از جمله عباراتی که می‌توان آن‌ها را به عنوان عبارات هم‌اتفاق در نظر گرفت، می‌توان به مواردی نظیر draw a conclusion ،free time و سایر موارد اشاره کرد.

در جدول زیر، ابزارهای توسعه داده شده جهت استخراج عبارات هم‌اتفاق یا باهم‌گذار (Collocation)، در زبان‌های برنامه‌نویسی مختلف، نمایش داده شده‌اند.

نام ابزار پیش پردازش متنتوسعه دهنده و سال عرضه ویژگی‌های ابزار پیش پردازش متنزبان
TermeXText Analysis and Knowledge Engineering Lab, University of Zagreb, 2009 این ابزار، داده‌های ورودی را در قالب فایل‌های متنی با کدبندی UFT-8 دریافت می‌کند.

در این ابزار، از پردازش مدل‌های N-gram جهت استخراج عبارات هم‌اتفاق استفاده می‌شود.

ابزاری بسیار کارآمد، سریع و از لحاظ حافظه مقرون به صرفه، جهت پردازش مجموعه داده‌های عظیم محسوب می‌شود.

Front end GUI
CollocateAthelstanدر این ابزار، از محاسبات (و تحلیل) آماری و آنالیز اطلاعات مرتبط با تناوب کلمات (Frequency Information) برای مشخص کردن لیستی از کلمات هم‌اتفاق استفاده می‌شود.

خروجی نهایی این ابزار، در قالب یک مدل N-gram است.

برای استخراج کلمات هم‌اتفاق از روش‌های آستانه‌گذاری و یا «اطلاعات متقابل» (Mutual Information) استفاده می‌شود.

 برنامه کاربردی
CollTermFaculty of Humanities and Social Sciences at University of Zagreb; Research Institute for Artificial Intelligence at Romanian Academyیک روش مستقل از زبان (Language Independent) جهت استخراج کلمات هم‌اتفاق محسوب می‌شود.

این ابزار، با به‌کارگیری روش TF-IDF و پنج معیار مختلف جهت محاسبه هم‌اتفاقی یا محاسبه اختلافات توزیعی (Distributional Difference)، مجموعه‌ای از کلمات هم‌اتفاق در داده‌های متنی را شناسایی می‌کند.

Python
Collocation ExtractorDan Ștefănescu, 2012یک روش مستقل از زبان جهت استخراج کلمات هم‌اتفاق محسوب می‌شود.

در این ابزار، کلماتی که فاصله آن‌ها از یکدیگر (در داده‌های متنی) نسبتا ثابت است و احتمال ظاهر شدن آن‌ها در کنار یکدیگر از شانس بیشتر است (Log-Likelihood)، به عنوان کلمات هم‌اتفاق انتخاب می‌شوند.

 برنامه کاربردی
ICE: Idiom and Collocation ExtractorVerizon Labs, Computer Science Dept. University of Houston, 2017این ابزار، برای استخراج کلمات هم‌اتفاق و اصطلاحات به کار می‌رود.

برای شناسایی کلمات هم‌اتفاق، از روش‌های جستجوی آنلاین و آفلاین دیکشنری (Online and offline Dictionary Search)، جستجوی وب و جایگزینی (Web Search and Substitution) و رویکرد مستقل از جستجوی وب (Web Search Independence) استفاده می‌شود.

Python
Text::NSPUniversity of Minnesota, Carnegie Mellon University, University of Pittsburgh,  2000این ماژول، مدل‌های زبانی N-Gram و کلمات هم‌اتفاق را از داده‌های متنی استخراج می‌کند.

همچنین، ماژولی در این ابزار تعریف شده است که مشخص می‌کند آیا هم‌اتفاقی کلمات بر اساس شانس بوده است یا از لحاظ آماری معنادار است.

Perl

مثال اول

کد پایتون:

1input=[“he and Chazz duel with all keys on the line.]
2from ICE import CollocationExtractor
3extractor = CollocationExtractor.with_collocation_pipeline(“T1” , bing_key = “Temp”,pos_check = False)
4print(extractor.get_collocations_of_length(input, length = 3))

خروجی:

1[“on the line”]

جمع‌بندی

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

پس از اینکه فرایند پیش پردازش داده‌های متنی به پایان می‌رسد، از اطلاعات استخراج شده می‌توان جهت پیاده‌سازی کاربردهای پیشرفته‌تر در حوزه «پردازش زبان طبیعی» (Natural Language Processing) نظیر «ترجمه ماشینی» (Machine Translation) و «تولید زبان طبیعی» (Natural Language Generation) استفاده کرد.

اگر نوشته بالا برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Medium
۳ دیدگاه برای «پیش پردازش متن در پایتون — راهنمای جامع»

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

با سلام و احترام؛

صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

از اینکه این مطلب مورد توجه شما قرار گرفته، بسیار خشنود هستیم.

در خصوص بحث انتخاب ویژگی می‌توانید از دوره‌های آموزشی زیر در پلتفرم فرادرس استفاده کنید:

  • دوره آموزش مبانی انتخاب ویژگی Feature Selection در داده کاوی
  • دوره آموزش انتخاب ویژگی با استفاده از الگوریتم های فراابتکاری و تکاملی
  • دوره آموزش یادگیری ماشین و پیاده سازی در پایتون Python – بخش دوم
  • مطالب مرتبط با استخراج ویژگی در پایتون نیز در ادامه فهرست شده‌اند. در آینده نیز حتماً مطلبی را دقیقاً مرتبط با این موضوع منتشر خواهیم کرد.

  • روش های انتخاب ویژگی در پایتون — راهنمای جامع
  • انتخاب ویژگی (Feature Selection) در داده های ابعاد بالا — خودآموز ساده
  • پردازش تصویر با پایتون — راهنمای کاربردی
  • استخراج (Extraction) و تبدیل (Transformation) داده ها در پایتون — راهنمای جامع
  • برای شما آرزوی سلامتی و موفقیت داریم.

    import string
    result = input_str.translate(string.maketrans(“”,””), string.punctuation)
    در این قسمت string امکان دسترسی به string.maketrans را نمیدهد . و با error ریز مواجه میشم
    module ‘string’ has no attribute ‘maketrans’

    نظر شما چیست؟

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