Ad Code

Data Science labs blog

Simple Sentiment analysis with Databricks spark

 Simple Sentiment analysis with Databricks spark




from pyspark.sql import SparkSession
 
spark = SparkSession \
    .builder \
    .appName("Python Spark Sentiment Analysis example") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()
df = spark.read.format('com.databricks.spark.csv').\
                               options(header='true', \
                               inferschema='true').\
            load("/FileStore/tables/newtwitter.csv",header=True);
df.display()
 
text
id
pubdate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
10 Things Missing In The New Twitter Interface http://bit.ly/bLZXI3 #NewTwitter
2602860537
18536
RT @_NATURALBWINNER OH AND I DONT LIKE THIS #NEWTWITTER SHIT < seeeeeee nobody likes this #newtwitter bullsh** . . eat a dick new twitter !
2602850443
18536
RT @HBO24 yo the #newtwitter is better.. YUPP I SAID IT!<What is new twitter...i m still waitin for su?1 2 fill me in
2602761852
18535
Aaaaaaaand I have the new twitter! Yay! I should have checked sooner, but I have been busy. I like it! #NewTwitter
2602738438
18535
can I please have the new twitter? #twitter #newtwitter
2602684185
18535
Seriously, still no new Twitter layout? How many weeks is this suppose to take?! #newtwitter
2602678435
18535
"Confieso q el #NewTwitter no me mata, c/vez que veo ""psst the new twitter is here"" (o como sea que dice) lo ignoro esperando a q desaparezc"
2602600751
18535
I have the new twitter. Who else? :) #NewTwitter
2602585892
18535
HOW DO I DOWNLOAD NEW TWITTER? #newtwitter #help #knowledge #thisISshit
2602548822
18535
same here- urs fixed yet? RT @tamarafarley Hrm, my #lists function doesn't work on the new Twitter. What gives? #newTwitter #fail
2602529998
18535
When is the new twitter going to rollout to me? #newtwitter
2602486242
18535
Stage 2 RT @celeryjacket: Omg New Twitter is beautiful :O *designgasm* #newtwitter
2602434234
18535
ps, er, what happened to new twitter embedding pictures? just saying... #newtwitter
2602427093
18535
I loved writing about #newtwitter with @mikeschaffer & @nakeva (http://bit.ly/cEMBl3) but can I PLEASE get upgraded @twitter? Thx!
2602382610
18535
@adactio hopefully he has the Twitter iPad app by now. I like it even better than the new Twitter :) #newtwitter
2602351386
18535
7 Really Cool Things About The #NewTwitter http://ow.ly/1qYuwg
2602304053
18535
How To Make Backgrounds for #NewTwitter http://bit.ly/9h1c9B via @askdebra @GautamGhosh @shilpiiz @SocialSideMedia
2602293760
18535

Showing the first 1000 rows.

## install python nltk package
!pip install nltk
Collecting nltk Downloading nltk-3.5.zip (1.4 MB) |▎ | 10 kB 18.9 MB/s eta 0:00:01 |▌ | 20 kB 23.7 MB/s eta 0:00:01 |▊ | 30 kB 16.3 MB/s eta 0:00:01 |█ | 40 kB 11.2 MB/s eta 0:00:01 |█▏ | 51 kB 7.8 MB/s eta 0:00:01 |█▍ | 61 kB 6.6 MB/s eta 0:00:01 |█▋ | 71 kB 6.9 MB/s eta 0:00:01 |█▉ | 81 kB 7.4 MB/s eta 0:00:01 |██ | 92 kB 7.1 MB/s eta 0:00:01 |██▎ | 102 kB 6.1 MB/s eta 0:00:01 |██▌ | 112 kB 6.1 MB/s eta 0:00:01 |██▊ | 122 kB 6.1 MB/s eta 0:00:01 |███ | 133 kB 6.1 MB/s eta 0:00:01 |███▏ | 143 kB 6.1 MB/s eta 0:00:01 |███▍ | 153 kB 6.1 MB/s eta 0:00:01 |███▋ | 163 kB 6.1 MB/s eta 0:00:01 |███▉ | 174 kB 6.1 MB/s eta 0:00:01 |████▏ | 184 kB 6.1 MB/s eta 0:00:01 |████▍ | 194 kB 6.1 MB/s eta 0:00:01 |████▋ | 204 kB 6.1 MB/s eta 0:00:01 |████▉ | 215 kB 6.1 MB/s eta 0:00:01 |█████ | 225 kB 6.1 MB/s eta 0:00:01 |█████▎ | 235 kB 6.1 MB/s eta 0:00:01 |█████▌ | 245 kB 6.1 MB/s eta 0:00:01 |█████▊ | 256 kB 6.1 MB/s eta 0:00:01 |██████ | 266 kB 6.1 MB/s eta 0:00:01 |██████▏ | 276 kB 6.1 MB/s eta 0:00:01 |██████▍ | 286 kB 6.1 MB/s eta 0:00:01 |██████▋ | 296 kB 6.1 MB/s eta 0:00:01 |██████▉ | 307 kB 6.1 MB/s eta 0:00:01 |███████ | 317 kB 6.1 MB/s eta 0:00:01 |███████▎ | 327 kB 6.1 MB/s eta 0:00:01 |███████▌ | 337 kB 6.1 MB/s eta 0:00:01 |███████▊ | 348 kB 6.1 MB/s eta 0:00:01 |████████ | 358 kB 6.1 MB/s eta 0:00:01 |████████▎ | 368 kB 6.1 MB/s eta 0:00:01 |████████▌ | 378 kB 6.1 MB/s eta 0:00:01 |████████▊ | 389 kB 6.1 MB/s eta 0:00:01 |█████████ | 399 kB 6.1 MB/s eta 0:00:01 |█████████▏ | 409 kB 6.1 MB/s eta 0:00:01 |█████████▍ | 419 kB 6.1 MB/s eta 0:00:01 |█████████▋ | 430 kB 6.1 MB/s eta 0:00:01 |█████████▉ | 440 kB 6.1 MB/s eta 0:00:01 |██████████ | 450 kB 6.1 MB/s eta 0:00:01 |██████████▎ | 460 kB 6.1 MB/s eta 0:00:01 |██████████▌ | 471 kB 6.1 MB/s eta 0:00:01 |██████████▊ | 481 kB 6.1 MB/s eta 0:00:01 |███████████ | 491 kB 6.1 MB/s eta 0:00:01 |███████████▏ | 501 kB 6.1 MB/s eta 0:00:01 |███████████▍ | 512 kB 6.1 MB/s eta 0:00:01 |███████████▋ | 522 kB 6.1 MB/s eta 0:00:01 |███████████▉ | 532 kB 6.1 MB/s eta 0:00:01 |████████████▏ | 542 kB 6.1 MB/s eta 0:00:01 |████████████▍ | 552 kB 6.1 MB/s eta 0:00:01 |████████████▋ | 563 kB 6.1 MB/s eta 0:00:01 |████████████▉ | 573 kB 6.1 MB/s eta 0:00:01 |█████████████ | 583 kB 6.1 MB/s eta 0:00:01 |█████████████▎ | 593 kB 6.1 MB/s eta 0:00:01 |█████████████▌ | 604 kB 6.1 MB/s eta 0:00:01 |█████████████▊ | 614 kB 6.1 MB/s eta 0:00:01 |██████████████ | 624 kB 6.1 MB/s eta 0:00:01 |██████████████▏ | 634 kB 6.1 MB/s eta 0:00:01 |██████████████▍ | 645 kB 6.1 MB/s eta 0:00:01 |██████████████▋ | 655 kB 6.1 MB/s eta 0:00:01 |██████████████▉ | 665 kB 6.1 MB/s eta 0:00:01 |███████████████ | 675 kB 6.1 MB/s eta 0:00:01 |███████████████▎ | 686 kB 6.1 MB/s eta 0:00:01 |███████████████▌ | 696 kB 6.1 MB/s eta 0:00:01 |███████████████▊ | 706 kB 6.1 MB/s eta 0:00:01 |████████████████ | 716 kB 6.1 MB/s eta 0:00:01 |████████████████▎ | 727 kB 6.1 MB/s eta 0:00:01 |████████████████▌ | 737 kB 6.1 MB/s eta 0:00:01 |████████████████▊ | 747 kB 6.1 MB/s eta 0:00:01 |█████████████████ | 757 kB 6.1 MB/s eta 0:00:01 |█████████████████▏ | 768 kB 6.1 MB/s eta 0:00:01 |█████████████████▍ | 778 kB 6.1 MB/s eta 0:00:01 |█████████████████▋ | 788 kB 6.1 MB/s eta 0:00:01 |█████████████████▉ | 798 kB 6.1 MB/s eta 0:00:01 |██████████████████ | 808 kB 6.1 MB/s eta 0:00:01 |██████████████████▎ | 819 kB 6.1 MB/s eta 0:00:01 |██████████████████▌ | 829 kB 6.1 MB/s eta 0:00:01 |██████████████████▊ | 839 kB 6.1 MB/s eta 0:00:01 |███████████████████ | 849 kB 6.1 MB/s eta 0:00:01 |███████████████████▏ | 860 kB 6.1 MB/s eta 0:00:01 |███████████████████▍ | 870 kB 6.1 MB/s eta 0:00:01 |███████████████████▋ | 880 kB 6.1 MB/s eta 0:00:01 |███████████████████▉ | 890 kB 6.1 MB/s eta 0:00:01 |████████████████████▏ | 901 kB 6.1 MB/s eta 0:00:01 |████████████████████▍ | 911 kB 6.1 MB/s eta 0:00:01 |████████████████████▋ | 921 kB 6.1 MB/s eta 0:00:01 |████████████████████▉ | 931 kB 6.1 MB/s eta 0:00:01 |█████████████████████ | 942 kB 6.1 MB/s eta 0:00:01 |█████████████████████▎ | 952 kB 6.1 MB/s eta 0:00:01 |█████████████████████▌ | 962 kB 6.1 MB/s eta 0:00:01 |█████████████████████▊ | 972 kB 6.1 MB/s eta 0:00:01 |██████████████████████ | 983 kB 6.1 MB/s eta 0:00:01 |██████████████████████▏ | 993 kB 6.1 MB/s eta 0:00:01 |██████████████████████▍ | 1.0 MB 6.1 MB/s eta 0:00:01 |██████████████████████▋ | 1.0 MB 6.1 MB/s eta 0:00:01 |██████████████████████▉ | 1.0 MB 6.1 MB/s eta 0:00:01 |███████████████████████ | 1.0 MB 6.1 MB/s eta 0:00:01 |███████████████████████▎ | 1.0 MB 6.1 MB/s eta 0:00:01 |███████████████████████▌ | 1.1 MB 6.1 MB/s eta 0:00:01 |███████████████████████▊ | 1.1 MB 6.1 MB/s eta 0:00:01 |████████████████████████ | 1.1 MB 6.1 MB/s eta 0:00:01 |████████████████████████▎ | 1.1 MB 6.1 MB/s eta 0:00:01 |████████████████████████▌ | 1.1 MB 6.1 MB/s eta 0:00:01 |████████████████████████▊ | 1.1 MB 6.1 MB/s eta 0:00:01 |█████████████████████████ | 1.1 MB 6.1 MB/s eta 0:00:01 |█████████████████████████▏ | 1.1 MB 6.1 MB/s eta 0:00:01 |█████████████████████████▍ | 1.1 MB 6.1 MB/s eta 0:00:01 |█████████████████████████▋ | 1.1 MB 6.1 MB/s eta 0:00:01 |█████████████████████████▉ | 1.2 MB 6.1 MB/s eta 0:00:01 |██████████████████████████ | 1.2 MB 6.1 MB/s eta 0:00:01 |██████████████████████████▎ | 1.2 MB 6.1 MB/s eta 0:00:01 |██████████████████████████▌ | 1.2 MB 6.1 MB/s eta 0:00:01 |██████████████████████████▊ | 1.2 MB 6.1 MB/s eta 0:00:01 |███████████████████████████ | 1.2 MB 6.1 MB/s eta 0:00:01 |███████████████████████████▏ | 1.2 MB 6.1 MB/s eta 0:00:01 |███████████████████████████▍ | 1.2 MB 6.1 MB/s eta 0:00:01 |███████████████████████████▋ | 1.2 MB 6.1 MB/s eta 0:00:01 |███████████████████████████▉ | 1.2 MB 6.1 MB/s eta 0:00:01 |████████████████████████████▏ | 1.3 MB 6.1 MB/s eta 0:00:01 |████████████████████████████▍ | 1.3 MB 6.1 MB/s eta 0:00:01 |████████████████████████████▋ | 1.3 MB 6.1 MB/s eta 0:00:01 |████████████████████████████▉ | 1.3 MB 6.1 MB/s eta 0:00:01 |█████████████████████████████ | 1.3 MB 6.1 MB/s eta 0:00:01 |█████████████████████████████▎ | 1.3 MB 6.1 MB/s eta 0:00:01 |█████████████████████████████▌ | 1.3 MB 6.1 MB/s eta 0:00:01 |█████████████████████████████▊ | 1.3 MB 6.1 MB/s eta 0:00:01 |██████████████████████████████ | 1.3 MB 6.1 MB/s eta 0:00:01 |██████████████████████████████▏ | 1.4 MB 6.1 MB/s eta 0:00:01 |██████████████████████████████▍ | 1.4 MB 6.1 MB/s eta 0:00:01 |██████████████████████████████▋ | 1.4 MB 6.1 MB/s eta 0:00:01 |██████████████████████████████▉ | 1.4 MB 6.1 MB/s eta 0:00:01 |███████████████████████████████ | 1.4 MB 6.1 MB/s eta 0:00:01 |███████████████████████████████▎| 1.4 MB 6.1 MB/s eta 0:00:01 |███████████████████████████████▌| 1.4 MB 6.1 MB/s eta 0:00:01 |███████████████████████████████▊| 1.4 MB 6.1 MB/s eta 0:00:01 |████████████████████████████████| 1.4 MB 6.1 MB/s Collecting click Downloading click-7.1.2-py2.py3-none-any.whl (82 kB) |████ | 10 kB 24.6 MB/s eta 0:00:01 |████████ | 20 kB 30.0 MB/s eta 0:00:01 |███████████▉ | 30 kB 35.2 MB/s eta 0:00:01 |███████████████▉ | 40 kB 38.4 MB/s eta 0:00:01 |███████████████████▉ | 51 kB 28.3 MB/s eta 0:00:01 |███████████████████████▊ | 61 kB 30.3 MB/s eta 0:00:01 |███████████████████████████▊ | 71 kB 26.0 MB/s eta 0:00:01 |███████████████████████████████▊| 81 kB 27.9 MB/s eta 0:00:01 |████████████████████████████████| 82 kB 2.0 MB/s Requirement already satisfied: joblib in /databricks/python3/lib/python3.7/site-packages (from nltk) (0.14.1) Collecting regex Downloading regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl (719 kB) |▌ | 10 kB 4.6 MB/s eta 0:00:01 |█ | 20 kB 6.6 MB/s eta 0:00:01 |█▍ | 30 kB 9.2 MB/s eta 0:00:01 |█▉ | 40 kB 9.6 MB/s eta 0:00:01 |██▎ | 51 kB 10.1 MB/s eta 0:00:01 |██▊ | 61 kB 11.7 MB/s eta 0:00:01 |███▏ | 71 kB 11.7 MB/s eta 0:00:01 |███▋ | 81 kB 13.0 MB/s eta 0:00:01 |████ | 92 kB 13.1 MB/s eta 0:00:01 |████▌ | 102 kB 12.8 MB/s eta 0:00:01 |█████ | 112 kB 12.8 MB/s eta 0:00:01 |█████▌ | 122 kB 12.8 MB/s eta 0:00:01 |██████ | 133 kB 12.8 MB/s eta 0:00:01 |██████▍ | 143 kB 12.8 MB/s eta 0:00:01 |██████▉ | 153 kB 12.8 MB/s eta 0:00:01 |███████▎ | 163 kB 12.8 MB/s eta 0:00:01 |███████▊ | 174 kB 12.8 MB/s eta 0:00:01 |████████▏ | 184 kB 12.8 MB/s eta 0:00:01 |████████▋ | 194 kB 12.8 MB/s eta 0:00:01 |█████████ | 204 kB 12.8 MB/s eta 0:00:01 |█████████▋ | 215 kB 12.8 MB/s eta 0:00:01 |██████████ | 225 kB 12.8 MB/s eta 0:00:01 |██████████▌ | 235 kB 12.8 MB/s eta 0:00:01 |███████████ | 245 kB 12.8 MB/s eta 0:00:01 |███████████▍ | 256 kB 12.8 MB/s eta 0:00:01 |███████████▉ | 266 kB 12.8 MB/s eta 0:00:01 |████████████▎ | 276 kB 12.8 MB/s eta 0:00:01 |████████████▊ | 286 kB 12.8 MB/s eta 0:00:01 |█████████████▏ | 296 kB 12.8 MB/s eta 0:00:01 |█████████████▋ | 307 kB 12.8 MB/s eta 0:00:01 |██████████████▏ | 317 kB 12.8 MB/s eta 0:00:01 |██████████████▋ | 327 kB 12.8 MB/s eta 0:00:01 |███████████████ | 337 kB 12.8 MB/s eta 0:00:01 |███████████████▌ | 348 kB 12.8 MB/s eta 0:00:01 |████████████████ | 358 kB 12.8 MB/s eta 0:00:01 |████████████████▍ | 368 kB 12.8 MB/s eta 0:00:01 |████████████████▉ | 378 kB 12.8 MB/s eta 0:00:01 |█████████████████▎ | 389 kB 12.8 MB/s eta 0:00:01 |█████████████████▊ | 399 kB 12.8 MB/s eta 0:00:01 |██████████████████▏ | 409 kB 12.8 MB/s eta 0:00:01 |██████████████████▋ | 419 kB 12.8 MB/s eta 0:00:01 |███████████████████▏ | 430 kB 12.8 MB/s eta 0:00:01 |███████████████████▋ | 440 kB 12.8 MB/s eta 0:00:01 |████████████████████ | 450 kB 12.8 MB/s eta 0:00:01 |████████████████████▌ | 460 kB 12.8 MB/s eta 0:00:01 |█████████████████████ | 471 kB 12.8 MB/s eta 0:00:01 |█████████████████████▍ | 481 kB 12.8 MB/s eta 0:00:01 |█████████████████████▉ | 491 kB 12.8 MB/s eta 0:00:01 |██████████████████████▎ | 501 kB 12.8 MB/s eta 0:00:01 |██████████████████████▊ | 512 kB 12.8 MB/s eta 0:00:01 |███████████████████████▏ | 522 kB 12.8 MB/s eta 0:00:01 |███████████████████████▊ | 532 kB 12.8 MB/s eta 0:00:01 |████████████████████████▏ | 542 kB 12.8 MB/s eta 0:00:01 |████████████████████████▋ | 552 kB 12.8 MB/s eta 0:00:01 |█████████████████████████ | 563 kB 12.8 MB/s eta 0:00:01 |█████████████████████████▌ | 573 kB 12.8 MB/s eta 0:00:01 |██████████████████████████ | 583 kB 12.8 MB/s eta 0:00:01 |██████████████████████████▍ | 593 kB 12.8 MB/s eta 0:00:01 |██████████████████████████▉ | 604 kB 12.8 MB/s eta 0:00:01 |███████████████████████████▎ | 614 kB 12.8 MB/s eta 0:00:01 |███████████████████████████▊ | 624 kB 12.8 MB/s eta 0:00:01 |████████████████████████████▎ | 634 kB 12.8 MB/s eta 0:00:01 |████████████████████████████▊ | 645 kB 12.8 MB/s eta 0:00:01 |█████████████████████████████▏ | 655 kB 12.8 MB/s eta 0:00:01 |█████████████████████████████▋ | 665 kB 12.8 MB/s eta 0:00:01 |██████████████████████████████ | 675 kB 12.8 MB/s eta 0:00:01 |██████████████████████████████▌ | 686 kB 12.8 MB/s eta 0:00:01 |███████████████████████████████ | 696 kB 12.8 MB/s eta 0:00:01 |███████████████████████████████▍| 706 kB 12.8 MB/s eta 0:00:01 |███████████████████████████████▉| 716 kB 12.8 MB/s eta 0:00:01 |████████████████████████████████| 719 kB 12.8 MB/s Collecting tqdm Downloading tqdm-4.54.1-py2.py3-none-any.whl (69 kB) |████▊ | 10 kB 29.9 MB/s eta 0:00:01 |█████████▍ | 20 kB 34.6 MB/s eta 0:00:01 |██████████████ | 30 kB 40.1 MB/s eta 0:00:01 |██████████████████▉ | 40 kB 43.2 MB/s eta 0:00:01 |███████████████████████▌ | 51 kB 41.0 MB/s eta 0:00:01 |████████████████████████████▏ | 61 kB 43.4 MB/s eta 0:00:01 |████████████████████████████████| 69 kB 12.6 MB/s Building wheels for collected packages: nltk Building wheel for nltk (setup.py) ... - \ | / - \ | done Created wheel for nltk: filename=nltk-3.5-py3-none-any.whl size=1434675 sha256=4e83bb58be05dac06041ee9f164619e830dfb1bafa71bf4482bf195e16ea01ce Stored in directory: /root/.cache/pip/wheels/45/6c/46/a1865e7ba706b3817f5d1b2ff7ce8996aabdd0d03d47ba0266 Successfully built nltk Installing collected packages: click, regex, tqdm, nltk Successfully installed click-7.1.2 nltk-3.5 regex-2020.11.13 tqdm-4.54.1 WARNING: You are using pip version 20.0.2; however, version 20.3.1 is available. You should consider upgrading via the '/databricks/python3/bin/python3.7 -m pip install --upgrade pip' command.
## Text Processing
## Import libraries 
from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
 
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.corpus import stopwords
from nltk import pos_tag
import string
import re
## create function to 
# remove non ASCII characters
def strip_non_ascii(data_str):
    ''' Returns the string without non ASCII characters'''
    stripped = (c for c in data_str if 0 < ord(c) < 127)
    return ''.join(stripped)
# setup pyspark udf function
strip_non_ascii_udf = udf(strip_non_ascii, StringType())
## check 
df = df.withColumn('text_non_asci',strip_non_ascii_udf(df['text']))
df.show(5,True)
+--------------------+----------+-------+--------------------+ | text| id|pubdate| text_non_asci| +--------------------+----------+-------+--------------------+ |10 Things Missing...|2602860537| 18536|10 Things Missing...| |RT @_NATURALBWINN...|2602850443| 18536|RT @_NATURALBWINN...| |RT @HBO24 yo the ...|2602761852| 18535|RT @HBO24 yo the ...| |Aaaaaaaand I have...|2602738438| 18535|Aaaaaaaand I have...| |can I please have...|2602684185| 18535|can I please have...| +--------------------+----------+-------+--------------------+ only showing top 5 rows
# fixed abbreviation
def fix_abbreviation(data_str):
    data_str = data_str.lower() ## normalizted to lower case letter
    data_str = re.sub(r'\bthats\b', 'that is', data_str)
    data_str = re.sub(r'\bive\b', 'i have', data_str)
    data_str = re.sub(r'\bim\b', 'i am', data_str)
    data_str = re.sub(r'\bya\b', 'yeah', data_str)
    data_str = re.sub(r'\bcant\b', 'can not', data_str)
    data_str = re.sub(r'\bdont\b', 'do not', data_str)
    data_str = re.sub(r'\bwont\b', 'will not', data_str)
    data_str = re.sub(r'\bid\b', 'i would', data_str)
    data_str = re.sub(r'wtf', 'what the fuck', data_str)
    data_str = re.sub(r'\bwth\b', 'what the hell', data_str)
    data_str = re.sub(r'\br\b', 'are', data_str)
    data_str = re.sub(r'\bu\b', 'you', data_str)
    data_str = re.sub(r'\bk\b', 'OK', data_str)
    data_str = re.sub(r'\bsux\b', 'sucks', data_str)
    data_str = re.sub(r'\bno+\b', 'no', data_str)
    data_str = re.sub(r'\bcoo+\b', 'cool', data_str)
    data_str = re.sub(r'rt\b', '', data_str)
    data_str = data_str.strip()
    return data_str
 
fix_abbreviation_udf = udf(fix_abbreviation, StringType())
## create fixed_abbrev column
df = df.withColumn('fixed_abbrev',fix_abbreviation_udf(df['text_non_asci']))
df.show(5,True)
+--------------------+----------+-------+--------------------+--------------------+ | text| id|pubdate| text_non_asci| fixed_abbrev| +--------------------+----------+-------+--------------------+--------------------+ |10 Things Missing...|2602860537| 18536|10 Things Missing...|10 things missing...| |RT @_NATURALBWINN...|2602850443| 18536|RT @_NATURALBWINN...|@_naturalbwinner ...| |RT @HBO24 yo the ...|2602761852| 18535|RT @HBO24 yo the ...|@hbo24 yo the #ne...| |Aaaaaaaand I have...|2602738438| 18535|Aaaaaaaand I have...|aaaaaaaand i have...| |can I please have...|2602684185| 18535|can I please have...|can i please have...| +--------------------+----------+-------+--------------------+--------------------+ only showing top 5 rows
## remove irrelevant
def remove_features(data_str):
    # compile regex
    url_re = re.compile('https?://(www.)?\w+\.\w+(/\w+)*/?')
    punc_re = re.compile('[%s]' % re.escape(string.punctuation))
    num_re = re.compile('(\\d+)')
    mention_re = re.compile('@(\w+)')
    alpha_num_re = re.compile("^[a-z0-9_.]+$")
    # convert to lowercase
    data_str = data_str.lower()
    # remove hyperlinks
    data_str = url_re.sub(' ', data_str)
    # remove @mentions
    data_str = mention_re.sub(' ', data_str)
    # remove puncuation
    data_str = punc_re.sub(' ', data_str)
    # remove numeric 'words'
    data_str = num_re.sub(' ', data_str)
    # remove non a-z 0-9 characters and words shorter than 1 characters
    list_pos = 0
    cleaned_str = ''
    for word in data_str.split():
        if list_pos == 0:
            if alpha_num_re.match(word) and len(word) > 1:
                cleaned_str = word
            else:
                cleaned_str = ' '
        else:
            if alpha_num_re.match(word) and len(word) > 1:
                cleaned_str = cleaned_str + ' ' + word
            else:
                cleaned_str += ' '
        list_pos += 1
    # remove unwanted space, *.split() will automatically split on
    # whitespace and discard duplicates, the " ".join() joins the
    # resulting list into one string.
    return " ".join(cleaned_str.split())
# setup pyspark udf function
remove_features_udf = udf(remove_features, StringType())
## create column removed irrelevant
df = df.withColumn('removed',remove_features_udf(df['fixed_abbrev']))
df.show(5,True)
+--------------------+----------+-------+--------------------+--------------------+--------------------+ | text| id|pubdate| text_non_asci| fixed_abbrev| removed| +--------------------+----------+-------+--------------------+--------------------+--------------------+ |10 Things Missing...|2602860537| 18536|10 Things Missing...|10 things missing...|things missing in...| |RT @_NATURALBWINN...|2602850443| 18536|RT @_NATURALBWINN...|@_naturalbwinner ...|oh and do not lik...| |RT @HBO24 yo the ...|2602761852| 18535|RT @HBO24 yo the ...|@hbo24 yo the #ne...|yo the newtwitter...| |Aaaaaaaand I have...|2602738438| 18535|Aaaaaaaand I have...|aaaaaaaand i have...|aaaaaaaand have t...| |can I please have...|2602684185| 18535|can I please have...|can i please have...|can please have t...| +--------------------+----------+-------+--------------------+--------------------+--------------------+ only showing top 5 rows
## install textblob
## Use textblob to do sentiment score 
!pip install textblob
Collecting textblob Downloading textblob-0.15.3-py2.py3-none-any.whl (636 kB) |▌ | 10 kB 21.8 MB/s eta 0:00:01 |█ | 20 kB 24.3 MB/s eta 0:00:01 |█▌ | 30 kB 15.5 MB/s eta 0:00:01 |██ | 40 kB 10.8 MB/s eta 0:00:01 |██▋ | 51 kB 7.9 MB/s eta 0:00:01 |███ | 61 kB 6.5 MB/s eta 0:00:01 |███▋ | 71 kB 6.9 MB/s eta 0:00:01 |████▏ | 81 kB 7.1 MB/s eta 0:00:01 |████▋ | 92 kB 7.1 MB/s eta 0:00:01 |█████▏ | 102 kB 6.1 MB/s eta 0:00:01 |█████▋ | 112 kB 6.1 MB/s eta 0:00:01 |██████▏ | 122 kB 6.1 MB/s eta 0:00:01 |██████▊ | 133 kB 6.1 MB/s eta 0:00:01 |███████▏ | 143 kB 6.1 MB/s eta 0:00:01 |███████▊ | 153 kB 6.1 MB/s eta 0:00:01 |████████▎ | 163 kB 6.1 MB/s eta 0:00:01 |████████▊ | 174 kB 6.1 MB/s eta 0:00:01 |█████████▎ | 184 kB 6.1 MB/s eta 0:00:01 |█████████▉ | 194 kB 6.1 MB/s eta 0:00:01 |██████████▎ | 204 kB 6.1 MB/s eta 0:00:01 |██████████▉ | 215 kB 6.1 MB/s eta 0:00:01 |███████████▎ | 225 kB 6.1 MB/s eta 0:00:01 |███████████▉ | 235 kB 6.1 MB/s eta 0:00:01 |████████████▍ | 245 kB 6.1 MB/s eta 0:00:01 |████████████▉ | 256 kB 6.1 MB/s eta 0:00:01 |█████████████▍ | 266 kB 6.1 MB/s eta 0:00:01 |██████████████ | 276 kB 6.1 MB/s eta 0:00:01 |██████████████▍ | 286 kB 6.1 MB/s eta 0:00:01 |███████████████ | 296 kB 6.1 MB/s eta 0:00:01 |███████████████▍ | 307 kB 6.1 MB/s eta 0:00:01 |████████████████ | 317 kB 6.1 MB/s eta 0:00:01 |████████████████▌ | 327 kB 6.1 MB/s eta 0:00:01 |█████████████████ | 337 kB 6.1 MB/s eta 0:00:01 |█████████████████▌ | 348 kB 6.1 MB/s eta 0:00:01 |██████████████████ | 358 kB 6.1 MB/s eta 0:00:01 |██████████████████▌ | 368 kB 6.1 MB/s eta 0:00:01 |███████████████████ | 378 kB 6.1 MB/s eta 0:00:01 |███████████████████▋ | 389 kB 6.1 MB/s eta 0:00:01 |████████████████████ | 399 kB 6.1 MB/s eta 0:00:01 |████████████████████▋ | 409 kB 6.1 MB/s eta 0:00:01 |█████████████████████ | 419 kB 6.1 MB/s eta 0:00:01 |█████████████████████▋ | 430 kB 6.1 MB/s eta 0:00:01 |██████████████████████▏ | 440 kB 6.1 MB/s eta 0:00:01 |██████████████████████▋ | 450 kB 6.1 MB/s eta 0:00:01 |███████████████████████▏ | 460 kB 6.1 MB/s eta 0:00:01 |███████████████████████▊ | 471 kB 6.1 MB/s eta 0:00:01 |████████████████████████▏ | 481 kB 6.1 MB/s eta 0:00:01 |████████████████████████▊ | 491 kB 6.1 MB/s eta 0:00:01 |█████████████████████████▎ | 501 kB 6.1 MB/s eta 0:00:01 |█████████████████████████▊ | 512 kB 6.1 MB/s eta 0:00:01 |██████████████████████████▎ | 522 kB 6.1 MB/s eta 0:00:01 |██████████████████████████▊ | 532 kB 6.1 MB/s eta 0:00:01 |███████████████████████████▎ | 542 kB 6.1 MB/s eta 0:00:01 |███████████████████████████▉ | 552 kB 6.1 MB/s eta 0:00:01 |████████████████████████████▎ | 563 kB 6.1 MB/s eta 0:00:01 |████████████████████████████▉ | 573 kB 6.1 MB/s eta 0:00:01 |█████████████████████████████▍ | 583 kB 6.1 MB/s eta 0:00:01 |█████████████████████████████▉ | 593 kB 6.1 MB/s eta 0:00:01 |██████████████████████████████▍ | 604 kB 6.1 MB/s eta 0:00:01 |██████████████████████████████▉ | 614 kB 6.1 MB/s eta 0:00:01 |███████████████████████████████▍| 624 kB 6.1 MB/s eta 0:00:01 |████████████████████████████████| 634 kB 6.1 MB/s eta 0:00:01 |████████████████████████████████| 636 kB 6.1 MB/s Requirement already satisfied: nltk>=3.1 in /databricks/python3/lib/python3.7/site-packages (from textblob) (3.5) Requirement already satisfied: joblib in /databricks/python3/lib/python3.7/site-packages (from nltk>=3.1->textblob) (0.14.1) Requirement already satisfied: tqdm in /databricks/python3/lib/python3.7/site-packages (from nltk>=3.1->textblob) (4.54.1) Requirement already satisfied: regex in /databricks/python3/lib/python3.7/site-packages (from nltk>=3.1->textblob) (2020.11.13) Requirement already satisfied: click in /databricks/python3/lib/python3.7/site-packages (from nltk>=3.1->textblob) (7.1.2) Installing collected packages: textblob Successfully installed textblob-0.15.3 WARNING: You are using pip version 20.0.2; however, version 20.3.1 is available. You should consider upgrading via the '/databricks/python3/bin/python3.7 -m pip install --upgrade pip' command.
from pyspark.sql.types import FloatType
 
from textblob import TextBlob
##
def sentiment_analysis(text):
    return TextBlob(text).sentiment.polarity
 
sentiment_analysis_udf = udf(sentiment_analysis , FloatType())
df  = df.withColumn("sentiment_score", sentiment_analysis_udf( df['removed'] ))
df.show(5,True)
+--------------------+----------+-------+--------------------+--------------------+--------------------+---------------+ | text| id|pubdate| text_non_asci| fixed_abbrev| removed|sentiment_score| +--------------------+----------+-------+--------------------+--------------------+--------------------+---------------+ |10 Things Missing...|2602860537| 18536|10 Things Missing...|10 things missing...|things missing in...| -0.03181818| |RT @_NATURALBWINN...|2602850443| 18536|RT @_NATURALBWINN...|@_naturalbwinner ...|oh and do not lik...| -0.03181818| |RT @HBO24 yo the ...|2602761852| 18535|RT @HBO24 yo the ...|@hbo24 yo the #ne...|yo the newtwitter...| 0.3181818| |Aaaaaaaand I have...|2602738438| 18535|Aaaaaaaand I have...|aaaaaaaand i have...|aaaaaaaand have t...| 0.11818182| |can I please have...|2602684185| 18535|can I please have...|can i please have...|can please have t...| 0.13636364| +--------------------+----------+-------+--------------------+--------------------+--------------------+---------------+ only showing top 5 rows
## CREATE VIEW FROM DATAFRAME
df.createOrReplaceTempView("newtwitter_view")
## Sentiment Classification
def condition(r):
    if (r >=0.1):
        label = "positive"
    elif(r <= -0.1):
        label = "negative"
    else:
        label = "neutral"
    return label
 
sentiment_udf = udf(lambda x: condition(x), StringType())
df  = df.withColumn("sentiment", sentiment_udf( df['sentiment_score'] ))
df.display()


Reactions

Post a Comment

0 Comments