Nltk: Tokenizer kalimat tidak membelah dengan benar

Dibuat pada 23 Nov 2015  ·  5Komentar  ·  Sumber: nltk/nltk

Saya pikir ada bug dalam tokenizer kalimat standar sent_tokenize . Masalahnya adalah, tidak memecah teks menjadi kalimat dalam kasus tertentu. Inilah kasusnya, di mana tokenizer gagal membagi teks menjadi dua kalimat:

[sent for sent in nltk.sent_tokenize('Model wears size S. Fits size.')]

Ini mengembalikan ['Model wears size S. Fits size.'] , alih-alih ['Model wears size S.', 'Fits size.'] . Masalah tampaknya muncul, ketika string terakhir sebelum . hanya berisi satu karakter. Jika jumlah karakter adalah >= 2 , maka ia akan membagi teks dengan benar.

inactive tokenizer

Komentar yang paling membantu

Hanya ingin menambahkan contoh dunia nyata dari BookCorpus , diekstrak dari "Three Plays", Diterbitkan oleh Mike Suttons di Smashwords.

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

Keluaran

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

Itu menegaskan bahwa nltk tidak mengenali k. sebagai pemisah kalimat.

Semua 5 komentar

Ini terlihat sangat sulit untuk diperbaiki dalam tokenizer kalimat jika Anda menganggap bahwa S. Fits mungkin merupakan nama depan dan nama belakang seseorang.

Saya pikir cara untuk pergi adalah dengan subclass atau copy-paste tokenizer kalimat NLTK default dan memodifikasinya agar sesuai dengan aplikasi Anda. Misalnya jika Anda tidak mengharapkan nama orang seperti itu dalam teks, maka hapus aturan yang menangani nama orang. Pilihan lain adalah menggunakan solusi seperti mengganti size <X> dengan size_<X> sebelum tokenisasi dan menggantinya kembali setelah teks dipecah menjadi kalimat.

Hmmm. Baru coba lagi. Jadi kasus pertama yang saya sajikan tidak membelah dengan benar. Tetapi jika saya menggunakan karakter yang berbeda maka terkadang terbelah! Itu sebabnya saya menulis tes cepat ini:

import nltk
import pprint

pp = pprint.PrettyPrinter(indent=4)
s = 'Test {}. Test {}.'
[nltk.sent_tokenize(s.format(char, char)) for char in 'abcdefghijklmnopqrstuvwxyz']
[pp.pprint(nltk.sent_tokenize(s.format(char, char))) for char in 'abcdefghijklmnopqrstuvwxyz']

Keluaran:

['Test a.', 'Test a.']
['Test b.', 'Test b.']
['Test c. Test c.']
['Test d. Test d.']
['Test e. Test e.']
['Test f. Test f.']
['Test g. Test g.']
['Test h. Test h.']
['Test i.', 'Test i.']
['Test j.', 'Test j.']
['Test k. Test k.']
['Test l. Test l.']
['Test m. Test m.']
['Test n. Test n.']
['Test o.', 'Test o.']
['Test p. Test p.']
['Test q.', 'Test q.']
['Test r. Test r.']
['Test s. Test s.']
['Test t. Test t.']
['Test u.', 'Test u.']
['Test v. Test v.']
['Test w. Test w.']
['Test x.', 'Test x.']
['Test y.', 'Test y.']
['Test z.', 'Test z.']

@kmike , seperti yang Anda lihat sangat tidak konsisten.

@JernejJerin Ini bukan tokenizer berbasis aturan sehingga tidak dapat mengontrol/menjelaskan "aturan" pemisahan menggunakan penjelasan seperti regex.

Algoritma yang digunakan untuk melatih sent_tokenizer adalah algoritma Kiss and Strunk (2006) punkt . Ini adalah sistem statistik yang mencoba mempelajari batas kalimat sehingga tidak sempurna tetapi konsisten dengan probabilitas yang dihasilkan dari model (tetapi tidak perlu aturan seperti manusia).

Hanya ingin menambahkan contoh dunia nyata dari BookCorpus , diekstrak dari "Three Plays", Diterbitkan oleh Mike Suttons di Smashwords.

sent_tokenize('The weather is terrible, and my day was ok. You are supposed to take your medicine.')

Keluaran

['The weather is terrible, and my day was ok. You are supposed to take your medicine.']

Itu menegaskan bahwa nltk tidak mengenali k. sebagai pemisah kalimat.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat