بخش قابل توجهی از داده هایی که امروز تولید می شوند ، ساختار ندارند. داده های بدون ساختار شامل نظرات شبکه های اجتماعی ، سابقه مرور و بازخورد مشتری است. آیا شما در وضعیتی قرار گرفته اید که دسته ای از داده های متنی برای تجزیه و تحلیل وجود دارد و ایده ای برای ادامه کار ندارید؟ پردازش زبان طبیعی در پایتون می تواند کمک کند.

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

بیا شروع کنیم!

پیش نیازها

در این آموزش ، ما از Python استفاده خواهیم کرد nltk کتابخانه برای انجام کلیه عملیات NLP بر روی متن. در زمان نوشتن این آموزش ، ما از نسخه 3.4 استفاده می کنیم nltk. به کتابخانه را نصب کنید، می توانید از pip دستور در ترمینال:

pip install nltk==3.4

برای بررسی اینکه کدام نسخه است nltk شما در سیستم دارید ، می توانید کتابخانه را به مفسر Python وارد کرده و نسخه را بررسی کنید:

import nltk
print(nltk.__version__)

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

با این حال ، اگر می خواهید بعداً در منابع آموزشی از بارگیری منابع فردی خودداری کرده و اکنون آنها را با یک حرکت دریافت کنید ، دستور زیر را اجرا کنید:

python -m nltk.downloader all

مرحله 1: تبدیل به نشانه ها

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

در کتابخانه NLTK ، می توانید از word_tokenize() تابع برای تبدیل یک رشته به نشانه ها. با این حال ، ابتدا باید بارگیری کنید punkt منبع دستور زیر را در ترمینال اجرا کنید:

nltk.download('punkt')

بعد ، باید وارد کنید word_tokenize از جانب nltk.tokenize برای استفاده از آن:

from nltk.tokenize import word_tokenize
print(word_tokenize("Hi, this is a nice hotel."))

خروجی کد به شرح زیر است:

['Hi', ',', 'this', 'is', 'a', 'nice', 'hotel', '.']

متوجه خواهید شد که word_tokenize به سادگی یک رشته را براساس فضای خالی تقسیم نمی کند ، بلکه علائم نگارشی را نیز به نشانه ها جدا می کند. این شما هستید که می خواهید علائم نگارشی را در تجزیه و تحلیل حفظ کنید.

مرحله 2: کلمات را به فرم های اصلی تبدیل کنید

هنگام پردازش زبان طبیعی ، اغلب متوجه می شوید که اشکال دستوری مختلفی از یک کلمه وجود دارد. به عنوان مثال ، “برو” ، “رفتن” و “رفته” اشکال یک فعل مشابه هستند ، “برو”.

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

اولین تکنیک ، ریشه زایی است. ساقه زدن یک الگوریتم ساده است که پسوندها را از یک کلمه حذف می کند. وجود دارد الگوریتم های بنیادی مختلف برای استفاده در NLTK موجود است. ما در این آموزش از الگوریتم Porter استفاده خواهیم کرد.

ما ابتدا وارد می کنیم PorterStemmer از جانب nltk.stem.porter. در مرحله بعدی ، ما پایه اولیه را به stemmer متغیر ، و سپس از .stem() روش برای پیدا کردن شکل اصلی یک کلمه:

from nltk.stem.porter import PorterStemmer 
stemmer = PorterStemmer()
print(stemmer.stem("going"))

خروجی کد بالا است go. اگر ساقه را برای فرم های دیگر “برو” توصیف شده در بالا اجرا کنید ، متوجه خواهید شد که ساقه همان فرم پایه را برمی گرداند ، “برو”. با این حال ، از آنجا که stemming فقط یک الگوریتم ساده مبتنی بر حذف پسوندهای کلمه است ، وقتی کلمات کمتر در زبان استفاده می شوند ، شکست می خورد.

به عنوان مثال ، وقتی پایه را روی کلمه “تشکیل می دهد” امتحان می کنید ، نتیجه ای غیرمستقیم به دست می دهد:

print(stemmer.stem("constitutes"))

خواهید دید که خروجی “تشکیل دهنده” است.

این مسئله با رفتن به رویکرد پیچیده تری برای یافتن شکل پایه یک کلمه در یک زمینه مشخص حل می شود. این فرآیند لماتیزاسیون نامیده می شود. لیمیت سازی یک کلمه را بر اساس زمینه و واژگان متن عادی می کند. در NLTK ، می توانید جملات را با استفاده از WordNetLemmatizer کلاس

ابتدا ، باید بارگیری کنید wordnet منبع از بارگیری کننده NLTK در ترمینال پایتون:

nltk.download('wordnet')

پس از بارگیری ، باید وارد کنید WordNetLemmatizer کلاس و مقداردهی اولیه آن:

from nltk.stem.wordnet import WordNetLemmatizer 
lem = WordNetLemmatizer()

برای استفاده از لمتراز ، از .lemmatize() روش. دو بحث طول می کشد: کلمه و زمینه. در مثال ما ، از “v” برای زمینه استفاده خواهیم کرد. بیایید پس از بررسی نتایج خروجی ، زمینه را بیشتر بررسی کنیم .lemmatize() روش:

print(lem.lemmatize('constitutes', 'v'))

متوجه خواهید شد که .lemmatize() روش به درستی کلمه “تشکیل می دهد” را به شکل پایه آن ، “تشکیل” تبدیل می کند. همچنین متوجه خواهید شد که لماتیزاسیون بیشتر از ریشه یابی طول می کشد ، زیرا الگوریتم پیچیده تر است.

بیایید نحوه تعیین آرگومان دوم را بررسی کنیم .lemmatize() روش به صورت برنامه ای NLTK دارای pos_tag() عملکردی که به تعیین زمینه یک کلمه در یک جمله کمک می کند. با این حال ، ابتدا باید بارگیری کنید averaged_perceptron_tagger منبع از طریق بارگیری کننده NLTK:

nltk.download('averaged_perceptron_tagger')

بعد ، وارد کنید pos_tag() عملکرد را اجرا کنید و آن را روی یک جمله اجرا کنید:

from nltk.tag import pos_tag
sample = "Hi, this is a nice hotel."
print(pos_tag(word_tokenize(sample)))

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

[('Hi', 'NNP'),
(',', ','),
('this', 'DT'),
('is', 'VBZ'),
('a', 'DT'),
('nice', 'JJ'),
('hotel', 'NN'),
('.', '.')]

چگونه متن هر رمز را رمزگشایی می کنید؟ در اینجا یک لیست کامل تمام برچسب ها و معانی مربوط به آنها در وب توجه داشته باشید که برچسب های همه اسامی با “N” شروع می شوند ، و برای همه افعال با “V” شروع می شوند. ما می توانیم از این اطلاعات در استدلال دوم خود استفاده کنیم .lemmatize() روش:

def lemmatize_tokens(stentence):
  lemmatizer = WordNetLemmatizer()
  lemmatized_tokens = []
  for word, tag in pos_tag(stentence):
    if tag.startswith('NN'):
      pos = 'n'
    elif tag.startswith('VB'):
      pos = 'v'
    else:
      pos = 'a'
    lemmatized_tokens.append(lemmatizer.lemmatize(word, pos))
  return lemmatized_tokens

sample = "Legal authority constitutes all magistrates."
print(lemmatize_tokens(word_tokenize(sample)))

خروجی کد بالا به شرح زیر است:

['Legal', 'authority', 'constitute', 'all', 'magistrate', '.']

این خروجی انتظار می رود ، جایی که “تشکیل دهنده” و “قاضی” به ترتیب به “تشکیل” و “قاضی” تبدیل شوند.

مرحله 3: تمیز کردن داده ها

گام بعدی در تهیه داده ها پاک سازی داده ها و حذف مواردی است که به تجزیه و تحلیل شما معنی نمی دهد. به طور گسترده ، ما به بررسی علائم نگارشی و حذف کلمات از تجزیه و تحلیل شما خواهیم پرداخت.

حذف علائم نگارشی کار نسبتاً ساده ای است. punctuation شی string کتابخانه شامل تمام علائم نگارشی به انگلیسی است:

import string
print(string.punctuation)

خروجی این قطعه کد به شرح زیر است:

'!"#$%&'()*+,-./:;<=>?@[]^_`{|}~'

به منظور حذف علائم نگارشی ، می توانید به سادگی این کار را انجام دهید:

for token in tokens:
  if token in string.punctuation:
    

در مرحله بعدی ، ما به حذف کلمات متوقف خواهیم پرداخت. کلمات متوقف کلماتی هستند که معمولاً در زبان استفاده می شوند مانند “من” ، “الف” و “the” ، که هنگام تجزیه و تحلیل آن معنای کمی به متن می دهند. بنابراین کلمات متوقف را از تحلیل خود حذف خواهیم کرد. ابتدا ، بارگیری کنید stopwords منبع از بارگیری کننده NLTK:

nltk.download('stopwords')

پس از اتمام بارگیری ، وارد کنید stopwords از جانب nltk.corpus و استفاده از .words() روش با “انگلیسی” به عنوان استدلال. این لیستی از 179 کلمه توقف در زبان انگلیسی است:

from nltk.corpus import stopwords
stop_words = stopwords.words('english')

ما می توانیم مثال لماتیزاسیون را با مفاهیم مورد بحث در این بخش ترکیب کنیم تا عملکرد زیر ایجاد شود ، clean_data(). بعلاوه ، قبل از مقایسه اگر کلمه ای در لیست کلمات توقف است ، آن را به کوچک تبدیل می کنیم. به این ترتیب ، اگر واژه توقف در ابتدای جمله رخ دهد و با حروف بزرگ نوشته شود ، ما همچنان کلمه توقف را ضبط می کنیم:

def clean_data(tokens, stop_words = ()):

  cleaned_tokens = []

  for token, tag in pos_tag(tokens):
    if tag.startswith("NN"):
      pos = 'n'
    elif tag.startswith('VB'):
      pos = 'v'
    else:
      pos = 'a'

    lemmatizer = WordNetLemmatizer()
    token = lemmatizer.lemmatize(token, pos)

    if token not in string.punctuation and token.lower() not in stop_words:
      cleaned_tokens.append(token)
  return cleaned_tokens

sample = "The quick brown fox jumps over the lazy dog."
stop_words = stopwords.words('english')

clean_data(word_tokenize(sample), stop_words)

خروجی مثال به شرح زیر است:

['quick', 'brown', 'fox', 'jump', 'lazy', 'dog']

همانطور که مشاهده می کنید ، کلمات علائم نگارشی و توقفی حذف شده اند.

توزیع فرکانس کلمه

حالا که با تکنیک های اساسی تمیز کردن در NLP آشنا شدید ، بیایید سعی کنیم تعداد دفعات کلمات را در متن پیدا کنیم. برای این تمرین ، ما از متن افسانه استفاده خواهیم کرد ، موش ، پرنده و سوسیس، که به صورت رایگان در گوتنبرگ در دسترس است. ما متن این افسانه را در یک رشته ذخیره خواهیم کرد ، text.

اول ، ما رمزگذاری می کنیم text و سپس آن را با استفاده از عملکرد تمیز کنید clean_data که در بالا تعریف کردیم:

tokens = word_tokenize(text)
cleaned_tokens = clean_data(tokens, stop_words = stop_words)

برای یافتن توزیع فراوانی کلمات در متن خود ، می توانید از FreqDist کلاس NLTK. کلاس را به عنوان یک استدلال با نشانه ها شروع کنید. سپس از .most_common() روش برای پیدا کردن اصطلاحات رایج بیایید سعی کنیم ده اصطلاح برتر را در این مورد پیدا کنیم:

from nltk import FreqDist

freq_dist = FreqDist(cleaned_tokens)
freq_dist.most_common(10)

در اینجا ده اصطلاح رایج در این افسانه آورده شده است:

[('bird', 15),
('sausage', 11),
('mouse', 8),
('wood', 7),
('time', 6),
('long', 5),
('make', 5),
('fly', 4),
('fetch', 4),
('water', 4)]

جای تعجب نیست که سه اصطلاح رایج سه شخصیت اصلی داستان پری هستند.

فرکانس کلمات هنگام تحلیل متن ممکن است خیلی مهم نباشد. به طور معمول ، گام بعدی در NLP تولید آماری است – TF-IDF (فرکانس اصطلاح – فرکانس سند معکوس) – که بیانگر اهمیت یک کلمه در لیست اسناد است.

نتیجه

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

اگرچه ما در این آموزش به کارهای ساده NLP پرداخته ایم ، تکنیک های بیشتری برای کشف وجود دارد. مثلاً ممکن است بخواهیم برای انجام مدل سازی موضوع در مورد داده های متنی ، جایی که هدف یافتن یک موضوع مشترک است که ممکن است یک متن در مورد آن صحبت کند. یک کار پیچیده تر در NLP اجرای مدل تجزیه و تحلیل احساسات برای تعیین احساس پشت هر متن است.

نظر یا س questionsالی دارید؟ احساس رایگان به من ضربه زدن در توییتر.