Nltk: span_tokenize gagal saat kalimat berisi kutipan ganda

Dibuat pada 12 Jun 2017  ·  14Komentar  ·  Sumber: nltk/nltk

Jika kita memasukkan kalimat dengan kutip ganda ke dalam fungsi span_tokenize TreebankWordTokenizer, akan ada kesalahan. Mungkin ini karena fungsi mengirimkan input string mentah bersama dengan string yang di-tokenized ke fungsi align_tokens, tanpa mempertimbangkan bahwa fungsi tokenize akan mengganti tanda kutip ganda dengan yang lain.

bug pleaseverify

Komentar yang paling membantu

Harap perhatikan bahwa perbaikan ini masih akan memunculkan pengecualian untuk teks dengan kedua jenis tanda kutip:
nltk.TreebankWordTokenizer (). span_tokenize ('"` `')

Semua 14 komentar

Terima kasih @albertauyeung telah melaporkan masalah ini. Apakah Anda memiliki contoh di mana Anda menemui kesalahan dengan TreebankWordTokenizer.span_tokenize() ?

Apakah maksud Anda sesuatu seperti ini?

>>> from nltk.tokenize.treebank import TreebankWordTokenizer
>>> tbw = TreebankWordTokenizer
>>> tbw = TreebankWordTokenizer()
>>> s = '''This is a sentence with "quotes inside" and alsom some 'single quotes', etc.'''
>>> print(s)
This is a sentence with "quotes inside" and alsom some 'single quotes', etc.
>>> tbw.span_tokenize(s)
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/site-packages/nltk/tokenize/util.py", line 230, in align_tokens
    start = sentence.index(token, point)
ValueError: substring not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.5/site-packages/nltk/tokenize/treebank.py", line 167, in span_tokenize
    return align_tokens(tokens, text)
  File "/usr/local/lib/python3.5/site-packages/nltk/tokenize/util.py", line 232, in align_tokens
    raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
ValueError: substring "``" not found in "This is a sentence with "quotes inside" and alsom some 'single quotes', etc."

Solusi suboptimal :

>>> s = '''This is a sentence with `` quotes inside '' and alsom some 'single quotes', etc.''' 
>>> tbw.span_tokenize(s)
[(0, 4), (5, 7), (8, 9), (10, 18), (19, 23), (24, 26), (27, 33), (34, 40), (41, 43), (44, 47), (48, 53), (54, 58), (59, 66), (67, 73), (73, 74), (74, 75), (76, 79), (79, 80)]

@ Ya. Itulah kesalahan yang saya dapatkan. Saat ini sepertinya kita harus memproses kalimat sebelumnya sebelum mengirimkan ke span_tokenize.

Solusi sederhana adalah mengganti tanda kutip sebelum memanggil fungsi nltk.tokenize.util.align_tokens di https://github.com/nltk/nltk/blob/develop/nltk/tokenize/treebank.py#L147

    def span_tokenize(self, text):
        tokens = self.tokenize(text)
        tokens = ['"' if tok in ['``', "''"] else tok for tok in tokens]
        return align_tokens(tokens, text)

Setelah tambalan:

>>> from nltk.tokenize.treebank import TreebankWordTokenizer
>>> tbw = TreebankWordTokenizer()
>>> s = '''This is a sentence with "quotes inside" and alsom some 'single quotes', etc.'''
>>> print(s)
This is a sentence with "quotes inside" and alsom some 'single quotes', etc.
>>> tbw.span_tokenize(s)
[(0, 4), (5, 7), (8, 9), (10, 18), (19, 23), (24, 25), (25, 31), (32, 38), (38, 39), (40, 43), (44, 49), (50, 54), (55, 62), (63, 69), (69, 70), (70, 71), (72, 75), (75, 76)]

@albertauyeung apakah Anda ingin mencoba menambahkan tambalan dan membuat permintaan-tarik baru?

@alvations Ya, tentu. Akan melakukan!

Diperbaiki pada # 1751

Harap perhatikan bahwa perbaikan ini masih akan memunculkan pengecualian untuk teks dengan kedua jenis tanda kutip:
nltk.TreebankWordTokenizer (). span_tokenize ('"` `')

Hai @alyaxey , pengecualian apa yang Anda lihat?

Saya mengeksekusi nltk.TreebankWordTokenizer().span_tokenize('" ``') dan mendapatkan yang berikut:
[(0, 1), (2, 4)]

Maaf, saya telah memberikan kasus uji yang salah. Silakan lihat yang ini:

import nltk
print(nltk.TreebankWordTokenizer().span_tokenize('``` "'))

Output yang diharapkan adalah [(0, 2), (2, 3), (4, 5)] jika kita mengikuti logika metode tokenize saat ini. Juga [(0, 3), (4, 5)] dapat diterima.
Inilah keluaran saya untuk cabang pengembang:

Traceback (most recent call last):
  File "/Users/alyaxey/Downloads/nltk-develop/nltk/tokenize/util.py", line 254, in align_tokens
    start = sentence.index(token, point)
ValueError: substring not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    print(nltk.TreebankWordTokenizer().span_tokenize('``` "'))
  File "/Users/alyaxey/Downloads/nltk-develop/nltk/tokenize/treebank.py", line 179, in span_tokenize
    return align_tokens(tokens, text)
  File "/Users/alyaxey/Downloads/nltk-develop/nltk/tokenize/util.py", line 256, in align_tokens
    raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
ValueError: substring "`" not found in "``` ""

Saya ingin menyarankan solusi yang berbeda untuk 1) memperbaiki bug ini dan bug serupa, 2) memberikan lebih banyak fleksibilitas kepada pengguna, 3) membuat kode lebih jelas. Kita dapat menambahkan parameter boolean ke tokenize metode yang mengaktifkan atau menonaktifkan transformasi tanda kutip. Kami dapat menonaktifkan transformasi kutipan selama span_tokenize untuk menghindari manipulasi non-spasi.

Saya mengalami pengecualian dengan versi span_tokenize saat ini untuk string yang berisi tanda kurung sebelum tanda kutip. Saya yakin regex salah karena juga cocok dengan tanda kurung dan kemudian menggantikan tanda kutip di "raw_tokens" dengan tanda kurung tersebut. Atau apakah saya melewatkan sesuatu?

Contoh:

s = ' ( see 6)  Biotin " " affinity'
w_spans = TreebankWordTokenizer().span_tokenize(s) 

Pengecualian:

...
  File "/home/mp/miniconda3/envs/py36/lib/python3.6/site-packages/nltk/tokenize/treebank.py", line 179, in span_tokenize
    return align_tokens(tokens, text)
  File "/home/mp/miniconda3/envs/py36/lib/python3.6/site-packages/nltk/tokenize/util.py", line 256, in align_tokens
    raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
ValueError: substring "(" not found in " ( see 6)  Biotin " " affinity"

Perbaikan yang disarankan:
Ubah ekspresi reguler dalam span_tokenize dari r'[(``)(\'\')(")]+' menjadi r'(``)|(\'\')|(")'

Ok saya buruk, sebenarnya sudah diperbaiki di commit 4b21300999e11ba6f91952c05a936ccec0673e2e dan berjalan seperti pesona di nltk-3.3

oh, masih ada masalah di nltk-3.3

seperti ini:

File "/home/users/----/.miniconda2/lib/python2.7/site-packages/nltk/tokenize/util.py", line 258, in align_tokens
    raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
ValueError: substring "''" not found in "''Elton's been through a lot," he told The Sun newspaper."

@memeda Saya mengonfirmasi bahwa saya dapat mereproduksi bug ini. Solusinya adalah dengan menambahkan satu regex lagi untuk mencocokkan tanda kutip tunggal di awal string. Silakan lihat cabang saya di https://github.com/albertauyeung/nltk/tree/hotfix-span-tokenizer

Dikonfirmasi:

raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
ValueError: substring "enriched" not found in "The Hindu describing his Cricket, once said: `` His batting resembles very closely that of his father -dashing and carefree -and his cover-drive, a joy to watch, has amazing impetus...''And it added that he had ``enriched Madras sport as his father had''."

Hai, saya juga mengalami bug ini, misalnya terjadi pada teks berikut:

''Cosita Linda' - Lisandro (2013)\n\"El Clon (2010) .... Mohammed

Kesalahan yang dihasilkan adalah sebagai berikut:

ValueError: substring "''" not found in "''Cosita Linda' - Lisandro (2013)
"El Clon (2010) .... Mohammed"

Apakah ada pembaruan tentang masalah ini?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat