2015-02-23 12 views
12

Trình mã thông báo mặc định của NLTK, nltk.word_tokenizer, chuỗi hai mã thông báo, một trình thông báo câu và sau đó một trình mã thông báo từ hoạt động trên các câu. Nó làm một công việc khá tốt ngoài hộp.Làm cách nào để sử dụng trình mã thông báo mặc định của NLTK để có được các nhịp thay vì chuỗi?

>>> nltk.word_tokenize("(Dr. Edwards is my friend.)") 
['(', 'Dr.', 'Edwards', 'is', 'my', 'friend', '.', ')'] 

Tôi muốn sử dụng cùng một thuật toán này ngoại trừ việc giải thuật này trả về số lượng bù trừ vào chuỗi gốc thay vì mã thông báo chuỗi.

Bằng cách bù đắp, tôi có nghĩa là 2-ples có thể đóng vai trò như chỉ mục trong chuỗi gốc. Ví dụ ở đây tôi muốn có

>>> s = "(Dr. Edwards is my friend.)" 
>>> s.token_spans() 
[(0,1), (1,4), (5,12), (13,15), (16,18), (19,25), (25,26), (26,27)] 

vì s [0: 1] là "(", s [1: 4] là "Tiến sĩ" và vân vân

Có NLTK duy nhất. gọi đó là thực hiện điều này, hay tôi phải viết bù đắp số học của riêng tôi?

+0

Ý của bạn là "bù đắp". Có thể chỉ số chuỗi trên danh sách? ví dụ: 'Dr.' là chỉ số 1 .. – felipsmartins

+0

Được chỉnh sửa để làm rõ ý tôi là bằng cách bù đắp. –

Trả lời

7

Vâng, hầu hết Tokenizers trong NLTK có một phương pháp gọi là span_tokenize nhưng tiếc là Tokenizer bạn đang sử dụng thì không.

Theo mặc định, word_tokenize chức năng uses a TreebankWordTokenizer. Tổ hợp TreebankWordTokenizer ementation có khá mạnh mẽ implementation nhưng hiện tại nó thiếu một triển khai cho một phương pháp quan trọng, span_tokenize.

Tôi thấy không thực hiện span_tokenize cho số TreebankWordTokenizer vì vậy tôi tin rằng bạn sẽ cần phải triển khai của riêng bạn. Phân lớp TokenizerI có thể làm cho quá trình này phức tạp hơn một chút.

Bạn có thể tìm thấy phương pháp span_tokenizePunktWordTokenizer hữu ích dưới dạng starting point.

Tôi hy vọng thông tin này sẽ hữu ích.

+1

Tôi đã bỏ qua một phiên bản ba giây ở đây: https://gist.github.com/ckoppelman/c93e4192d9f189fba590e095258f8f33. Bất kỳ giúp đỡ hoặc tư vấn được đánh giá cao – Charles

Các vấn đề liên quan