پیش پردازش متن در پایتون — راهنمای جامع
در این مطلب، مراحل و روشهای لازم برای پیش پردازش متن مورد بررسی قرار میگیرند. روشهای پیش پردازش متن از آن جهت حائز اهمیت هستند که ابزارهای لازم را برای تبدیل (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 |
TextBlob | Steven Loria, 2013 |
تقسیمبندی کردن دادههای متنی به واحدهای زبانی تشکیل دهنده نظیر کلمه و جمله امکان یکپارچهسازی با پایگاه دانش وردنت (WordNet) | Python |
Spacy | Explosion AI, 2016 |
پشتیبانی از سیستمهای عامل Mac/Unix/Windows استفاده از مدلهای شبکه عصبی مصنوعی (Artificial Neural Network) جهت پیش پردازش متن پشتیبانی از پیش پردازش متن به زبانهای مختلف | Python |
Gensim | RaRe Technologies, 2009 |
قابلیت پردازش حجم عظیمی از دادهها (در مقیاس وب) پشتیبانی از سیستمهای عامل Mac/Unix/Windows امکان استفاده از مدلسازی فضای برداری (Vector space Modeling) و مدلسازی موضوعی (Topic Modelling) | Python |
Apache OpenNLP | Apache Software Foundation, 2004 |
در این ابزار پیش پردازش دادههای متنی، تعداد زیادی مدل از پیش ساخته شده برای زبانهای مختلف گنجانده شده است. این ابزار، منابع متنی «حاشیه نویسی شده» (Annotated) زیادی را در خود جای داده است. | Java |
OpenNMT | Yoon 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 UIMA | IBM, 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 |
RapidMiner | RapidMiner, 2006 |
پلتفرم یکپارچه برای پیش پردازش متن طراحی مبتنی بر «جریان کاری بصری» (Visual Workflow) دسترسی به مجموعه وسیعی از ابزارهای پیش پردازش متن | ابزار RapidMiner، یک «واسط کاربری گرافیکی» برای طراحی و اجرای جریانهای کاری تحلیلی فراهم میآورد. |
MAchine Learning for LanguagE Toolkit (MALLET) | Andrew Kachites McCallum, University of Massachusetts Amherst, 2002 |
این کتابخانه شامل ابزارهای پیشرفتهای جهت دستهبندی اسناد متنی و برچسبگذاری دنباله (Sequence Tagging) است. این ابزار، اجازه «استنتاج» (Inference) در مدلهای گرافی (Graphical Models) را به کاربر و برنامهنویس میدهد. | Java |
Pattern | T. De Smedt & W. Daeleman, 2012 |
این ابزار، ماژولی برای «وب کاوی» (Web Mining) محسوب میشود. پشتیبانی از سیستمهای عامل Mac/Unix/Windows پشتیبانی از پیش پردازش متن به زبانهای مختلف | Python |
Stanford Tokenizer | The Stanford Natural Language Processing Group, 2010 |
یکی از ویژگیهای مهم این ابزار، سرعت فوقالعاده آن در پیش پردازش متن است (چیزی در حدود 1 میلیون توکن در ثانیه). امکانات بسیار زیادی جهت پردازش توکنها و جداسازی واژگان در اختیار کاربر و برنامهنویس قرار میدهد. | Java |
FreeLing | TALP 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 |
Snowball | Martin Porter, 2002 |
پشتیبانی از پیش پردازش متن به زبانهای مختلف یک زبان «پردازش رشته» (String Processing) بسیار کوچک محسوب میشود که برای تولید الگوریتمهای ریشهیابی طراحی شده است. |
Java |
PyStemmer | Richard Boulton, 2006 |
الگوریتم بسیار مؤثر و کارآمد جهت محاسبه شکل ریشهای کلمات الگوریتمهای مختلفی جهت پشتیبانی از ریشهیابی دادههای متنی نوشته شده به زبانهایی غیر از بان انگلیسی (بیشتر زبانهای کشورهای اروپایی)، در این ابزار توسعه داده شده است. پیادهسازی نسخهای خاص از الگوریتم Porter جهت ریشهیابی کلمات در زبان انگلیسی | MPython |
Hunspell stemmer | کاربری به نام lopusz در GitHub |
پشتیبانی از ریشهیابی کلمات در زبان لهستانی ریشهیابی مبتنی بر Dictionary | Java |
CoreNLP Stemmer | The Stanford Natural Language Processing Group, 2010 | در این ابزار، کلاس خاصی برای ریشهیابی کلمات و پیش پردازش متن پیادهسازی شده است. | Java |
Apache Lucene | Apache Software Foundation, 1999 |
شاخصگذاری مقیاسپذیر (Scalable) و با عملکرد بالا پیادهسازی الگوریتمهای جستجوی قدرتمند، دقیق و کارآمد این ابزار، یک سیستم چندسکویی برای پیش پردازش متن محسوب میشود. | Python |
DKPro Core | The 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)، در زبانهای برنامهنویسی مختلف، نمایش داده شدهاند.
نام ابزار پیش پردازش متن | توسعه دهنده و سال عرضه | ویژگیهای ابزار پیش پردازش متن | زبان |
Baleen | Defence 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 |
ParallelDots | ParallelDots | از فناوری یادگیری عمیق برای مشخص کردن گروهبندیهای کاراکتری در دادههای متنی استفاده میکند.
این ابزار، مرتبطترین موجودیتهای نامدار موجود در دادههای متنی را کشف میکند. ابزاری دقیق، بلادرنگ (Real-Time) و قابل سفارشیسازی شدن جهت بازشناسی موجودیتهای نامدار محسوب میشود. | AI APIs and excel add-in |
Open Calais | Thomson Reuters Corporation | با استفاده از این ابزار، قابلیت استخراج موجودیتها (اشخاص، مکانها، محصولات، روابط، حقایق، رویدادها و موضوعات)، از دادههای متنی، برای برنامهنویسان و توسعهدهندگان فراهم میآید. | API |
LingPipe | Breck Baldwin, 1999 | بازشناسی نامهای اشخاص، سازمانها یا مکانها در دادههای متنی، توسط این ابزار امکانپذیر است.
پیادهسازی مدلهای مختلف جهت پشتیبانی از پیش پردازش متن به زبانهای مختلف و پشتیبانی از پیش پردازش دادههای متنی به فرمتهای مختلف | Java |
Named Entity Recognition Tool | Guillaume Lample, Miguel Ballesteros, Sandeep Subramanian, Kazuya Kawakami, Chris Dyer, 2016 | بهرهگیری از معماری مبتنی بر شبکههای عصبی مصنوعی، یکی از ویژگیهای مهم این ابزار محسوب میشود.
این ابزار، عملکرد بسیار بهینه و با دقت بالایی روی مجموعه دادههای CoNLL (دادههای متنی به زبانهای انگلیسی، آلمانی، اسپانیایی و هلندی) از خود نشان میدهد. همچنین، امکان بازشناسی دقیق موجودیتهای نامدار بدون استفاده از پایگاههای دانش ساختیافته یا منابع دانش مرتبط با یک زبان خاص فراهم شده است. | Python |
MinorThird | William W. Cohen, Carnegie Mellon University, 2004 | این ابزار، روشهای پیشرفته یادگیری را با ابزارهای حاشیهنویسی و بصریسازی دادههای متنی ترکیب و از این طریق، موجودیتهای نامدار را شناسایی میکند.
این ابزار، از مدلهای یادگیری خاص نظیر یادگیری فعال و یادگیری آنلاین نیز پشتیبانی میکند. | Java |
Watson Named Entity Recognition annotator | IBM | ابزاری جهت حاشیهنویسی دادههای متنی با موجودیتهای نامدار نظیر اشخاص، مکانها و سازمانها محسوب میشود.
پشتیبانی از پیش پردازش متن به زبانهای مختلف | Python SDK |
PoolParty Semantic Suite | Semantic Web Company, 2009 | یک ابزار ماژولار (Modular) و انعطافپذیر جهت پیش پردازش متن محسوب میشود.
از فناوریهای استاندارد تعریف شده توسط سازمان W3C جهت پیادهسازی این ابزار استفاده شده است. این ابزار، از فرادادههای (Metadata) معنایی جهت غنیسازی اطلاعات موجود در دادههای متنی استفاده میکند. | دادهها ابتدا به گرافهای RDF تبدیل و پس از آن توسط SPARQL قابل Query هستند. |
Rosette Entity Extractor | Basis 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 |
JavaRAP | Long Qiu, 2004 | این ابزار، قابلیت مشخص کردن مرجع مشترک بسیاری از ضمایر و عبارات اشاره کننده را در دادههای متنی دارد.
این ابزار، سرعت بسیار خوبی دارد و قادر است بیش از 1500 کلمه در ثانیه را پردازش کند. | Java |
A General Tool for Anaphora Resolution - GuiTAR | University of Essex, 2007 | این ابزار، فایل متنی ورودی را در قالب XML دریافت و یک فایل نشانهگذاری شده به وسیله مراجع مشترک را به عنوان خروجی تولید میکند.
همچنین، یک ماژول خاص برای ارزیابی عملکرد در این ابزار تعبیه شده است. | Java |
Reconcile | Cornell University, The University of Utah, Lawrence Livermore National Labs, 2009 | عملکردهای تعبیه شده در این ابزار، روی دادههای متنی معمولی و یا دادههای متنی غیر ساخت یافته قابل اجرا هستند.
این ابزار، از تکنیکهای نظارت شده یادگیری ماشین (نظیر مدلهای تعریف شده در Weka، ابزار Berkley Parser و سیستم بازشناسی موجودیتهای نامدار Stanford) جهت شناسایی مرجع مشترک در واحدهای زبان طبیعی استفاده میکند. | Java |
ARKref | Brendan O'Connor, Michael Heilman, 2009 | این ابزار، یک سیستم مبتنی بر قاعده (Rule-based) و قطعی (Deterministic) برای مشخص کردن مرجع مشترک محسوب میشود.
در این ابزار، از اطلاعات نحوی به دست آمده از یک مدل تجزیه و تحلیل سطحی (Syntactic parser) و اطلاعات معنایی حاصل از یک سیستم بازشناسی موجودیتهای نامدار (NER) جهت شناسایی مراجع مشترک در دادههای متنی استفاده میشود. | Java |
Illinois Coreference Package | Dan Roth, Eric Bengtson, 2008 | این ابزار، یک سیستم دستهبندی ویژگی با هدف شناسایی مراجع مشترک (در دادههای متنی) محسوب میشود. | Java |
Neural coref | Hugging Face, 2017 | این ابزار، از شبکههای عصبی مصنوعی و کتابخانه Spacy جهت مشخص کردن مراجع مشترک در دادههای متنی استفاده میکند. | Python |
coreference resolution toolkit (cort) | Sebastian Martschat, Thierry Goeckel, Patrick Claus | این ابزار، از مؤلفههای خاصی جهت شناسایی مرجع مشترک و تحلیل خطا بهره میبرد.
در این ابزار، از رویکردهای مبتنی بر متغیرهای نهان (Latent Variables) جهت شناسایی مرجع مشترک استفاده میشود. همچنین، قابلیت تحلیل و مصورسازی خطاهای تولید شده توسط سیستم شناسایی مرجع مشترک، در این ابزار گنجانده شده است. | Python |
CherryPicker | Altaf Rahman, Vincent Ng, University of Texas at Dallas, 2009 | این ابزار، یک مدل «رتبهبندی خوشه» (Cluster-Ranking) جهت شناسایی مرجع مشترک محسوب میشود.
همچنین، این برای اجرا در سیستمهای عمل لینوکس و مبتنی بر Unix طراحی شده است. | - |
FreeLing | TALP 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)، در زبانهای برنامهنویسی مختلف، نمایش داده شدهاند.
نام ابزار پیش پردازش متن | توسعه دهنده و سال عرضه | ویژگیهای ابزار پیش پردازش متن | زبان |
TermeX | Text Analysis and Knowledge Engineering Lab, University of Zagreb, 2009 | این ابزار، دادههای ورودی را در قالب فایلهای متنی با کدبندی UFT-8 دریافت میکند.
در این ابزار، از پردازش مدلهای N-gram جهت استخراج عبارات هماتفاق استفاده میشود. ابزاری بسیار کارآمد، سریع و از لحاظ حافظه مقرون به صرفه، جهت پردازش مجموعه دادههای عظیم محسوب میشود. | Front end GUI |
Collocate | Athelstan | در این ابزار، از محاسبات (و تحلیل) آماری و آنالیز اطلاعات مرتبط با تناوب کلمات (Frequency Information) برای مشخص کردن لیستی از کلمات هماتفاق استفاده میشود.
خروجی نهایی این ابزار، در قالب یک مدل N-gram است. برای استخراج کلمات هماتفاق از روشهای آستانهگذاری و یا «اطلاعات متقابل» (Mutual Information) استفاده میشود. | برنامه کاربردی |
CollTerm | Faculty 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 Extractor | Dan Ștefănescu, 2012 | یک روش مستقل از زبان جهت استخراج کلمات هماتفاق محسوب میشود.
در این ابزار، کلماتی که فاصله آنها از یکدیگر (در دادههای متنی) نسبتا ثابت است و احتمال ظاهر شدن آنها در کنار یکدیگر از شانس بیشتر است (Log-Likelihood)، به عنوان کلمات هماتفاق انتخاب میشوند. | برنامه کاربردی |
ICE: Idiom and Collocation Extractor | Verizon Labs, Computer Science Dept. University of Houston, 2017 | این ابزار، برای استخراج کلمات هماتفاق و اصطلاحات به کار میرود.
برای شناسایی کلمات هماتفاق، از روشهای جستجوی آنلاین و آفلاین دیکشنری (Online and offline Dictionary Search)، جستجوی وب و جایگزینی (Web Search and Substitution) و رویکرد مستقل از جستجوی وب (Web Search Independence) استفاده میشود. | Python |
Text::NSP | University 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) استفاده کرد.
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای داده کاوی و یادگیری ماشین
- آموزش اصول و روشهای داده کاوی (Data Mining)
- مجموعه آموزشهای هوش مصنوعی
- متنکاوی (Text Mining) — به زبان ساده
- روشهای متنکاوی — راهنمای کاربردی
- پیادهسازی سیستمهای توصیهگر در پایتون — از صفر تا صد
- تولید زبان طبیعی در پایتون — راهنمای جامع
^^
سلام وقت بخیر
آموزش شما بسیار عالی و قابل تقدیر هست. تشکر از زحمات شما.
اگر امکانش هست آموزش feature extraction در پایتون را هم قرار بدهید. سپاسگزارم
با سلام و احترام؛
صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاسگزاریم.
از اینکه این مطلب مورد توجه شما قرار گرفته، بسیار خشنود هستیم.
در خصوص بحث انتخاب ویژگی میتوانید از دورههای آموزشی زیر در پلتفرم فرادرس استفاده کنید:
مطالب مرتبط با استخراج ویژگی در پایتون نیز در ادامه فهرست شدهاند. در آینده نیز حتماً مطلبی را دقیقاً مرتبط با این موضوع منتشر خواهیم کرد.
برای شما آرزوی سلامتی و موفقیت داریم.
import string
result = input_str.translate(string.maketrans(“”,””), string.punctuation)
در این قسمت string امکان دسترسی به string.maketrans را نمیدهد . و با error ریز مواجه میشم
module ‘string’ has no attribute ‘maketrans’