Lewati ke konten utama

Web Scraping & NLP dengan Python

Pelajari cara men-scrape novel dari web dan membuat plot distribusi frekuensi kata; Anda akan mendapatkan pengalaman dengan paket Python requests, BeautifulSoup, dan nltk.
· 14 mnt Baca

Jelajahi bersama AI

nltk Python

Awal minggu ini, saya melakukan sesi Facebook Live Code along. Di dalamnya, kami menggunakan beberapa Pemrosesan Bahasa Alami dasar untuk membuat plot kata yang paling sering muncul dalam novel Moby Dick. Dalam proses itu, kita juga melihat efektivitas berpikir dalam kerangka pipeline Data Science berikut dengan tetap memperhatikan proses:

  1. Rumuskan pertanyaan Anda;
  2. Dapatkan data Anda;
  3. Olah data Anda untuk menjawab pertanyaan Anda;
  4. Jawab pertanyaan Anda;
  5. Presentasikan solusi Anda agar dapat dipahami orang lain.

Dalam tulisan ini, Anda akan belajar membangun pipeline data science untuk membuat plot distribusi frekuensi kata dalam Moby Dick, serta banyak novel lainnya.

Tip: jika Anda ingin menonton ulang Facebook Live, lihat video berikut; Anda bisa langsung lompat ke menit ke-12 saat Hugo tampil dan sesi benar-benar dimulai.

Kami tidak akan memberikan novelnya: Anda akan belajar men-scrape novel tersebut dari situs web Project Gutenberg (yang pada dasarnya berisi korpus buku yang besar) menggunakan paket Python requests dan cara mengekstrak novel dari data web ini menggunakan BeautifulSoup. Lalu Anda akan menyelami analisis novel menggunakan Natural Language ToolKit (nltk). Dalam prosesnya, Anda akan mempelajari aspek penting Pemrosesan Bahasa Alami (NLP) seperti tokenisasi dan stopword.

Pada akhirnya, Anda akan bisa memvisualisasikan distribusi frekuensi kata dari novel apa pun yang dapat Anda temukan di Project Gutenberg. Keterampilan NLP yang Anda kembangkan, bagaimanapun, akan berlaku untuk banyak data yang dihadapi data scientist karena porsi terbesar data di dunia adalah data tidak terstruktur dan mencakup banyak teks.

Misalnya, menurut Anda distribusi frekuensi kata berikut ini berasal dari apa?

distribusi frekuensi kata

Tulisan ini dihasilkan dari Jupyter Notebook; Anda dapat menemukannya di repositori ini. Jika Anda punya pemikiran, tanggapan, dan/atau renungan, jangan ragu menghubungi saya di Twitter: @hugobowne.

Pra-langkah

Ikuti instruksi di README.md untuk menyiapkan sistem Anda dan siap digunakan.

1. Rumuskan Pertanyaan Anda

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

2. Dapatkan Data Anda

Data mentah Anda adalah teks novel Melville, Moby Dick. Bagaimana cara Anda memasukkan teks buku ~800 kata ini ke dalam Python?

Ada beberapa cara untuk melakukannya, tetapi pertama-tama sadari bahwa teksnya tersedia gratis secara daring di Project Gutenberg. Mari menuju ke sana, coba temukan Moby Dick lalu simpan URL terkait di namespace Python Anda:

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

Sekarang setelah Anda memiliki URL-nya, Anda perlu mengambil HTML dari situs web tersebut.

Catatan bahwa HTML adalah singkatan dari Hypertext Markup Language dan merupakan bahasa markup standar untuk web.

Anda akan menggunakan requests untuk melakukan ini, salah satu paket Python yang paling populer dan berguna. Anda dapat mempelajari lebih lanjut di kursus Importing Data in Python (Bagian 2) di DataCamp.

beautifulsoup Python

Menurut situs paket requests:

Requests memungkinkan Anda mengirim permintaan HTTP/1.1 yang organik dan grass-fed, tanpa perlu kerja manual.

dan organisasi berikut mengklaim menggunakan requests secara internal:

Pemerintah Kerajaan Inggris, Amazon, Google, Twilio, NPR, Obama for America, Twitter, Sony, dan lembaga federal AS yang memilih untuk tidak disebutkan namanya.

Selain itu,

Requests adalah salah satu paket Python yang paling banyak diunduh sepanjang masa, dengan lebih dari 13.000.000 unduhan setiap bulan. Semua anak keren memakainya!

Anda akan melakukan permintaan GET dari situs web, yang berarti Anda mengambil data darinya. Ini yang Anda lakukan melalui peramban saat mengunjungi sebuah laman. Ada jenis permintaan lain, seperti permintaan POST, tetapi kita tidak akan membahasnya di sini.

requests memudahkan ini dengan fungsi get. Lakukan permintaan di sini dan periksa tipe objek yang dikembalikan.

# Import `requests`
import requests

# Make the request and check object type
r = requests.get(url)
type(r)
requests.models.Response

Ini adalah objek Response. Anda dapat melihat di panduan kickstart requests bahwa objek Response memiliki atribut text yang memungkinkan Anda mengambil HTML darinya! Mari lakukan ini dan cetak HTML-nya untuk mengeceknya:

# Extract HTML from Response object and print
html = r.text
#print(html)

OK! HTML ini belum persis seperti yang Anda inginkan. Namun, di dalamnya terkandung apa yang Anda mau: teks Moby Dick. Sekarang yang perlu Anda lakukan adalah mengolah HTML ini untuk mengekstrak novelnya.

3. Olah Data untuk Menjawab Pertanyaan

Bagian 1: Ambil Teks dari HTML

Di sini Anda akan menggunakan paket BeautifulSoup. Situs paket tersebut mengatakan:

situs paket beautifulsoup

Ini terlihat menjanjikan!

Pertama, sedikit tentang nama paket: Beautiful Soup? Dalam pengembangan web, istilah "tag soup" mengacu pada kode HTML yang secara struktural atau sintaksis tidak benar yang ditulis untuk sebuah halaman web. Yang paling baik dilakukan Beautiful Soup adalah membuat tag soup menjadi indah kembali dan mengekstrak informasi darinya dengan mudah! Faktanya, objek utama yang dibuat dan dikueri saat menggunakan paket ini disebut BeautifulSoup. Setelah membuat soup, kita dapat menggunakan metode .get_text() untuk mengekstrak teks.

# Import BeautifulSoup from bs4
from bs4 import BeautifulSoup


# Create a BeautifulSoup object from the HTML
soup = BeautifulSoup(html, "html5lib")
type(soup)
bs4.BeautifulSoup

Dari objek soup ini, Anda dapat mengekstrak berbagai informasi menarik tentang situs yang Anda scrape, seperti judul:

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

Atau judulnya sebagai string:

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

Atau semua URL yang ditemukan di dalam tag < a > suatu halaman (hyperlink):

# Get hyperlinks from soup and check out first several
soup.findAll('a')[:8]
[<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>]

Yang ingin Anda lakukan adalah mengekstrak teks dari soup dan ada metode .get_text() yang sangat membantu untuk ini.

Ambil teksnya, cetak, dan lihat. Apakah ini yang Anda inginkan?

# Get the text out of the soup and print it
text = soup.get_text()
#print(text)

Perhatikan bahwa ini sekarang hampir seperti yang Anda inginkan.

Ini adalah teks novel dengan beberapa bagian yang tidak diinginkan di awal dan di akhir. Anda bisa menghapusnya jika mau. Namun, konten ini jauh lebih sedikit dibandingkan teks Moby Dick sehingga, pada pendekatan pertama, membiarkannya tidak masalah dan ini akan menjadi pendekatan di sini. Untuk hasil yang lebih andal, saya sarankan menghapusnya.

Sekarang setelah Anda memiliki teks yang diminati, saatnya menghitung berapa kali setiap kata muncul dan membuat plot histogram frekuensi yang Anda inginkan: saatnya memanggil Natural Language Processing!

Bagian 2: Ekstrak Kata dari Teks Anda dengan NLP

Sekarang Anda akan menggunakan nltk, Natural Language Toolkit, untuk

  1. Melakukan tokenisasi teks (istilah keren untuk memecah menjadi token, seperti kata);
  2. Menghapus stopword (kata seperti 'a' dan 'the' yang sangat sering muncul di ~ hampir semua teks berbahasa Inggris).

Langkah 1: Tokenisasi

Anda ingin melakukan tokenisasi pada teks Anda, yaitu memecahnya menjadi daftar kata. Intinya, Anda ingin memisahkan bagian-bagian teks yang dipisahkan oleh spasi kosong.

Untuk melakukan ini, Anda akan menggunakan alat yang kuat yang disebut regular expressions. Regular expression, atau disingkat regex, adalah urutan karakter yang mendefinisikan pola pencarian. Regex terkenal membingungkan dan paling baik diperkenalkan melalui contoh.

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

Regular expression yang cocok dengan semua kata yang diawali 'p' adalah 'p\w+'. Mari kita uraikan:

  • 'p' di awal regular expression berarti Anda hanya akan mencocokkan urutan karakter yang dimulai dengan 'p';
  • '\w' adalah karakter khusus yang akan mencocokkan karakter alfanumerik A-z, a-z, 0-9, bersama dengan garis bawah;
  • '+' memberi tahu bahwa karakter sebelumnya dalam regex dapat muncul sebanyak yang Anda inginkan dalam string yang ingin Anda cocokan. Ini berarti '\w+' akan mencocokkan sebarang urutan karakter alfanumerik dan garis bawah.

Gabungkan semuanya dan regular expression 'p\w+' akan mencocokkan semua substring yang dimulai dengan 'p' dan diikuti oleh karakter alfanumerik dan garis bawah. Dalam kebanyakan teks bahasa Inggris yang masuk akal, ini akan sesuai dengan kata yang dimulai dengan 'p'.

Sekarang Anda akan menggunakan paket bawaan Python re untuk mengekstrak semua kata yang dimulai dengan 'p' dari kalimat 'peter piper picked a peck of pickled peppers' sebagai pemanasan.

# Import regex package
import re

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

# Define regex
ps = 'p\w+'


# Find all words in sentence that match the regex and print them
re.findall(ps, sentence)
['peter', 'piper', 'pick', 'peck', 'pickled', 'peppers']

Ini terlihat cukup bagus. Sekarang, jika 'p\w+' adalah regex yang mencocokkan kata yang dimulai dengan 'p', apa regex yang mencocokkan semua kata?

Sekarang tugas Anda melakukannya untuk kalimat mainan Peter Piper di atas.

# Find all words and print them
re.findall('\w+', sentence)
['peter', 'piper', 'pick', 'a', 'peck', 'of', 'pickled', 'peppers']

Sekarang Anda dapat melakukan hal yang sama dengan text, string yang berisi Moby Dick:

# Find all words in Moby Dick and print several
tokens = re.findall('\w+', text)
tokens[:8]
['Moby', 'Dick', 'Or', 'the', 'Whale', 'by', 'Herman', 'Melville']

Catatan bahwa ada juga cara untuk melakukan ini dengan nltk, Natural Language Toolkit:

# Import RegexpTokenizer from nltk.tokenize
from nltk.tokenize import RegexpTokenizer

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



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

Baik! Anda hampir sampai. Perhatikan, meskipun, bahwa pada bagian di atas, 'Or' memiliki huruf 'O' kapital dan di tempat lain mungkin tidak, tetapi baik 'Or' maupun 'or' ingin Anda hitung sebagai kata yang sama. Untuk alasan ini, Anda perlu membangun daftar semua kata dalam Moby Dick di mana semua huruf kapital telah diubah menjadi huruf kecil. Anda akan menemukan metode string .lower() berguna:

# Initialize new list
words = []


# Loop through list tokens and make lower case
for word in tokens:
    words.append(word.lower())


# Print several items from list as sanity check
words[:8]
['moby', 'dick', 'or', 'the', 'whale', 'by', 'herman', 'melville']

Langkah 2: Hapus stopword

Praktik umum adalah menghapus kata yang sangat sering muncul dalam bahasa Inggris seperti 'the', 'of', dan 'a' (dikenal sebagai stopword) karena kurang menarik. Untuk selengkapnya tentang semua teknik ini, lihat kursus Natural Language Processing Fundamentals in Python kami.

Paket nltk memiliki daftar stopword dalam bahasa Inggris yang sekarang akan Anda simpan sebagai sw dan dari mana Anda akan mencetak beberapa elemen pertamanya.

Jika Anda mendapat error di sini, jalankan perintah nltk.download('stopwords') untuk memasang stopword di sistem Anda.

# Import nltk
import nltk

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

Anda menginginkan daftar semua kata dalam words yang bukan ada di sw. Salah satu cara mendapatkan daftar ini adalah dengan melintasi semua elemen words dan menambahkannya ke daftar baru jika tidak ada di sw:

# Initialize new list
words_ns = []

# Add to words_ns all words that are in words but not in sw
for word in words:
    if word not in sw:
        words_ns.append(word)

# Print several list items as sanity check
words_ns[:5]
['moby', 'dick', 'whale', 'herman', 'melville']

4. Jawab Pertanyaan Anda

Pertanyaan kita adalah 'Apa saja kata yang paling sering muncul dalam novel Moby Dick dan seberapa sering kemunculannya?'

Sekarang Anda dapat membuat plot histogram frekuensi kata dalam Moby Dick hanya dengan dua baris kode menggunakan nltk. Untuk melakukan ini,

  • Anda membuat objek distribusi frekuensi menggunakan fungsi nltk.FreqDist();
  • Anda menggunakan metode plot() dari objek yang dihasilkan.
#Import datavis libraries
import matplotlib.pyplot as plt
import seaborn as sns

# Figures inline and set visualization style
%matplotlib inline
sns.set()

# Create freq dist and plot
freqdist1 = nltk.FreqDist(words_ns)
freqdist1.plot(25)

pipeline NLP Python

5. Presentasikan Solusi Anda

Hal menariknya adalah, dengan menggunakan nltk untuk menjawab pertanyaan kita, kita sebenarnya sudah mempresentasikan solusi dengan cara yang dapat dikomunikasikan kepada orang lain: sebuah plot distribusi frekuensi! Anda dapat membaca kata yang paling umum, beserta frekuensinya. Misalnya, 'whale' adalah kata yang paling umum dalam novel (tidak mengherankan), mengecualikan stopword, dan muncul lebih dari 1200 kali!

MATERIAL BONUS

Karena Anda telah melihat bahwa ada banyak novel di Project Gutenberg yang bisa kita buatkan histogram frekuensi katanya, masuk akal untuk menulis fungsi Anda sendiri yang melakukan semua ini:

 def plot_word_freq(url):
    """Takes a url (from Project Gutenberg) and plots a word frequency
    distribution"""
    # Make the request and check object type
    r = requests.get(url)
    # Extract HTML from Response object and print
    html = r.text
    # Create a BeautifulSoup object from the HTML
    soup = BeautifulSoup(html, "html5lib")
    # Get the text out of the soup and print it
    text = soup.get_text()
    # Create tokenizer
    tokenizer = RegexpTokenizer('\w+')
    # Create tokens
    tokens = tokenizer.tokenize(text)
    # Initialize new list
    words = []
    # Loop through list tokens and make lower case
    for word in tokens:
        words.append(word.lower())
    # Get English stopwords and print some of them
    sw = nltk.corpus.stopwords.words('english')
    # Initialize new list
    words_ns = []
    # Add to words_ns all words that are in words but not in sw
    for word in words:
        if word not in sw:
            words_ns.append(word)
    # Create freq dist and plot
    freqdist1 = nltk.FreqDist(words_ns)
    freqdist1.plot(25)

Sekarang gunakan fungsi tersebut untuk membuat plot distribusi frekuensi kata dari teks lain di Project Gutenberg:

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

web scraping Python

  • Robinson Crusoe
plot_word_freq('https://www.gutenberg.org/files/521/521-h/521-h.htm')

distribusi kata tokenisasi

  • The King James Bible
plot_word_freq('https://www.gutenberg.org/files/10/10-h/10-h.htm')

frekuensi kata

Kesimpulan

Dalam tulisan ini, Anda mempelajari cara membangun pipeline Data Science untuk membuat plot distribusi frekuensi kata dalam Moby Dick, serta banyak novel lainnya. Anda mempelajari cara men-scrape novel tersebut dari situs web Project Gutenberg (korpus buku yang besar) menggunakan paket Python requests dan cara mengekstrak novel dari data web ini menggunakan BeautifulSoup. Lalu Anda langsung menganalisis novel menggunakan Natural Language ToolKit (nltk). Dalam prosesnya Anda mempelajari aspek penting Pemrosesan Bahasa Alami (NLP) seperti tokenisasi dan stopword. Sekarang Anda mampu memvisualisasikan distribusi frekuensi kata dari novel apa pun yang dapat Anda temukan di Project Gutenberg. Keterampilan NLP yang Anda kembangkan juga berlaku untuk banyak data yang dihadapi Data Scientist karena porsi terbesar data di dunia adalah data tidak terstruktur dan mencakup banyak teks.

Tulisan ini dihasilkan dari Jupyter Notebook; Anda dapat menemukannya di repositori ini. Jika Anda punya pemikiran, tanggapan, dan/atau renungan, jangan ragu menghubungi saya di twitter: @hugobowne. Beri tahu saya proyek keren apa yang Anda bangun.

Lihat tutorial DataCamp Web Scraping menggunakan Python (dan Beautiful Soup) dan Cara Menggunakan Python untuk Men-scrape Amazon.

Topik

Terkait

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R