English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

tamu
1 / ?
kembali ke pelajaran

Selamat Datang

Selamat datang ke pelajaran NLP langsung.

Anda akan membangun stemmer bahasa Inggris yang berfungsi dari awal: algoritma yang mengurangi kata-kata menjadi bentuk akarnya.

Pada akhirnya, Anda akan memiliki algoritma nyata yang teruji yang mengubah kata-kata seperti runningrun, happinesshappi, & organizationalorgan.

Anda juga akan menulis unit test, integration test, dan functional test untuk stemmer Anda: karena algoritma yang tidak diuji hanya sebuah tebakan.

Apa Itu Stemming?

Masalahnya

Mesin pencari menghadapi masalah mendasar: seorang pengguna mencari "running" tetapi dokumen berisi "run" atau "runs" atau "runner". Semua ini adalah konsep yang sama: tetapi mereka adalah string yang berbeda.


Stemming mengurangi kata-kata yang mengalami infleksi menjadi bentuk dasar umum (stem). Tidak perlu menjadi kata nyata: hanya perlu konsisten.


KataStem
runningrun
runsrun
runnerrunner
happinesshappi
happilyhappi
happyhappi

Perhatikan bahwa happi bukanlah kata bahasa Inggris yang nyata. Tidak masalah. Stemming adalah tentang pengelompokan, bukan makna. Selama happiness, happily, & happy semuanya runtuh menjadi stem yang sama, pencarian & pengambilan kembali meningkat.

Stemming: Banyak Bentuk Runtuh menjadi Satu Stem, Meningkatkan Hasil Pencarian

Dengan kata-kata Anda sendiri, jelaskan mengapa mesin pencari yang menggunakan stemming akan mengembalikan hasil yang lebih baik daripada yang hanya cocok dengan string yang tepat. Berikan contoh konkret.

Zellig Harris dan Analisis Distribusional

Asal mula stemming komputasional

Pada tahun 1955, ahli bahasa Zellig Harris menerbitkan From Phoneme to Morpheme, menggambarkan metode untuk menemukan batas-batas antara unit-unit bermakna (morfem) dalam kata-kata.


Wawasannya adalah distribusional: jika Anda melihat corpus bahasa Inggris yang besar, batas antara stem & akhiran muncul sebagai sinyal statistik.


Metode successor variety

Untuk setiap awalan kata, hitunglah berapa banyak karakter berbeda yang mengikutinya dalam corpus. Harris menyebut ini successor variety.


Pertimbangkan awalan "work" dalam corpus yang berisi: worked, worker, working, works, workshop.


AwalanApa yang mengikutiSuccessor Variety
wo1
wor1
work1
worke, i, s, sh4
worked, r2

Setelah "work", empat karakter berbeda dapat mengikuti: lonjakan dalam varietas. Lonjakan itu menandai batas morfem. Stem adalah work dan segalanya setelahnya adalah akhiran.


Ini radikal pada tahun 1955. Tidak ada aturan linguistik, tidak ada kamus: hanya menghitung. Harris menunjukkan bahwa struktur bahasa mengungkapkan dirinya melalui distribusi.

Harris Successor Variety: Lonjakan pada 'work' menandai batas morfem

Memahami Successor Variety

Metode Harris bekerja pada bahasa apa pun. Anda tidak perlu tahu tata bahasanya: statistik mengungkapkan batas-batas morfem.


Dalam praktiknya, successor variety murni memerlukan corpus besar dan deteksi puncak yang hati-hati. Peneliti kemudian: Lovins (1968), Porter (1980): menyederhanakan pendekatan menjadi penghilangan akhiran berbasis aturan: bukan menghitung successor variety dari corpus, mereka mengkodekan aturan akhiran secara langsung.


Hari ini Anda akan membangun penghilang akhiran berbasis aturan yang terinspirasi oleh wawasan Harris. Anda akan mendefinisikan akhiran secara eksplisit, kemudian menghilangkannya dari kata-kata. Ini adalah cara kebanyakan stemmer produksi bekerja.

Apa wawasan utama dari metode successor variety Harris? Dengan kata lain, sinyal statistik apa yang memberi tahu Anda di mana batas morfem berada?

Penghilang Akhiran Pertama Anda

Mari kita buat kode

Mulai sederhana. Tulis fungsi yang disebut stem yang mengambil kata & menghilangkan akhiran-akhiran ini (dalam urutan ini):


1. -ing (running → runn)

2. -ed (walked → walk)

3. -ly (quickly → quick)

4. -s (cats → cat)


Aturan:

- Konversi kata menjadi huruf kecil terlebih dahulu

- Hanya hapus satu akhiran (kecocokan pertama dalam urutan di atas)

- Hanya hapus jika stem yang tersisa setidaknya 3 karakter panjang

- Kembalikan stem


Contoh:

def stem(word):
    word = word.lower()
    # your suffix stripping logic here
    return word
Tulis fungsi `stem`. Itu harus menghilangkan -ing, -ed, -ly, atau -s (kecocokan pertama, dalam urutan) dari kata, tetapi hanya jika stem yang tersisa memiliki 3 atau lebih karakter. Uji dengan mencetak stem('running'), stem('walked'), stem('quickly'), & stem('cats').

Menangani Kasus Tepi

Membuat stemmer lebih pintar

Penghilang dasar Anda memiliki masalah: runningrunn & hopinghop. Kami memerlukan dua penyempurnaan:


1. Pembersihan konsonan ganda: jika menghilangkan -ing atau -ed meninggalkan konsonan ganda di akhir (seperti runn), hapus huruf terakhir → run

2. Pemulihan e diam: jika menghilangkan -ing meninggalkan stem berakhir dengan konsonan (bukan vokal), & aslinya mungkin memiliki e diam (seperti hop dari hoping), tambahkan kembali ehope


Untuk aturan e diam, sederhanakan: jika setelah menghilangkan -ing, stem adalah 3+ karakter, berakhir dengan konsonan, & karakter kedua-terakhir adalah vokal (pola seperti hop, mak, tak), tambahkan e kembali.


Juga tambahkan akhiran baru ini (periksa sebelum -ing, -ed, -ly, -s):

5. -tion (organization → organiza)

6. -ness (happiness → happi)

7. -ment (movement → move)

8. -able (readable → read)

9. -ible (sensible → sens)


Prioritas akhiran yang diperbarui: -tion, -ness, -ment, -able, -ible, -ing, -ed, -ly, -s


Pertahankan aturan panjang stem minimum: hanya hapus jika stem yang tersisa adalah 3+ karakter.

Perbarui fungsi `stem` Anda dengan akhiran baru, pembersihan konsonan ganda, & pemulihan e diam. Cetak hasil untuk: stem('running'), stem('hoping'), stem('happiness'), stem('organization'), stem('readable').

Aturan -ies & -ier

Lebih banyak morfologi

Bahasa Inggris memiliki pola umum lainnya: kata-kata yang diakhiri dengan -y berubah menjadi -ies, -ied, atau -ier ketika fleksi.


KataHarus stem ke
babiesbabi
carriedcarri
earlierearli
fliesfli
studiedstudi

Tambahkan aturan-aturan ini sebelum pemeriksaan -s & -ed:

- -ies → hapus & tambahkan i (babies → babi)

- -ied → hapus & tambahkan i (carried → carri)

- -ier → hapus & tambahkan i (earlier → earli)


Aturan panjang stem minimum yang sama: hanya ubah jika hasilnya adalah 3+ karakter.

Tambahkan aturan -ies, -ied, & -ier ke fungsi stem Anda. Cetak hasil untuk: stem('babies'), stem('carried'), stem('earlier'), stem('happiness'), stem('running').

Mengapa Menguji?

Pengujian bukan opsional

Anda memiliki stemmer yang berfungsi. Bagaimana Anda tahu bahwa itu benar-benar berfungsi? Sekarang, Anda menjalankan beberapa contoh dengan tangan. Itu tidak berskala.


Perangkat lunak profesional menggunakan tiga tingkat pengujian:


Unit test: uji satu fungsi secara terisolasi dengan input yang diketahui dan output yang diharapkan. Cepat, banyak, spesifik.


Integration test: uji bahwa beberapa komponen bekerja bersama. Untuk stemmer, ini berarti menguji terhadap sekelompok kata dan memverifikasi hasilnya konsisten.


Functional test: uji sistem dari luar, seperti yang dilakukan pengguna. Untuk stemmer, ini berarti memberinya teks nyata dan memverifikasi output masuk akal untuk kasus penggunaan nyata seperti pencarian.


Anda akan menulis ketiganya.

Tiga Tingkat Pengujian: Piramida Test Unit, Integration, dan Functional

Tulis Unit Test

Unit test

Tulis fungsi yang disebut run_unit_tests yang menguji fungsi stem Anda dengan setidaknya 15 kasus pengujian yang mencakup:


1. Penghilangan akhiran dasar: kata yang diakhiri -ing, -ed, -ly, -s

2. Akhiran kompleks: -tion, -ness, -ment, -able, -ible

3. Infleksi Y: -ies, -ied, -ier

4. Kasus tepi: kata pendek yang tidak boleh dihilangkan, kata tanpa akhiran, kata-kata yang sudah di-stem

5. Pembersihan konsonan ganda: running → run, sitting → sit

6. Pemulihan e diam: hoping → hope

7. Ketidakpekaan kasus: input huruf besar harus diubah menjadi huruf kecil


Strukturkan tes Anda seperti ini:

def run_unit_tests():
    tests = [
        ('running', 'run'),
        ('cats', 'cat'),
        # ... at least 15 test cases
    ]
    passed = 0
    failed = 0
    for word, expected in tests:
        result = stem(word)
        if result == expected:
            passed += 1
        else:
            failed += 1
            print(f'FAIL: stem({word}) = {result}, expected {expected}')
    print(f'{passed}/{passed + failed} unit tests passed')
    return failed == 0
Sertakan fungsi `stem` lengkap Anda DAN tulis `run_unit_tests` dengan setidaknya 15 kasus pengujian yang mencakup semua 7 kategori di atas. Panggil `run_unit_tests()` di akhir.

Tulis Integration Test

Integration test

Unit test memverifikasi input individual. Integration test memverifikasi bahwa komponen bekerja dengan benar bersama-sama.


Untuk stemmer, properti integrasi utama adalah konsistensi: jika Anda stem kata yang sama dua kali, Anda mendapatkan hasil yang sama. Dan kata-kata yang harus dikelompokkan bersama harus menghasilkan stem yang sama.


Tulis fungsi yang disebut run_integration_tests yang menguji:


1. Idempotency: stemming kata yang sudah di-stem harus mengembalikan stem yang sama. stem(stem(word)) == stem(word) untuk semua kata.

2. Pengelompokan: kata-kata yang harus berbagi stem benar-benar melakukannya. Uji setidaknya 3 keluarga kata (misalnya, run/runs/running/runner harus semuanya berbagi stem).

3. Pemrosesan batch: memproses daftar 20+ kata dan verifikasi tidak ada crash, tidak ada string kosong, tidak ada nilai None.


def run_integration_tests():
    # Test 1: idempotency
    # Test 2: word family grouping
    # Test 3: batch stability
    ...
Sertakan fungsi `stem` Anda & tulis `run_integration_tests` dengan semua tiga kategori tes. Panggil di akhir.

Tulis Functional Test

Functional test

Functional test memverifikasi sistem bekerja untuk kasus penggunaan yang ditujukan. Stemmer Anda ada untuk meningkatkan pencarian: jadi uji itu.


Tulis fungsi yang disebut run_functional_tests yang:


1. Simulasi pencarian: diberikan daftar string dokumen dan kata pertanyaan, stem baik dokumen maupun pertanyaan, kemudian periksa apakah istilah pertanyaan yang di-stem muncul dalam dokumen yang di-stem. Uji bahwa mencari 'running' menemukan dokumen yang berisi 'run' dan 'runner'.

2. Periksa presisi: verifikasi bahwa stemming TIDAK secara tidak benar mengelompokkan kata-kata yang tidak terkait. 'university' dan 'universe' mungkin berbagi stem: periksa apakah stemmer Anda menangani ini (tidak apa-apa jika itu mengelompokkannya; dokumentasikan perilakunya).

3. Pemrosesan teks nyata: stem setiap kata dalam paragraf teks bahasa Inggris nyata. Verifikasi output masuk akal: tidak ada string kosong, tidak ada crash, output memiliki jumlah kata yang sama dengan input.


def run_functional_tests():
    # Test 1: search finds related documents
    # Test 2: precision: check over-stemming
    # Test 3: real paragraph processing
    ...
Sertakan fungsi `stem` Anda & tulis `run_functional_tests` dengan semua tiga kategori tes. Panggil di akhir.

Apa Yang Anda Bangun

Apa yang Anda bangun

Anda mengimplementasikan stemmer bahasa Inggris yang berfungsi dengan:

- 12 aturan akhiran (-tion, -ness, -ment, -able, -ible, -ies, -ied, -ier, -ing, -ed, -ly, -s)

- Pembersihan konsonan ganda

- Pemulihan e diam

- Unit test, integration test, & functional test


Keturunannya

Stemmer Anda mewarisi dari garis kerja yang dimulai dengan Zellig Harris pada tahun 1955:


- Harris (1955): Menemukan bahwa batas-batas morfem muncul sebagai sinyal statistik (successor variety)

- Lovins (1968): Algoritma stemming pertama yang dipublikasikan, 294 aturan akhiran

- Porter (1980): Disederhanakan menjadi ~60 aturan dalam 5 langkah, menjadi standar selama beberapa dekade

- Snowball (2001): Kerangka Porter digeneralisir ke berbagai bahasa

- Stemmer Anda (hari ini): 12 aturan, prinsip inti yang sama


Apa yang bisa Anda lakukan selanjutnya

- Implementasikan algoritma Porter lengkap (itu didokumentasikan dengan baik & latihan yang bagus)

- Portkan stemmer Anda ke C untuk peningkatan kecepatan 100x

- Bangun mesin pencari sederhana yang menggunakan stemmer Anda untuk mengindeks & menanyakan file teks

- Bandingkan output stemmer Anda dengan PorterStemmer NLTK untuk mengukur akurasi


Kode yang Anda tulis hari ini adalah operasi fundamental yang sama yang berjalan di dalam setiap mesin pencari di planet ini. Tidak buruk untuk pekerjaan sehari.

Keturunan Stemmer: Harris 1955 melalui Snowball 2001

Renungkan apa yang Anda bangun. Apa hal paling mengejutkan yang Anda pelajari? Jika Anda akan meningkatkan stemmer Anda, apa yang akan Anda tambahkan atau ubah?