Data Scraping, Cleaning, dan Visualization untuk pemula
Photo dari pixel |
Cara mengambil model dari biasa-biasa saja menjadi luar biasa hanya dengan cleaning dan preprocessing.
Jika memiliki model yang memiliki hasil dan dapat diterima tetapi tidak luar biasa, lihat data! luangkan waktu untuk clean dan preprocess data dengan cara yang benar, agar dapat membuat model menjadi bintang.
Untuk melihat scraping dan preprocessing lebih detail, mari kita lihat beberapa pekerjaan yang masuk ke "You Are What You Tweet: Mendeteksi Depresi di Media Sosial melalui Penggunaan Twitter." Dengan begitu, kita benar-benar dapat memeriksa proses scraping Tweets dan kemudian cleaning dan preprocessing mereka. Kami juga akan melakukan sedikit visualisasi eksplorasi, yang merupakan cara yang luar biasa untuk mendapatkan pemahaman yang lebih baik tentang seperti apa data!. Kami akan melakukan beberapa pekerjaan cleaning dan preprocessing paling mendasar di sini: terserah Anda untuk benar-benar mendapatkan Tweet ini saat Anda membangun model Anda!
Sedikit latar belakang
Lebih dari 300 juta orang menderita depresi dan hanya sebagian kecil yang menerima perawatan yang memadai. Depresi adalah penyebab utama kecacatan di seluruh dunia dan hampir 800.000 orang setiap tahun meninggal karena bunuh diri. Bunuh diri adalah penyebab utama kematian kedua pada usia 15-29 tahun. Diagnosis (dan perawatan selanjutnya) untuk depresi seringkali tertunda, tidak tepat, dan / atau terlewatkan sama sekali.
Tidak harus seperti ini! Media sosial memberikan peluang yang belum pernah terjadi sebelumnya untuk mengubah layanan intervensi depresi dini, terutama pada orang dewasa muda.
Setiap detik, sekitar 6.000 Tweet tweet di Twitter, yang sesuai dengan lebih dari 350.000 tweet yang dikirim per menit, 500 juta tweet per hari dan sekitar 200 miliar tweet per tahun. Pew Research Center menyatakan bahwa saat ini, 72% publik menggunakan beberapa jenis media sosial. Proyek ini menangkap dan menganalisis penanda linguistik yang terkait dengan onset dan persistensi gejala depresi untuk membangun algoritma yang dapat memprediksi depresi secara efektif. Dengan membangun algoritme yang dapat menganalisis Tweet yang memperlihatkan fitur depresi yang dinilai sendiri, akan mungkin bagi individu, orang tua, pengasuh, dan profesional medis untuk menganalisis posting media sosial untuk petunjuk linguistik yang memberi sinyal memburuknya kesehatan mental jauh sebelum pendekatan tradisional saat ini dilakukan. Menganalisis penanda linguistik dalam posting media sosial memungkinkan untuk penilaian profil rendah yang dapat melengkapi layanan tradisional dan akan memungkinkan kesadaran yang jauh lebih awal tentang tanda-tanda depresi daripada pendekatan tradisional.
Mengumpulkan data
Untuk membangun detektor depresi, ada dua jenis tweet yang diperlukan: tweet acak yang tidak selalu mengindikasikan depresi dan tweet yang menunjukkan bahwa pengguna mungkin mengalami depresi dan / atau gejala depresi. Dataset tweet acak dapat diambil dari dataset Sentiment140 yang tersedia di Kaggle, tetapi untuk model klasifikasi biner ini, dataset yang menggunakan dataset Sentiment140 dan menawarkan satu set label biner yang terbukti paling efektif untuk membangun model yang kuat. Tidak ada dataset tweet yang menunjukkan adanya depresi, sehingga Tweet "depresi" diambil menggunakan alat pengikis Twitter TWINT. Tweet yang dikorek secara manual diperiksa untuk relevansi (misalnya, Tweet yang menunjukkan depresi emosional daripada ekonomi atau atmosfer) dan Tweet dibersihkan dan diproses. Tweet dikumpulkan dengan mencari istilah-istilah yang secara spesifik terkait dengan depresi, khususnya istilah-istilah leksikal sebagaimana diidentifikasi dalam unigram oleh De Choudhury, et. Al.
TWINT adalah alat yang sangat sederhana untuk digunakan!
Anda dapat mengunduhnya langsung dari baris perintah dengan:
pip install twintJika Anda ingin, misalnya, mencari istilah "depresi" pada 20 Juli 2019 dan menyimpan data sebagai csv baru bernama "depresi," Anda akan menjalankan perintah seperti:
twint -s "depression" --since 2019-07-20 -o depression —csv
Setelah mengumpulkan Tweet, Anda dapat mulai membersihkan dan memprosesnya. Anda mungkin akan mendapatkan banyak informasi yang tidak Anda butuhkan, seperti id percakapan dan sebagainya. Anda dapat memutuskan untuk membuat beberapa CSV yang ingin Anda gabungkan. Kita akan mendapatkan semua itu!
Bagaimana kinerja model?
Pertama? Tidak terlalu mengesankan. Setelah cleaning dasar dan preprocessing data, hasil terbaik (bahkan setelah menghabiskan waktu menyempurnakan model) melayang di sekitar 80%.
Alasan untuk itu benar-benar masuk akal setelah saya memeriksa frekuensi kata dan bigrams. Jelajahi data Anda! Setelah saya melihat kata-kata itu sendiri, saya menyadari bahwa itu akan membutuhkan banyak pekerjaan untuk membersihkan dan menyiapkan dataset dengan cara yang benar, dan melakukan hal itu adalah kebutuhan mutlak. Bagian dari proses pembersihan harus dilakukan secara manual, jadi jangan takut untuk masuk ke sana dan membuat tangan Anda kotor. Itu membutuhkan waktu, tetapi itu sepadan!
Pada akhirnya? Keakuratan model dievaluasi dan dibandingkan dengan model baseline klasifikasi biner menggunakan regresi logistik. Model dianalisis untuk akurasi dan laporan klasifikasi dijalankan untuk menentukan skor presisi dan recall. Data dipecah menjadi pelatihan, pengujian, dan set validasi dan akurasi untuk model ditentukan berdasarkan kinerja model dengan data pengujian, yang disimpan terpisah. Sementara kinerja model regresi logistik benchmark adalah 64,32% menggunakan data yang sama, learning rate, dan epochs, model LSTM berkinerja lebih baik secara signifikan pada 97,21%.
Jadi bagaimana kita dapat hasil terbaik dari scrape Tweet sampai ke hasil?
Berlatih, berlatih, berlatih!
Cleaning dan Preprocessing Dasar
Katakanlah kita menggunakan Twitter untuk istilah pencarian “depression,” “depressed,” “hopeless,” “lonely,” “suicide,” dan “antidepressant” dan kami menyimpan file Tweet yang discraped itu, misalnya, "depression" di file "tweets.csv" dan seterusnya.
Kami akan mulai dengan beberapa import code python berikut:
import pandas as pdBaca dengan baik salah satu file CSV dan lihat bagian kepalanya.
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import re
from nltk.tokenize import WordPunctTokenizer
tok = WordPunctTokenizer()
Pertama-tama, kita harus menyingkirkan semua informasi yang tersimpan dalam kumpulan data yang tidak diperlukan. Kami tidak memerlukan nama, id, id percakapan, geolokasi, dan sebagainya untuk proyek ini. Kita bisa mengeluarkan mereka dari sana dengan code berikut:
hopeless_tweets_df.drop(['date', 'timezone', 'username', 'name', 'conversation_id', 'created_at', 'user_id', 'place', 'likes_count', 'link', 'retweet', 'quote_url', 'video', 'user_rt_id', 'near', 'geo', 'mentions', 'urls', 'photos', 'replies_count', 'retweets_count'], axis = 1, inplace = True)
Sekarang kita punya ini, yang jauh lebih mudah untuk ditangani!
Sekarang lakukan saja dengan semua CSV yang Anda buat dengan istilah pencarian Anda dan kami dapat menggabungkan atau memisahkan dataset menjadi satu!
df_row_reindex = pd.concat([depression_tweets_df, hopeless_tweets_df, lonely_tweets_df, antidepressant_tweets_df, antidepressants_tweets_df, suicide_tweets_df], ignore_index=True)df_row_reindex
Sebelum kita melangkah lebih jauh, mari kita hapus duplikatnya
depressive_twint_tweets_df = df.drop_duplicates()
Dan simpan dataset sebagai CSV baru!
export_csv = depressive_twint_tweets_df.to_csv(r'depressive_unigram_tweets_final.csv')
Preprocessing Lebih Lanjut
Sebelum data dapat digunakan dalam model, perlu untuk memperluas kontraksi, menghapus tautan, tagar, huruf besar, dan tanda baca. Negasi perlu ditangani. Itu berarti membuat kamus negasi sehingga kata-kata yang dinegasikan dapat ditangani secara efektif. Tautan dan URL harus dihapus bersama spasi putih. Selain itu, hentikan kata-kata di luar kata henti NLTK standar yang perlu dihapus untuk membuat model lebih kuat. Kata-kata ini termasuk hari dalam seminggu dan singkatannya, nama bulan, dan kata "Twitter," yang secara mengejutkan muncul sebagai kata yang menonjol ketika kata cloud dibuat. Tweet kemudian dilakukan tokenized dan PorterStemmer.
Mari kita keluarkan semua hal yang tidak akan membantu kita!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import itertools
import collections
import re
import networkx as nx
import nltk
nltk.download(['punkt','stopwords'])
from nltk.corpus import stopwords
stopwords = stopwords.words('english')
from nltk.corpus import stopwords
from nltk import bigrams
import warnings
warnings.filterwarnings("ignore")
sns.set(font_scale=1.5)
sns.set_style("whitegrid")
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
analyzer = SentimentIntensityAnalyzer()%matplotlib inline
%config InlineBackend.figure_format = 'retina'
Baca di CSV baru:
pd.read_csv('depressive_unigram_tweets_final.csv')
Ubah itu menjadi data Pandas dataframe:
df2 = pd.read_csv('depressive_unigram_tweets_final.csv')
Sekarang mari kita lihat apakah ada nilai nol. Mari kita bersihkan!
Kami akan dengan cepat menghapus stopwords dari Tweet dengan menggunakan code:
df_new['clean_tweet'] = df_new['tweet'].apply(lambda x: ' '.join([item for item in x.split() if item not in stopwords]))Jika mau, Anda dapat menganalisis skor analisis sentimen Tweet untuk VADER!
df_new['vader_score'] = df_new['clean_tweet'].apply(lambda x: analyzer.polarity_scores(x)['compound'])
Dari sana, Anda juga dapat membuat label. Untuk model klasifikasi biner, Anda mungkin menginginkan sistem label biner. Namun, perhatikan data Anda! Skor sentimen saja tidak mengindikasikan depresi dan terlalu sederhana untuk menganggap bahwa skor negatif mengindikasikan depresi. Faktanya, anhedonia, atau kehilangan kesenangan, adalah gejala depresi yang sangat umum. Tweet Netral, atau datar, setidaknya paling mungkin, jika tidak lebih mungkin, menjadi indikator depresi dan tidak boleh diabaikan.
Untuk keperluan eksperimen, Anda mungkin ingin menetapkan label analisis sentimen seperti ini. Jangan ragu untuk bermain-main atau mengexplorasi!!!
positive_num = len(df_new[df_new['vader_score'] >=0.05]) negative_num = len(df_new[df_new['vader_score']<0.05])
df_new['vader_sentiment_label']= df_new['vader_score'].map(lambda x:int(1) if x>=0.05 else int(0))
Jika perlu, hapus apa yang tidak Anda butuhkan.
df_new = df_new[['Unnamed: 0', 'vader_sentiment_label', 'vader_score', 'clean_tweet']]
df_new.head()
Silakan menyimpan csv!
df_new.to_csv('vader_processed_final.csv')
Ayo terus bermain dengan data!
df_new['text'] = df_new['clean_tweet']
df_new['text']
kita dapat menghapus URL
def remove_url(txt):
return " ".join(re.sub("([^0-9A-Za-z \t])|(\w+:\/\/\S+)", "", txt).split())
all_tweets_no_urls = [remove_url(tweet) for tweet in df_new['text']]
all_tweets_no_urls[:5]
Sekarang mari kita buat semuanya huruf kecil dan pisahkan Tweet.
#lower_case = [word.lower () untuk kata dalam df_new ['text']]
kalimat = df_new ['text']
all_tweets_no_urls [0] .split ()
words_in_tweet = [tweet.lower (). split () untuk tweet di all_tweets_no_urls]
words_in_tweet [: 2]
Cleaning Manual
Ini tidak menyenangkan dan tidak cantik, tetapi pembersihan manual sangat penting. Butuh berjam-jam, tetapi menyingkirkan referensi untuk hal-hal seperti depresi tropis dan depresi ekonomi meningkatkan model. Menghapus Tweet yang merupakan judul film meningkatkan model (Anda dapat melihat “Suicide Squad” di bigrams di bawah). Menghapus berita utama yang dikutip yang menyertakan istilah pencarian meningkatkan model. Rasanya butuh waktu yang lama untuk dilakukan, tetapi langkah ini membuat perbedaan besar dalam kekokohan model.
Visualisasi dan Analisis Eksplorasi
Sekarang mari kita lihat frekuensi karakter dan kata!
Cukup mudah untuk menganalisis kata-kata paling umum yang ditemukan dalam dataset. Setelah menghapus kata-kata penghenti, tampak jelas bahwa ada kata-kata tertentu yang muncul lebih sering daripada kata-kata lain.
Mari kita hitung kata-kata kita yang paling umum!
# List of all words
all_words_no_urls = list(itertools.chain(*words_in_tweet))
# Create counter
counts_no_urls = collections.Counter(all_words_no_urls)
counts_no_urls.most_common(15)
Dan mengubahnya menjadi dataframe.
clean_tweets_no_urls = pd.DataFrame(counts_no_urls.most_common(15),
columns=['words', 'count'])
clean_tweets_no_urls.head()
Hmmm. Terlalu banyak stopword. Mari kita hadapi itu.
stop_words = set(stopwords.words('english'))
# Remove stop words from each tweet list of words
tweets_nsw = [[word for word in tweet_words if not word in stop_words]
for tweet_words in words_in_tweet]
tweets_nsw[0]
Mari kita lihat lagi.
all_words_nsw = list(itertools.chain(*tweets_nsw)) counts_nsw = collections.Counter(all_words_nsw) counts_nsw.most_common(15)
Lebih baik, tapi belum hebat. Beberapa dari kata-kata ini tidak banyak memberi tahu kami. Mari kita buat beberapa penyesuaian lagi.
collection_words = ['im', 'de', 'like', 'one']
tweets_nsw_nc = [[w for w in word if not w in collection_words]
for word in tweets_nsw]
Sekarang:
# Flatten list of words in clean tweets
all_words_nsw_nc = list(itertools.chain(*tweets_nsw_nc))
# Create counter of words in clean tweets
counts_nsw_nc = collections.Counter(all_words_nsw_nc)
counts_nsw_nc.most_common(15)
Jauh lebih baik! Mari kita simpan ini sebagai dataframe.
clean_tweets_ncw = pd.DataFrame(counts_nsw_nc.most_common(15),
columns=['words', 'count'])
clean_tweets_ncw.head()
Seperti apa itu? Mari kita visualisasikan!
fig, ax = plt.subplots(figsize=(8, 8))
# Plot horizontal bar graph
clean_tweets_no_urls.sort_values(by='count').plot.barh(x='words',
y='count', ax=ax, color="purple")ax.set_title("Common Words Found in Tweets (Including All Words)")
plt.show()
Mari kita lihat beberapa bigrams!
from nltk import bigrams
# Create list of lists containing bigrams in tweets
terms_bigram = [list(bigrams(tweet)) for tweet in tweets_nsw_nc]
# View bigrams for the first tweet
terms_bigram[0]
# Flatten list of bigrams in clean tweets
bigrams = list(itertools.chain(*terms_bigram))
# Create counter of words in clean bigrams
bigram_counts = collections.Counter(bigrams)
bigram_counts.most_common(20)
bigram_df = pd.DataFrame(bigram_counts.most_common(20), columns=['bigram', 'count']) bigram_dfBigRams tertentu juga sangat umum, termasuk smile dan wide, muncul 42.185 kali, afraid dan loneliness, muncul 4.641 kali, dan feel dan lonely, muncul 3.541 kali.
Ini hanya awal dari pembersihan, preprocessing, dan memvisualisasikan data. Kita masih bisa melakukan banyak hal dari sini sebelum kita membangun model kita!
Setelah Tweet dibersihkan, mudah untuk melihat perbedaan antara dua set data dengan membuat kata cloud dengan Tweet yang dibersihkan. Dengan hanya scraping Twitter TWINT, perbedaan antara dua set data sudah jelas:
Pada awal proses, menjadi jelas bahwa bagian terpenting dari penyempurnaan model untuk mendapatkan hasil yang lebih akurat adalah tahap pengumpulan data, cleaning, dan preprocessing. Sampai Tweet di scraped dan dibersihkan dengan tepat, model tersebut memiliki akurasi yang tidak mengesankan. Dengan membersihkan dan memproses Tweet dengan lebih hati-hati, ketahanan model meningkat menjadi 97%.
Jika Anda tertarik mempelajari dasar-dasar mutlak cleaning dan preprocessing data, lihat artikel ini!
Terima kasih sudah membaca! Seperti biasa, jika Anda melakukan sesuatu yang keren dengan informasi ini, beri tahu semua orang tentang hal itu di komentar di bawah atau hubungi kapan saja!
Sumber : towardsdatascience, github