Web Scraping Menggunakan Python dan NLP

Pada tutorial ini kita akan belajar dasar Web Scraping untuk mendapatkan data dari halaman web dan Natural Language Processing untuk analisis kata kemudian memplot kata-kata yang paling sering muncul dalam novel Moby Dick dalam bentuk visualisasi. Untuk dapat melakukannya, kita akan membutuhkan beberapa tahapan dalam membangun pipa data untuk membuat distribusi frekuensi kata dalam novel Moby Dick. Berikut ini tahapannya:

Pertama kita mengambil data pada url https://www.gutenberg.org/ dengan menggunakan teknik web scraping . Situs ini berisi kumpulan banyak buku novel dan kita akan menggunakan package Python yaitu requests untuk mengakses url kemudian mengekstrak novel dari data web ini menggunakan BeautifulSoup. Untuk menganalisis novel kita menggunakan Natural Language ToolKit (nltk). Dalam prosesnya, Anda akan belajar tentang aspek-aspek penting dari Natural Language Processing (NLP) seperti tokenization dan stopwords.

Sebagian besar data di dunia ini adalah data yang tidak terstruktur dan mencakup banyak teks. Sehingga, keterampilan untuk memahami NLP ini sangat penting.

Okey, kita masuk pada pada step pertama yaitu

1. Membuat pernyataan pada data

Apa kata-kata yang paling sering muncul dalam novel Moby Dick dan seberapa sering muncul?

2. Mengambil data dari halaman web ( Web Scraping )

Data mentah pertama yang akan kita ambil adalah teks dari novel Melville's Moby Dick. Kita dapat mengaksesnya pada url https://www.gutenberg.org/files/2701/2701-h/2701-h.htm dan menyimpanya ke dalam variabel url di python.

url = 'https://www.gutenberg.org/files/2701/2701-h/2701-h.htm'

Perhatikan bahwa data kita dalam bentuk HTML yaitu Hypertext Markup Language yang merupakan bahasa markup standar untuk web.

Untuk membuka url kita gunakan library python requests. Kemudian membuat permintaan GET dari situs web, yang berarti Anda mendapatkan data. Teknik ini sebenarnya yang Anda lakukan melalui browser saat mengunjungi halaman web menggunakan browser. Ada beberapa jenis permintaan lainnya, seperti permintaan POST yaitu untuk mengirim data, tetapi kita belum akan menggunakan nya pada tutorial ini.

Impor modul requests

import requests

Membuat permintaan dan cek tipe objek

r = requests.get(url)
type(r)

Output diatas menunjukan objek response. Anda dapat melihat panduan modul request bahwa objek Response memiliki atribut text yang memungkinkan kita untuk mendapatkan data dari HTML.

Atau gunakan perintah berikut untuk melihat dokumentasi modul requests

requests?

Lalu ekstrak HTML dari objek Response dan cetak

html = r.text
print(html)

3. Menggabungkan Data untuk Menjawab Pertanyaan

Tahap 1: Dapatkan Teks dari HTML

# Mengimpor BeautifulSoup dari bs4
from bs4 import BeautifulSoup

# Membuat objek BeautifulSoup dari HTML
soup = BeautifulSoup(html, "html5lib")
type(soup)

Dan kita coba lihat judul dari data ini

soup.title
Output
<title>
      Moby Dick; Or the Whale, by Herman Melville
    </title>

Output di atas masih menghasilkan dalam bentuk HTML, kita dapat menampilkan judul sebagai string.

soup.title.string
Output
'\n      Moby Dick; Or the Whale, by Herman Melville\n    '

Kemudian kita akan coba mengambil semua URL yang ada di dalam tag <a> halaman (hyperlink):

soup.findAll('a')[:8]
Output
[<a href="#link2H_4_0002"> ETYMOLOGY. </a>,
 <a href="#link2H_4_0003"> EXTRACTS (Supplied by a Sub-Sub-Librarian).
         </a>,
 <a href="#link2HCH0001"> CHAPTER 1. Loomings. </a>,
 <a href="#link2HCH0002"> CHAPTER 2. The Carpet-Bag. </a>,
 <a href="#link2HCH0003"> CHAPTER 3. The Spouter-Inn. </a>,
 <a href="#link2HCH0004"> CHAPTER 4. The Counterpane. </a>,
 <a href="#link2HCH0005"> CHAPTER 5. Breakfast. </a>,
 <a href="#link2HCH0006"> CHAPTER 6. The Street. </a>]

Hyperlink di atas bukan data yang kita inginkan saat ini, kita akan mengambil semua teks pada halaman web.

text = soup.get_text()
print(text)

Okey, sekarang kita sudah mendapatkan data sebagai teks. Lalu kita akan menghitung berapa kali setiap kata muncul dan plot frekuensi dalam histogram menggunakan NLP.

Tahap 2: Ekstrak Kata-kata dari Teks dengan NLP

NLTK adalah salah satu tool yang sangat populer pada ilmu Natural Language Processing (NLP) dengan menggunakan bahasa pemrograman Python. Natural Language Toolkit ini sangat mendukung proses pengolahan bahasa natural seperti classification, tokenization, stemming, tagging, parsing dll.

Sekarang kita akan menggunakan Natural Language Toolkit ( NLTK ) untuk:

  • Tokenize atau Tokenikasi Teks yaitu proses pemisahan token ( kata-kata )
  • Stopwords yaitu menghapus kata-kata umum yang tidak mempunyai makna seperti 'a', 'the' dan lainnya yang ada pada hampir semua teks bahasa Inggris.

Pertama kita harus mendownload modul NLTK. Ada beberapa cara, pertama jika ingin mendownload semua paket dari modul NLTK menggunakan perintah berikut di terminal anda:

python -m nltk.downloader all

atau menggunakan pip di Jupyter Notebook

pip install -U nltk
import nltk
nltk.download()

Informasi lengkapnya mengenai NLTK bisa dilihat di https://www.nltk.org/data.html

Langkah 1: Tokenize

Kita akan melakukan tokenize teks yaitu membaginya menjadi daftar kata. Pada dasarnya, cara ini memisahkan bagian-bagian dari teks yang dipisahkan oleh spasi ( whitespace ).

Untuk melakukan ini kita menggunakan Ekspresi Reguler ( Regex ) yaitu urutan karakter yang menentukan pola pencarian. Kita akan gunakan contoh sebagai berikut :

  • Kita memiliki string 'peter piper picked a peck of pickled peppers' dan mengekstrak semua kata yang ada di dalamnya yang dimulai dengan huruf 'p'.

Ekspresi reguler yang cocok dengan semua kata yang dimulai dengan 'p' adalah 'p\w+'. Mengapa demikian? berikut penjelesan nya:

  • '\w' adalah karakter khusus yang cocok dengan alfanumerik Az, az, 0-9 dan garis bawah.
  • 'p' di awal ekspresi reguler berarti bahwa Anda hanya akan mencocokkan urutan karakter yang dimulai dengan huruf 'p'
  • Tanda '+' memberi tahu Anda bahwa karakter sebelumnya di regex dapat muncul sebanyak yang Anda inginkan dalam string yang Anda coba cocokkan. Ini berarti bahwa '\w+' akan cocok dengan urutan karakter alfanumerik dan garis bawah.

Baik, sekarang kita akan mempraktekkannya pada contoh berikut ini menggunakan library bawaan python yaitu re.

# Impor paket regex
import re

# Definisikan sentence
sentence = 'peter piper pick a peck of pickled peppers'

# Definisikan regex
ps = 'p\w+'

# Mencari semua kata di sentence yang cocok dengan regex kemudian cetak
re.findall(ps, sentence)
Output
['peter', 'piper', 'pick', 'peck', 'pickled', 'peppers']

Lihat outputnya bahwa p\w+ mencari semua kata yang berawalan huruf p pada variabel sentence. Dan sekarang kita akan coba mengekstrak semua kata.

re.findall('\w+', sentence)

Sekarang Anda dapat melakukan hal yang sama pada text string yang berisi novel Moby Dick :

# Mencari semua kata di Moby Dick dan cetak 8 kata pertama
tokens = re.findall('\w+', text)
tokens[:8]
Output
['ï', 'Moby', 'Dick', 'Or', 'the', 'Whale', 'by', 'Herman']

Perlu diketahui bahwa, ada juga cara lain untuk mengekstrak kata menggunakan NLTK

# Impor RegexpTokenizer dari nltk.tokenize
from nltk.tokenize import RegexpTokenizer

# Buat tokenizer
tokenizer = RegexpTokenizer('\w+')

# Buat tokens
tokens = tokenizer.tokenize(text)
tokens[:8]
Output
['ï', 'Moby', 'Dick', 'Or', 'the', 'Whale', 'by', 'Herman']

Hasilnya sama saja.

Coba perhatikan output di atas masih menghasilkan kata huruf besar seperti 'Or', 'Whale', kita dapat membuat semua kata menjadi huruf kecil semua agar lebih mudah yaitu menggunakan metode string .lower().

# Menginisialisasi ke dalam list
words = []

# Loop dari list tokens dan buat huruf kecil/lower case
for word in tokens:
    words.append(word.lower())

# Cetak beberapa
words[:8]
['ï', 'moby', 'dick', 'or', 'the', 'whale', 'by', 'herman']
Langkah 2: Menghapus stopwords

Sekarang kita saatnya menghapus kata-kata umum yang tidak perlu menggunakan teknik stopwords. Pastikan sudah menginstall modul stopwords pada NLTK. Coba jalankan kode berikut, jika muncul error silahkan tambahkan nltk.download('stopwords') di bawah import untuk menginstal nya.

# Impor modul nltk
import nltk

# Get English stopwords and print some of them
sw = nltk.corpus.stopwords.words('english')
sw[:5]
Output
['i', 'me', 'my', 'myself', 'we']

Kita sudah menyimpan stopwords pada variabel sw. Sekarang kita akan menghapusnya:

# Menginisialisasi ke dalam list
words_ns = []

# Tambahkan ke words_ns semua kata yang ada dalam words tetapi tidak dalam sw
for word in words:
    if word not in sw:
        words_ns.append(word)

# Cetak beberapa
words_ns[:5]
Output
['ï', 'moby', 'dick', 'whale', 'herman']

4. Menjawab pertanyaan

Kita akan menjawab pertanyaan pada data yang sudah kita buat pada tahap awal tutorial ini.

Apa kata-kata yang paling sering muncul dalam novel Moby Dick dan seberapa sering muncul?

Sekarang kita dapat memplot histogram frekuensi kata dalam Moby Dick menggunakan cara berikut:

  • Membuat objek distribusi frekuensi menggunakan fungsi nltk.FreqDist().
  • Menggunakan plot() untuk visualisasi.
#Impor datavis libraries
import matplotlib.pyplot as plt
import seaborn as sns

# Figures inline dan setting style visualisasi
%matplotlib inline
sns.set()

# Buat frekuensi distribusi dan plot 25 kata
freqdist1 = nltk.FreqDist(words_ns)
freqdist1.plot(25)

Output

output visualisasi data jupyter 01

5. Kesimpulan hasil Analisis

Kita sudah menggunakan NLTK dan juga sudah menjawab pertanyaan yang sudah kita buat di awal. Sekarang kita bisa mengkomunikasikan hasil analisa yang sudah kita lakukan. Pada distribusi frekuensi plot, kita melihat bahwa kata-kata yang sering muncul yaitu WHALE pada novel Moby Dick. Dengan kemunculan lebih dari >1200 kali.

Pada tutorial ini kita sudah dapat melakukan analisa kata sederhana menggunakan NLTK untuk mngasilkan wawasan. Selain data dari halaman web, kita juga bisa mencari data di sosial media contoh twitter misalnya. Kita akan bahas pada tutorial selanjutnya.

6. Membuat fungsi sendiri

Seperti yang telah Anda lihat bahwa ada banyak novel di Project Gutenberg, kita dapat membuat histogram frekuensi kata ini, langkah-langkah yang sudah kita lakukan diatas bisa kita rangkum ke dalam fungsi python untuk memudahkan menganalisa novel lainnya pada Project Gutenberg.

def plot_word_freq(url):
    """Mengambil url (dari Project Gutenberg) dan 
    memplot frekuensi distribusi kata"""
    
    # Buat permintaan dan periksa jenis objek
    r = requests.get(url)
    # Mengekstrak HTML dari objek Response dan cetak
    html = r.text
    # Membuat objek BeautifulSoup dari HTML
    soup = BeautifulSoup(html, "html5lib")
    # Dapatkan text dari soup dan cetak
    text = soup.get_text()
    # Buat tokenizer
    tokenizer = RegexpTokenizer('\w+')
    # Buat tokens
    tokens = tokenizer.tokenize(text)
    # Menginisialisasi ke dalam list
    words = []
    # Loop melalui list tokens dan buat semua kata menjadi huruf kecil
    for word in tokens:
        words.append(word.lower())
    # Dapatkan stopword bahasa Inggris dan cetak
    sw = nltk.corpus.stopwords.words('english')
    # Menginisialisasi ke dalam list
    words_ns = []
    # Tambahkan ke words_ns semua kata yang ada dalam words tetapi tidak dalam sw
    for word in words:
        if word not in sw:
            words_ns.append(word)
    # Buat frekuensi distribusi dan plot 25 kata
    freqdist1 = nltk.FreqDist(words_ns)
    freqdist1.plot(25)

Sekarang kita sudah membuat fungsi untuk membuat frekuensi distribusi kata dan melakukan plot pada novel Project Gutternberg. Kita hanya perlu menambahkan url saja untuk menggunakan pada fungsi yang sudah kita buat. Coba silahkan cari novel lainnya di https://www.gutenberg.org/ kemudian terapkan pada fungsi berikut:

plot_word_freq(masukkan_url_novel)

plot_word_freq('https://www.gutenberg.org/files/42671/42671-h/42671-h.htm')

Output

output visualisasi data jupyter 02
plot_word_freq('https://www.gutenberg.org/files/521/521-h/521-h.htm')

Output

output visualisasi data jupyter 02
plot_word_freq('https://www.gutenberg.org/files/10/10-h/10-h.htm')

Output

output visualisasi data jupyter 03



Share on Twitter | Discuss on Twitter

Stay in touch

Like the posts you see here? Sign up to get notified about new ones.