Text mining

Text Assemble

It is observed that 70% of data available to any businesses is unstructured. The first step is collating unstructured data from different sources such as open-ended feedback, phone calls, email support, online chat and social media networks like Twitter, LinkedIn and Facebook. Assembling these data and applying mining/machine learning techniques to analyze them provides valuable opportunities for organizations to build more power into customer experience. There are several libraries available for extracting text content from different formats discussed above. By far the best library that provides simple and single interface for multiple formats is ‘textract’ (open source MIT license). Note that as of now this library/package is available for Linux, Mac OS and not Windows. Below is a list of supported formats.

For example twitter

API access token

  • Goto https://apps.twitter.com/
  • Click on 'Create New App'
  • Fill the required information and click on 'Create your Twitter Application'
  • You'll get the access details under 'Keys and Access Tokens' tab

In [59]:
import pandas as pd
import numpy as np
import tweepy
from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream

In [44]:
access_token = "8397390582---------------------------------"
access_token_secret = "dr5L3QHHkIls6Rbffz-------------------"
consumer_key = "U1eVHGzL-----------------"
consumer_secret = "qATe7kb41zRAz------------------------------------"

auth = tweepy.auth.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)

api = tweepy.API(auth)

In [119]:
fetched_tweets = api.search(q=['Bitcoin','ethereum'], result_type='recent', lang='en', count=10)
print ("Number of tweets: ", len(fetched_tweets))


Number of tweets:  10

In [125]:
for tweet in fetched_tweets:
    print ('Tweet AUTOR: ', tweet.author.name)
    print ('Tweet ID: ', tweet.id)
    print ('Tweet Text: ', tweet.text, '\n')


Tweet AUTOR:  Jeanie Fantoni
Tweet ID:  939420455605174273
Tweet Text:  RT @6BillionPeople: Welcome to my Twitter. Im "MarQuis Trill @6BillionPeople " Everyone asks me "How can I buy #Bitcoin #Litecoin #Ethereum… 

Tweet AUTOR:  Eliana Holmes
Tweet ID:  939420449699717120
Tweet Text:  RT @6BillionPeople: Welcome to my Twitter. Im "MarQuis Trill @6BillionPeople " Everyone asks me "How can I buy #Bitcoin #Litecoin #Ethereum… 

Tweet AUTOR:  Christe Louise
Tweet ID:  939420448206422016
Tweet Text:  RT @rateico: ICO MARKET 2.0 👍 Self-Regulation of the #ICO #Market 🌐Ecosystem
Community Intelligence 🔁 https://t.co/1HrpeLgQcK Join Our ICO… 

Tweet AUTOR:  Nurfitriyana
Tweet ID:  939420445996142592
Tweet Text:  RT @Bazista_io: #Bazista platform review - concept, vision and key advantages. 
Read more:

https://t.co/EDLLN8hPfn

#ICO #tokensale #ether… 

Tweet AUTOR:  Chieko Jean-pierre
Tweet ID:  939420441189392385
Tweet Text:  RT @ico_report: The Largest Channel about ICO in Telegram https://t.co/zOt4zUK5Ig
💯 ICO Reports & Crypto News🤘  
📅 Сalendar & Analytics🔥
🚀… 

Tweet AUTOR:  Brittny Panich
Tweet ID:  939420433937342464
Tweet Text:  RT @6BillionPeople: Welcome to my Twitter. Im "MarQuis Trill @6BillionPeople " Everyone asks me "How can I buy #Bitcoin #Litecoin #Ethereum… 

Tweet AUTOR:  Nichol Vorberg
Tweet ID:  939420433853702144
Tweet Text:  RT @6BillionPeople: Welcome to my Twitter. Im "MarQuis Trill @6BillionPeople " Everyone asks me "How can I buy #Bitcoin #Litecoin #Ethereum… 

Tweet AUTOR:  Christe Louise
Tweet ID:  939420431873843200
Tweet Text:  RT @rateico: 📢 Join Our Discussion on BitcoinTalk org - https://t.co/FoDh0fRUoc /// #blockchain #ico #business #fintech #bitcoin #investing… 

Tweet AUTOR:  Kandy Mobley
Tweet ID:  939420427704832001
Tweet Text:  RT @ico_report: The Largest Channel about ICO in Telegram https://t.co/zOt4zUK5Ig
💯 ICO Reports & Crypto News🤘  
📅 Сalendar & Analytics🔥
🚀… 

Tweet AUTOR:  Echo Farrell
Tweet ID:  939420419232235520
Tweet Text:  RT @6BillionPeople: Welcome to my Twitter. Im "MarQuis Trill @6BillionPeople " Everyone asks me "How can I buy #Bitcoin #Litecoin #Ethereum… 

There are many other way to collect data from PDF, Voice and etc.

Preprocessing

NLTK (Natural Language Toolkit)

NLTK is a leading platform for building Python programs to work with human language data. It provides easy-to-use interfaces to over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries for classification, tokenization, stemming, tagging, parsing, and semantic reasoning, wrappers for industrial-strength NLP libraries

Bad news nltk not support persian

Good news hazm is a similar library for persian language processing


In [103]:
import nltk 
nltk.download()


showing info https://raw.githubusercontent.com/nltk/nltk_data/gh-pages/index.xml
Out[103]:
True

stopword


In [60]:
from nltk.corpus import stopwords

stopwords.words('english')[:10]


Out[60]:
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your']

In [61]:
len(stopwords.words())


Out[61]:
3136

In [62]:
import hazm 
hazm.stopwords_list()


Out[62]:
['و',
 'در',
 'به',
 'از',
 'که',
 'این',
 'را',
 'با',
 'است',
 'برای',
 'آن',
 'یک',
 'خود',
 'تا',
 'کرد',
 'بر',
 'هم',
 'نیز',
 'گفت',
 'می\u200cشود',
 'وی',
 'شد',
 'دارد',
 'ما',
 'اما',
 'یا',
 'شده',
 'باید',
 'هر',
 'آنها',
 'بود',
 'او',
 'دیگر',
 'دو',
 'مورد',
 'می\u200cکند',
 'شود',
 'کند',
 'وجود',
 'بین',
 'پیش',
 'شده_است',
 'پس',
 'نظر',
 'اگر',
 'همه',
 'یکی',
 'حال',
 'هستند',
 'من',
 'کنند',
 'نیست',
 'باشد',
 'چه',
 'بی',
 'می',
 'بخش',
 'می\u200cکنند',
 'همین',
 'افزود',
 'هایی',
 'دارند',
 'راه',
 'همچنین',
 'روی',
 'داد',
 'بیشتر',
 'بسیار',
 'سه',
 'داشت',
 'چند',
 'سوی',
 'تنها',
 'هیچ',
 'میان',
 'اینکه',
 'شدن',
 'بعد',
 'جدید',
 'ولی',
 'حتی',
 'کردن',
 'برخی',
 'کردند',
 'می\u200cدهد',
 'اول',
 'نه',
 'کرده_است',
 'نسبت',
 'بیش',
 'شما',
 'چنین',
 'طور',
 'افراد',
 'تمام',
 'درباره',
 'بار',
 'بسیاری',
 'می\u200cتواند',
 'کرده',
 'چون',
 'ندارد',
 'دوم',
 'بزرگ',
 'طی',
 'حدود',
 'همان',
 'بدون',
 'البته',
 'آنان',
 'می\u200cگوید',
 'دیگری',
 'خواهد_شد',
 'کنیم',
 'قابل',
 'یعنی',
 'رشد',
 'می\u200cتوان',
 'وارد',
 'کل',
 'ویژه',
 'قبل',
 'براساس',
 'نیاز',
 'گذاری',
 'هنوز',
 'لازم',
 'سازی',
 'بوده_است',
 'چرا',
 'می\u200cشوند',
 'وقتی',
 'گرفت',
 'کم',
 'جای',
 'حالی',
 'تغییر',
 'پیدا',
 'اکنون',
 'تحت',
 'باعث',
 'مدت',
 'فقط',
 'زیادی',
 'تعداد',
 'آیا',
 'بیان',
 'رو',
 'شدند',
 'عدم',
 'کرده_اند',
 'بودن',
 'نوع',
 'بلکه',
 'جاری',
 'دهد',
 'برابر',
 'مهم',
 'بوده',
 'اخیر',
 'مربوط',
 'امر',
 'زیر',
 'گیری',
 'شاید',
 'خصوص',
 'آقای',
 'اثر',
 'کننده',
 'بودند',
 'فکر',
 'کنار',
 'اولین',
 'سوم',
 'سایر',
 'کنید',
 'ضمن',
 'مانند',
 'باز',
 'می\u200cگیرد',
 'ممکن',
 'حل',
 'دارای',
 'پی',
 'مثل',
 'می\u200cرسد',
 'اجرا',
 'دور',
 'منظور',
 'کسی',
 'موجب',
 'طول',
 'امکان',
 'آنچه',
 'تعیین',
 'گفته',
 'شوند',
 'جمع',
 'خیلی',
 'علاوه',
 'گونه',
 'تاکنون',
 'رسید',
 'ساله',
 'گرفته',
 'شده_اند',
 'علت',
 'چهار',
 'داشته_باشد',
 'خواهد_بود',
 'طرف',
 'تهیه',
 'تبدیل',
 'مناسب',
 'زیرا',
 'مشخص',
 'می\u200cتوانند',
 'نزدیک',
 'جریان',
 'روند',
 'بنابراین',
 'می\u200cدهند',
 'یافت',
 'نخستین',
 'بالا',
 'پنج',
 'ریزی',
 'عالی',
 'چیزی',
 'نخست',
 'بیشتری',
 'ترتیب',
 'شده_بود',
 'خاص',
 'خوبی',
 'خوب',
 'شروع',
 'فرد',
 'کامل',
 'غیر',
 'می\u200cرود',
 'دهند',
 'آخرین',
 'دادن',
 'جدی',
 'بهترین',
 'شامل',
 'گیرد',
 'بخشی',
 'باشند',
 'تمامی',
 'بهتر',
 'داده_است',
 'حد',
 'نبود',
 'کسانی',
 'می\u200cکرد',
 'داریم',
 'علیه',
 'می\u200cباشد',
 'دانست',
 'ناشی',
 'داشتند',
 'دهه',
 'می\u200cشد',
 'ایشان',
 'آنجا',
 'گرفته_است',
 'دچار',
 'می\u200cآید',
 'لحاظ',
 'آنکه',
 'داده',
 'بعضی',
 'هستیم',
 'اند',
 'برداری',
 'نباید',
 'می\u200cکنیم',
 'نشست',
 'سهم',
 'همیشه',
 'آمد',
 'اش',
 'وگو',
 'می\u200cکنم',
 'حداقل',
 'طبق',
 'جا',
 'خواهد_کرد',
 'نوعی',
 'چگونه',
 'رفت',
 'هنگام',
 'فوق',
 'روش',
 'ندارند',
 'سعی',
 'بندی',
 'شمار',
 'کلی',
 'کافی',
 'مواجه',
 'همچنان',
 'زیاد',
 'سمت',
 'کوچک',
 'داشته_است',
 'چیز',
 'پشت',
 'آورد',
 'حالا',
 'روبه',
 'سال\u200cهای',
 'دادند',
 'می\u200cکردند',
 'عهده',
 'نیمه',
 'جایی',
 'دیگران',
 'سی',
 'بروز',
 'یکدیگر',
 'آمده_است',
 'جز',
 'کنم',
 'سپس',
 'کنندگان',
 'خودش',
 'همواره',
 'یافته',
 'شان',
 'صرف',
 'نمی\u200cشود',
 'رسیدن',
 'چهارم',
 'یابد',
 'متر',
 'ساز',
 'داشته',
 'کرده_بود',
 'باره',
 'نحوه',
 'کردم',
 'تو',
 'شخصی',
 'داشته_باشند',
 'محسوب',
 'پخش',
 'کمی',
 'متفاوت',
 'سراسر',
 'کاملا',
 'داشتن',
 'نظیر',
 'آمده',
 'گروهی',
 'فردی',
 'ع',
 'همچون',
 'خطر',
 'خویش',
 'کدام',
 'دسته',
 'سبب',
 'عین',
 'آوری',
 'متاسفانه',
 'بیرون',
 'دار',
 'ابتدا',
 'شش',
 'افرادی',
 'می\u200cگویند',
 'سالهای',
 'درون',
 'نیستند',
 'یافته_است',
 'پر',
 'خاطرنشان',
 'گاه',
 'جمعی',
 'اغلب',
 'دوباره',
 'می\u200cیابد',
 'لذا',
 'زاده',
 'گردد',
 'اینجا']

In [63]:
len(hazm.stopwords_list())


Out[63]:
389

Feature Extraction


In [104]:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer

In [105]:
text = pd.read_csv('./Datasets/text_mining.csv').drop(['document_id','direction'], axis =1)
text2 =text[(text['category_id'] == 1) | (text['category_id'] == 8)  ]
text.head()

In [106]:
text[text['category_id'] == 1].head()


Out[106]:
category_id news_id text
2022 1 1050208.0 هواشناسی برای گلستان یخبندان و کاهش دما را پیش...
2023 1 992.0 آغاز دوباره بارش برف و باران در نوار شمالی کشو...
2024 1 101394.0 احتمال بارش برف و باران از اواخر وقت امروز در ...
2025 1 250969.0 کاهش نسبی دمای هوا در مازندران / بارش برف و با...
2026 1 1953961.0 باران و برف در آذربایجان غربی طی هفته آینده/ ت...

In [68]:
text[text['category_id'] == 8].head()


Out[68]:
category_id news_id text
942 8 490245.0 موافقت اردن با مبادله یک تروریست با اسیر ژاپنی...
943 8 1258198.0 داعش یک مسجد تاریخی موصل را منفجر کرد \n به گز...
944 8 648991.0 عقب نشینی ناگهانی اعضای خارجی داعش از خیابان ه...
945 8 864821.0 جان بولتون: اوباما ده سال مقاومت غرب در برابر ...
946 8 882.0 کاخ سفید در سیاست خارجی خود جدی نیست و بسیار م...

In [69]:
climate_con = text[text['category_id'] == 1].iloc[0:5]
politics = text[text['category_id'] == 8].iloc[0:5]

In [70]:
countvectorizer = CountVectorizer()

In [71]:
cli = ''
for i in climate_con.text.as_matrix(): cli = cli + ' ' + i
pol = ''
for i in politics.text.as_matrix(): pol = pol + ' ' + i

In [72]:
content = [cli, pol]

In [73]:
countvectorizer.fit(content)


Out[73]:
CountVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ngram_range=(1, 1), preprocessor=None, stop_words=None,
        strip_accents=None, token_pattern='(?u)\\b\\w\\w+\\b',
        tokenizer=None, vocabulary=None)

In [74]:
doc_vec = countvectorizer.transform(content)

In [75]:
df = pd.DataFrame(doc_vec.toarray().transpose(), index = countvectorizer.get_feature_names())

In [76]:
df.sort_values(0, ascending=False)


Out[76]:
0 1
در 57 40
با 31 16
به 21 41
بارش 18 0
از 18 35
برف 17 0
باران 15 0
پیش 14 3
روز 13 0
استان 13 2
ابری 11 0
گفت 11 2
مناطق 10 0
بینی 10 0
کاهش 10 0
تا 10 4
می 10 17
کرد 10 6
باد 9 1
آینده 9 1
بود 9 4
برخی 9 0
مه 9 0
وزش 9 0
همراه 8 0
های 8 16
افزایش 8 0
دمای 8 0
همدان 8 0
هفته 8 2
... ... ...
تاک 0 1
شامل 0 1
تایمز 0 1
بند 0 3
بمب 0 2
صدر 0 1
عقب 0 5
غیرمنتظره 0 1
غیر 0 1
غنی 0 2
برابر 0 3
غرب 0 4
عنوان 0 2
براین 0 1
عملکرد 0 2
عمل 0 1
علت 0 1
عشایر 0 1
برگشت 0 1
عراق 0 7
عدیده 0 1
عدم 0 3
برخلاف 0 1
برخورد 0 1
برعهده 0 1
طبقه 0 1
برنامه 0 2
ضمن 0 1
ضعیف 0 1
یکی 0 1

700 rows × 2 columns


In [77]:
df.sort_values(1, ascending=False)


Out[77]:
0 1
به 21 41
در 57 40
از 18 35
است 8 26
این 4 26
اوباما 0 23
را 4 23
که 4 21
می 10 17
های 8 16
با 31 16
ایران 0 15
داعش 0 15
آمریکا 0 11
سیاست 0 9
یک 1 8
راهبرد 0 8
خارجی 0 8
عراق 0 7
کند 0 7
نوشته 0 7
کرده 0 7
گروه 0 7
دست 0 7
کرد 10 6
مسجد 0 6
موصل 0 6
ای 3 6
گزارش 0 6
شد 1 5
... ... ...
توجه 3 0
محورهای 4 0
محورها 1 0
محمدرضا 1 0
جاده 5 0
تجزیه 1 0
جاری 4 0
جامعه 1 0
جمعه 6 0
ماه 2 0
مازندران 6 0
جنوبی 2 0
مدیریت 1 0
تهران 2 0
مردم 1 0
مرکز 3 0
تناوب 1 0
مزبور 1 0
مسئول 1 0
مسافران 1 0
مشترک 1 0
تصریح 1 0
مشکلی 1 0
معابر 1 0
تردد 6 0
تدریجی 1 0
تداوم 2 0
ملایر 1 0
تحلیل 1 0
12 1 0

700 rows × 2 columns


In [78]:
tfidf = TfidfVectorizer()

In [79]:
tfidf_vec = tfidf.fit_transform(content)

In [80]:
df2 = pd.DataFrame(tfidf_vec.toarray().transpose(), index =tfidf.get_feature_names())

In [81]:
df2.sort_values(0, ascending=False)


Out[81]:
0 1
در 0.492603 0.344385
با 0.267907 0.137754
بارش 0.218633 0.000000
برف 0.206486 0.000000
باران 0.182194 0.000000
به 0.181485 0.352995
روز 0.157901 0.000000
از 0.155559 0.301337
ابری 0.133609 0.000000
بینی 0.121463 0.000000
کاهش 0.121463 0.000000
مناطق 0.121463 0.000000
پیش 0.120990 0.025829
استان 0.112348 0.017219
وزش 0.109316 0.000000
مه 0.109316 0.000000
برخی 0.109316 0.000000
همراه 0.097170 0.000000
دمای 0.097170 0.000000
همدان 0.097170 0.000000
آسمان 0.097170 0.000000
افزایش 0.097170 0.000000
گفت 0.095064 0.017219
تا 0.086422 0.034439
کرد 0.086422 0.051658
می 0.086422 0.146364
هوا 0.085024 0.000000
هواشناسی 0.085024 0.000000
وضعیت 0.085024 0.000000
جوی 0.085024 0.000000
... ... ...
سی 0.000000 0.036302
سپرده 0.000000 0.012101
سوریه 0.000000 0.036302
شکل 0.000000 0.012101
شیفتگی 0.000000 0.012101
برنامه 0.000000 0.024201
عدیده 0.000000 0.012101
باور 0.000000 0.012101
غرب 0.000000 0.048402
عنوان 0.000000 0.024201
بخش 0.000000 0.012101
عملکرد 0.000000 0.024201
عمل 0.000000 0.012101
علت 0.000000 0.012101
عقب 0.000000 0.060503
عشایر 0.000000 0.012101
عراق 0.000000 0.084704
عدم 0.000000 0.036302
برعهده 0.000000 0.012101
بدتر 0.000000 0.012101
بدون 0.000000 0.012101
برابر 0.000000 0.036302
طبقه 0.000000 0.012101
ضمن 0.000000 0.012101
ضعیف 0.000000 0.012101
براین 0.000000 0.012101
برخلاف 0.000000 0.012101
برخورد 0.000000 0.012101
صدر 0.000000 0.012101
یکی 0.000000 0.012101

700 rows × 2 columns


In [82]:
df2.sort_values(1, ascending=False)


Out[82]:
0 1
به 0.181485 0.352995
در 0.492603 0.344385
از 0.155559 0.301337
اوباما 0.000000 0.278312
است 0.069137 0.223850
این 0.034569 0.223850
را 0.034569 0.198021
ایران 0.000000 0.181508
داعش 0.000000 0.181508
که 0.034569 0.180802
می 0.086422 0.146364
های 0.069137 0.137754
با 0.267907 0.137754
آمریکا 0.000000 0.133106
سیاست 0.000000 0.108905
خارجی 0.000000 0.096804
راهبرد 0.000000 0.096804
کرده 0.000000 0.084704
کند 0.000000 0.084704
دست 0.000000 0.084704
نوشته 0.000000 0.084704
گروه 0.000000 0.084704
عراق 0.000000 0.084704
مسجد 0.000000 0.072603
موصل 0.000000 0.072603
گزارش 0.000000 0.072603
یک 0.008642 0.068877
خود 0.000000 0.060503
بولتون 0.000000 0.060503
داده 0.000000 0.060503
... ... ...
محمدرضا 0.012146 0.000000
محسوس 0.012146 0.000000
تهران 0.024293 0.000000
توجه 0.036439 0.000000
مازندران 0.072878 0.000000
تجزیه 0.012146 0.000000
جاده 0.060731 0.000000
جاری 0.048585 0.000000
جامعه 0.012146 0.000000
لغزنده 0.012146 0.000000
جمعه 0.072878 0.000000
قسمتی 0.036439 0.000000
تناوب 0.012146 0.000000
مدت 0.012146 0.000000
مدیرکل 0.024293 0.000000
مدیریت 0.012146 0.000000
مردم 0.012146 0.000000
مرکز 0.036439 0.000000
تصریح 0.012146 0.000000
مزبور 0.012146 0.000000
مسئول 0.012146 0.000000
مسافران 0.012146 0.000000
مشترک 0.012146 0.000000
تردد 0.072878 0.000000
تدریجی 0.012146 0.000000
مشکلی 0.012146 0.000000
تداوم 0.024293 0.000000
تحلیل 0.012146 0.000000
معابر 0.012146 0.000000
12 0.012146 0.000000

700 rows × 2 columns


In [83]:
tfidf.vocabulary_


Out[83]:
{'12': 0,
 '15': 1,
 '1648': 2,
 '2003': 3,
 '2013': 4,
 '25': 5,
 '26': 6,
 '27': 7,
 '29': 8,
 '50': 9,
 '76': 10,
 '86003': 11,
 '89003': 12,
 '93': 13,
 'آبگرفتگی': 14,
 'آخرین': 15,
 'آذربایجان': 16,
 'آزاد': 17,
 'آزادی': 18,
 'آسمان': 19,
 'آشوب': 20,
 'آغاز': 21,
 'آلمان': 22,
 'آلود': 23,
 'آماده': 24,
 'آمار': 25,
 'آمریکا': 26,
 'آمریکایی': 27,
 'آن': 28,
 'آنجلس': 29,
 'آنچنانی': 30,
 'آنچه': 31,
 'آنگلا': 32,
 'آورد': 33,
 'آید': 34,
 'آینده': 35,
 'ابر': 36,
 'ابراز': 37,
 'ابری': 38,
 'احتمال': 39,
 'اخبار': 40,
 'اختلال': 41,
 'اخیر': 42,
 'ادامه': 43,
 'ادعای': 44,
 'اذعان': 45,
 'اراضی': 46,
 'ارتش': 47,
 'ارتفاعات': 48,
 'اردن': 49,
 'اردنی': 50,
 'ارزیابی': 51,
 'از': 52,
 'ازای': 53,
 'اساس': 54,
 'اساسی': 55,
 'اسبق': 56,
 'است': 57,
 'استان': 58,
 'استفاده': 59,
 'اسفند': 60,
 'اسلامی': 61,
 'اسیر': 62,
 'اش': 63,
 'اشاره': 64,
 'اشتباهات': 65,
 'اطمینان': 66,
 'اطمینانی': 67,
 'اظهار': 68,
 'اعتماد': 69,
 'اعضای': 70,
 'اعظم': 71,
 'اعلام': 72,
 'افراطی': 73,
 'افزایش': 74,
 'افزود': 75,
 'اقدام': 76,
 'اقدامات': 77,
 'اقداماتی': 78,
 'الانبار': 79,
 'البغدادی': 80,
 'الجبه': 81,
 'الخضر': 82,
 'الرشیاوی': 83,
 'الریشاوی': 84,
 'العهد': 85,
 'الف20': 86,
 'الفاروق': 87,
 'القاعده': 88,
 'الملل': 89,
 'المیادین': 90,
 'الکساسبه': 91,
 'الی': 92,
 'اما': 93,
 'امتیاز': 94,
 'امر': 95,
 'امروز': 96,
 'امریکا': 97,
 'امسال': 98,
 'امنیت': 99,
 'امنیتی': 100,
 'انتخابات': 101,
 'انتظار': 102,
 'انتهای': 103,
 'انجام': 104,
 'اند': 105,
 'انگاری': 106,
 'انگلیسی': 107,
 'اهتمام': 108,
 'اهل': 109,
 'او': 110,
 'اواخر': 111,
 'اواسط': 112,
 'اوایل': 113,
 'اوباما': 114,
 'اورانیوم': 115,
 'اورول': 116,
 'اول': 117,
 'اوکراین': 118,
 'اکنون': 119,
 'ای': 120,
 'ایده': 121,
 'ایران': 122,
 'ایرانی': 123,
 'ایرنا': 124,
 'ایلنا': 125,
 'این': 126,
 'اینکه': 127,
 'با': 128,
 'باد': 129,
 'باراش': 130,
 'باران': 131,
 'بارش': 132,
 'بارشی': 133,
 'بارندگی': 134,
 'بازگردد': 135,
 'باشند': 136,
 'باشیم': 137,
 'بالای': 138,
 'باور': 139,
 'باید': 140,
 'بخش': 141,
 'بدتر': 142,
 'بدون': 143,
 'بر': 144,
 'برابر': 145,
 'براساس': 146,
 'برای': 147,
 'براین': 148,
 'برخلاف': 149,
 'برخورد': 150,
 'برخی': 151,
 'برعهده': 152,
 'برف': 153,
 'برقرار': 154,
 'برنامه': 155,
 'بروز': 156,
 'برگشت': 157,
 'بسیار': 158,
 'بعد': 159,
 'بلندمدت': 160,
 'بمب': 161,
 'بند': 162,
 'بندی': 163,
 'به': 164,
 'بود': 165,
 'بودن': 166,
 'بودند': 167,
 'بوده': 168,
 'بولتن': 169,
 'بولتون': 170,
 'بی': 171,
 'بیان': 172,
 'بیشتر': 173,
 'بیم': 174,
 'بین': 175,
 'بینی': 176,
 'تا': 177,
 'تاریخی': 178,
 'تاک': 179,
 'تاکید': 180,
 'تایمز': 181,
 'تبدیل': 182,
 'تجزیه': 183,
 'تحریم': 184,
 'تحلیل': 185,
 'تخریب': 186,
 'تداوم': 187,
 'تدریجی': 188,
 'تردد': 189,
 'تردید': 190,
 'ترساندن': 191,
 'ترغیب': 192,
 'تروریست': 193,
 'تروریستی': 194,
 'تزلزل': 195,
 'تشدید': 196,
 'تصریح': 197,
 'تصوف': 198,
 'تضعیف': 199,
 'تعارض': 200,
 'تعهدات': 201,
 'تعیین': 202,
 'تغییر': 203,
 'تفاوت': 204,
 'تلاش': 205,
 'تناوب': 206,
 'تهدید': 207,
 'تهدیدی': 208,
 'تهران': 209,
 'توابع': 210,
 'توافق': 211,
 'توافقنامه': 212,
 'توان': 213,
 'توجه': 214,
 'توجهات': 215,
 'تکفیری': 216,
 'تیرماه': 217,
 'جاده': 218,
 'جاری': 219,
 'جامع': 220,
 'جامعه': 221,
 'جان': 222,
 'جای': 223,
 'جدی': 224,
 'جدیت': 225,
 'جدید': 226,
 'جرج': 227,
 'جمعه': 228,
 'جمهور': 229,
 'جمهوری': 230,
 'جمهوریخواه': 231,
 'جنوبی': 232,
 'جهان': 233,
 'جهانی': 234,
 'جوی': 235,
 'حاشیه': 236,
 'حاضر': 237,
 'حال': 238,
 'حالی': 239,
 'حبیب': 240,
 'حداقل': 241,
 'حساب': 242,
 'حسینیه': 243,
 'حصول': 244,
 'حق': 245,
 'حمله': 246,
 'خارجی': 247,
 'خاطرنشان': 248,
 'خبر': 249,
 'خبرآنلاین': 250,
 'خبرنگار': 251,
 'خبرگزاری': 252,
 'خبری': 253,
 'خراسان': 254,
 'خلبان': 255,
 'خواهد': 256,
 'خواهیم': 257,
 'خود': 258,
 'خورده': 259,
 'خویش': 260,
 'خیابان': 261,
 'خیال': 262,
 'داد': 263,
 'داداشی': 264,
 'دادن': 265,
 'داده': 266,
 'دارد': 267,
 'دارند': 268,
 'داروی': 269,
 'داریم': 270,
 'داشت': 271,
 'داشته': 272,
 'داعش': 273,
 'دانست': 274,
 'دانسته': 275,
 'دانشکده': 276,
 'دانشگاه': 277,
 'دخالت': 278,
 'در': 279,
 'دراین': 280,
 'درباره': 281,
 'درجه': 282,
 'درخصوص': 283,
 'درصد': 284,
 'درکنفرانس': 285,
 'دریافت': 286,
 'دست': 287,
 'دستیابی': 288,
 'دلیل': 289,
 'دلیلی': 290,
 'دما': 291,
 'دمای': 292,
 'ده': 293,
 'دهد': 294,
 'دهند': 295,
 'دهه': 296,
 'دو': 297,
 'دوباره': 298,
 'دور': 299,
 'دوره': 300,
 'دوشنبه': 301,
 'دولت': 302,
 'دچار': 303,
 'دی': 304,
 'دید': 305,
 'دیشب': 306,
 'دیگر': 307,
 'رئیس': 308,
 'را': 309,
 'راست': 310,
 'رانندگان': 311,
 'راه': 312,
 'راهبرد': 313,
 'راهبردهایی': 314,
 'راهبردی': 315,
 'راههای': 316,
 'رخ': 317,
 'رزن': 318,
 'رسانه': 319,
 'رسد': 320,
 'رضوی': 321,
 'رمان': 322,
 'رهبران': 323,
 'رو': 324,
 'روان': 325,
 'رود': 326,
 'روز': 327,
 'روزانه': 328,
 'روزهای': 329,
 'روند': 330,
 'رکوردی': 331,
 'ریاست': 332,
 'ریزش': 333,
 'رییس': 334,
 'زاده': 335,
 'زراعی': 336,
 'زمینه': 337,
 'زندگی': 338,
 'زیادی': 339,
 'زیارتگاه': 340,
 'زیر': 341,
 'سابق': 342,
 'ساجده': 343,
 'ساده': 344,
 'ساری': 345,
 'سازد': 346,
 'سازمان': 347,
 'سازی': 348,
 'ساعات': 349,
 'سال': 350,
 'سانتیگراد': 351,
 'سایت': 352,
 'سبب': 353,
 'ستوه': 354,
 'سخن': 355,
 'سرخ': 356,
 'سرد': 357,
 'سردترین': 358,
 'سطح': 359,
 'سفید': 360,
 'سنی': 361,
 'سه': 362,
 'سواحل': 363,
 'سوریه': 364,
 'سوی': 365,
 'سپرده': 366,
 'سی': 367,
 'سیاست': 368,
 'سید': 369,
 'شامل': 370,
 'شاهد': 371,
 'شب': 372,
 'شبکه': 373,
 'شخصی': 374,
 'شد': 375,
 'شدن': 376,
 'شدند': 377,
 'شده': 378,
 'شرایط': 379,
 'شرطی': 380,
 'شش': 381,
 'شمال': 382,
 'شمالی': 383,
 'شناسایی': 384,
 'شناسی': 385,
 'شنبه': 386,
 'شهر': 387,
 'شهرستان': 388,
 'شهری': 389,
 'شود': 390,
 'شکست': 391,
 'شکل': 392,
 'شیفتگی': 393,
 'صادق': 394,
 'صاف': 395,
 'صبح': 396,
 'صبحگاهی': 397,
 'صدر': 398,
 'صفر': 399,
 'صورت': 400,
 'ض1002': 401,
 'ضعیف': 402,
 'ضمن': 403,
 'ضیائیان': 404,
 'طبقه': 405,
 'طور': 406,
 'طوری': 407,
 'طی': 408,
 'ظهر': 409,
 'عدم': 410,
 'عدیده': 411,
 'عراق': 412,
 'عشایر': 413,
 'عقب': 414,
 'علت': 415,
 'عمل': 416,
 'عملکرد': 417,
 'عمومی': 418,
 'عنوان': 419,
 'غالب': 420,
 'غرب': 421,
 'غربی': 422,
 'غنی': 423,
 'غیر': 424,
 'غیرمنتظره': 425,
 'فارس': 426,
 'فرانسه': 427,
 'فردا': 428,
 'فریبا': 429,
 'فزاینده': 430,
 'فعالیت': 431,
 'قابل': 432,
 'قادر': 433,
 'قبال': 434,
 'قدرت': 435,
 'قرار': 436,
 'قسمتی': 437,
 'قصد': 438,
 'قطعا': 439,
 'قید': 440,
 'لس': 441,
 'لغزنده': 442,
 'لغو': 443,
 'لفاظی': 444,
 'لیبی': 445,
 'ما': 446,
 'مازندران': 447,
 'مانند': 448,
 'ماه': 449,
 'مبادله': 450,
 'مبهم': 451,
 'متجاوزان': 452,
 'متحد': 453,
 'متحدان': 454,
 'متهم': 455,
 'متوقف': 456,
 'محتاطانه': 457,
 'محسوس': 458,
 'محمدرضا': 459,
 'محورها': 460,
 'محورهای': 461,
 'مخالفان': 462,
 'مختلف': 463,
 'مدت': 464,
 'مدرکی': 465,
 'مدعی': 466,
 'مدیر': 467,
 'مدیرکل': 468,
 'مدیریت': 469,
 'مذاکرات': 470,
 'مربوط': 471,
 'مرتبط': 472,
 'مرج': 473,
 'مردم': 474,
 'مرکز': 475,
 'مرکل': 476,
 'مزبور': 477,
 'مسئله': 478,
 'مسئول': 479,
 'مسافران': 480,
 'مساله': 481,
 'مسجد': 482,
 'مسجدی': 483,
 'مسکن': 484,
 'مشاور': 485,
 'مشترک': 486,
 'مشخص': 487,
 'مشکلات': 488,
 'مشکلی': 489,
 'مطالعات': 490,
 'مطرح': 491,
 'معابر': 492,
 'معادل': 493,
 'معاذ': 494,
 'معروف': 495,
 'مفهوم': 496,
 'مقامات': 497,
 'مقاومت': 498,
 'مقایسه': 499,
 'ملایر': 500,
 'ملل': 501,
 'ملی': 502,
 'مناسب': 503,
 'مناطق': 504,
 'منتقدین': 505,
 'منحرف': 506,
 'منطقه': 507,
 'منفجر': 508,
 'مه': 509,
 'مهر': 510,
 'مهم': 511,
 'مواجه': 512,
 'مواصلاتی': 513,
 'موافقت': 514,
 'موجودیتی': 515,
 'مورد': 516,
 'موصل': 517,
 'موضوع': 518,
 'موقت': 519,
 'موقتی': 520,
 'می': 521,
 'میان': 522,
 'میانه': 523,
 'میراثی': 524,
 'میزان': 525,
 'میزانی': 526,
 'میلیمتر': 527,
 'نا': 528,
 'نادر': 529,
 'نادرست': 530,
 'نامناسب': 531,
 'ناگهانی': 532,
 'نباشد': 533,
 'نخستین': 534,
 'نخواهد': 535,
 'ندارد': 536,
 'ندارند': 537,
 'نداشته': 538,
 'نسبت': 539,
 'نسبتا': 540,
 'نسبی': 541,
 'نشان': 542,
 'نشود': 543,
 'نشینی': 544,
 'نصر': 545,
 'نظر': 546,
 'نظریه': 547,
 'نقاط': 548,
 'نقشه': 549,
 'نقطه': 550,
 'نقل': 551,
 'نمابری': 552,
 'نمایش': 553,
 'نماینده': 554,
 'نمی': 555,
 'نهاوند': 556,
 'نواحی': 557,
 'نوار': 558,
 'نوربخش': 559,
 'نوروزی': 560,
 'نوشته': 561,
 'نوع': 562,
 'نوعی': 563,
 'نویس': 564,
 'نویسد': 565,
 'نگرانی': 566,
 'نیز': 567,
 'نیست': 568,
 'نیمه': 569,
 'نینوا': 570,
 'ها': 571,
 'هات': 572,
 'هاپکینز': 573,
 'های': 574,
 'هدایت': 575,
 'هرج': 576,
 'هستند': 577,
 'هسته': 578,
 'هستیم': 579,
 'هفت': 580,
 'هفته': 581,
 'هم': 582,
 'همدان': 583,
 'همراه': 584,
 'همراهی': 585,
 'همه': 586,
 'همواره': 587,
 'همچنین': 588,
 'همچون': 589,
 'همین': 590,
 'هنوز': 591,
 'هوا': 592,
 'هواشناسی': 593,
 'هوای': 594,
 'هیت': 595,
 'هیچ': 596,
 'واشنگتن': 597,
 'واقعا': 598,
 'واقعیت': 599,
 'وب': 600,
 'وباران': 601,
 'وجود': 602,
 'وخامت': 603,
 'وزش': 604,
 'وسیعی': 605,
 'وضعیت': 606,
 'وقت': 607,
 'ولی': 608,
 'وگو': 609,
 'وی': 610,
 'ویژه': 611,
 'پاسخ': 612,
 'پانزدهم': 613,
 'پایان': 614,
 'پایانی': 615,
 'پایتخت': 616,
 'پایدار': 617,
 'پایش': 618,
 'پایگاه': 619,
 'پدیده': 620,
 'پذیر': 621,
 'پراکنده': 622,
 'پرداز': 623,
 'پردازد': 624,
 'پردازی': 625,
 'پرده': 626,
 'پس': 627,
 'پشت': 628,
 'پنجشنبه': 629,
 'پیام': 630,
 'پیرتاج': 631,
 'پیش': 632,
 'پیشبینی': 633,
 'پیشتر': 634,
 'پیشرفت': 635,
 'چرا': 636,
 'چنگال': 637,
 'چنین': 638,
 'چه': 639,
 'چهار': 640,
 'چگونه': 641,
 'چیز': 642,
 'چیزی': 643,
 'ژاپنی': 644,
 'کاخ': 645,
 'کارشناس': 646,
 'کاملا': 647,
 'کاهش': 648,
 'کرد': 649,
 'کردن': 650,
 'کردند': 651,
 'کرده': 652,
 'کشاند': 653,
 'کشته': 654,
 'کشور': 655,
 'کشورهای': 656,
 'کشیدن': 657,
 'کلانشهر': 658,
 'کم': 659,
 'کنار': 660,
 'کنترل': 661,
 'کند': 662,
 'کنند': 663,
 'که': 664,
 'کوهستانی': 665,
 'کینجی': 666,
 'گاهی': 667,
 'گذارد': 668,
 'گذاری': 669,
 'گذاشته': 670,
 'گذشته': 671,
 'گر': 672,
 'گرا': 673,
 'گردنه': 674,
 'گرفت': 675,
 'گرفته': 676,
 'گرمترین': 677,
 'گروه': 678,
 'گرگان': 679,
 'گزارش': 680,
 'گفت': 681,
 'گفته': 682,
 'گفتگو': 683,
 'گلستان': 684,
 'گوتو': 685,
 'گودرزی': 686,
 'گوید': 687,
 'گیلان': 688,
 'یا': 689,
 'یابد': 690,
 'یابی': 691,
 'یادآور': 692,
 'یادداشتت': 693,
 'یافته': 694,
 'یخبندان': 695,
 'یمن': 696,
 'یک': 697,
 'یکشنبه': 698,
 'یکی': 699}

Stemming


In [84]:
from nltk.stem import SnowballStemmer

In [85]:
stemmer = SnowballStemmer('english')

In [86]:
stemmer.stem("impressive")


Out[86]:
'impress'

In [87]:
stemmer.stem("impressness")


Out[87]:
'impress'

In [88]:
from hazm import Stemmer

In [89]:
stem2 = Stemmer()

In [90]:
stem2.stem('کتاب ها')


Out[90]:
'کتاب '

In [91]:
stem2.stem('کتاب‌هایش')


Out[91]:
'کتاب'

In [92]:
stem2.stem('کتاب هایم')


Out[92]:
'کتاب '

Naive Bayes

Naive Bayes methods are a set of supervised learning algorithms based on applying Bayes’ theorem with the “naive” assumption of independence between every pair of features.

Bayes Rule:

$$ P(Y|X) = \frac{P(Y)P(X|Y)}{P(X)} $$

and Naive assumption:

$$ P(x_i | y,x_1,x_2,...x_{i-1},x_{i+1},...,x_n) = P(x_i|y) $$

leads to:

$$ P(y| x_1,x_2,...,x_n) = \frac{P(y) \prod_{i=1}^n P(x_i|y)}{P(x_1,x_2,...,x_n)} $$

If the purpose is only to classify:

$$ \hat{y} = arg\max_y P(y)\prod_{i=1}^n P(x_i|y) $$

In [107]:
from sklearn.naive_bayes import GaussianNB

In [108]:
model = GaussianNB()

In [113]:
model.fit(tfidf.transform(text2.text).toarray(), text2.category_id)


Out[113]:
GaussianNB(priors=None)

In [123]:
model.sigma_.shape


Out[123]:
(2, 700)

In [101]:
from sklearn.metrics import classification_report
print(classification_report(text2.category_id, model.predict(tfidf.transform(text2.text).toarray())))


             precision    recall  f1-score   support

          1       0.74      1.00      0.85        74
          8       1.00      0.95      0.97       483

avg / total       0.97      0.95      0.96       557