2010-10-03 36 views
6

Tôi tự hỏi làm thế nào bạn sẽ đi về tokenizing chuỗi bằng tiếng Anh (hoặc các ngôn ngữ phương Tây khác) nếu whitespaces đã được gỡ bỏ?Justadistraction: tokenizing tiếng Anh không có khoảng trắng. Murakami SheepMan

Cảm hứng cho câu hỏi là nhân vật Cừu Man trong cuốn tiểu thuyết Murakami 'Dance Dance Dance'

Trong tiểu thuyết, Man Cừu được dịch là nói những câu như:

"likewesaid, chúng tôi Hãy cố gắng kết nối với anh, "Sheep Man nói. "Butwecan'tdoit-alone. Yougottaworktoo."

Vì vậy, một số dấu chấm câu được lưu giữ, nhưng không phải tất cả. Đủ cho một người đọc, nhưng phần nào tùy ý.

Chiến lược của bạn để xây dựng trình phân tích cú pháp cho điều này là gì? Sự kết hợp thông thường của các chữ cái, số âm tiết, ngữ pháp có điều kiện, nhìn về phía trước/phía sau regexps vv?

Cụ thể, python-wise, bạn sẽ cấu trúc luồng dịch (tha thứ) như thế nào? Không yêu cầu một câu trả lời hoàn chỉnh, chỉ cần nhiều hơn như thế nào quá trình suy nghĩ của bạn sẽ đi về phá vỡ vấn đề xuống.

Tôi hỏi điều này một cách phù phiếm, nhưng tôi nghĩ đó là câu hỏi có thể nhận được một số câu trả lời thú vị (nlp/crypto/tần số/xã hội). Cảm ơn!

Trả lời

3

Tôi thực sự đã làm một việc như thế này cho công việc khoảng tám tháng trước. Tôi chỉ sử dụng một từ điển của các từ tiếng Anh trong một hashtable (cho O (1) tra cứu lần). Tôi sẽ gửi thư bằng thư phù hợp với toàn bộ từ. Nó hoạt động tốt, nhưng có rất nhiều sự mơ hồ. (asshit có thể là ass hit hoặc như shit). Để giải quyết những sự mơ hồ đó sẽ yêu cầu phân tích ngữ pháp phức tạp hơn nhiều.

+0

Bạn có thể thử một cây radix về lá thư bằng tra cứu thư. Nó cũng sẽ cho phép bạn dễ dàng biết nếu có các trận đấu tiềm năng dài hơn. – Olson

+1

Ồ, wow. Tôi đã nghĩ về một cái gì đó như thế (một cây với 26 đứa trẻ trên mỗi nút, là suy nghĩ của tôi), nhưng ông chủ của tôi nói đó là một ý tưởng lố bịch. Tôi phải ngừng nghe anh ta. > :( – JoshD

+0

+1 Tôi đã thực sự nghĩ về một cái gì đó như thế này một thời gian trước đây.Tôi thậm chí chạy vào cùng một vấn đề: "hi there" == "hithere" == "nhấn ở đây". "Để có được cô ấy" == " cùng nhau "==" với nhau ". – inspectorG4dget

2

Trước hết, tôi nghĩ bạn cần từ điển từ tiếng Anh - bạn có thể thử một số phương pháp chỉ dựa vào một số phân tích thống kê, nhưng tôi nghĩ từ điển có cơ hội tốt hơn.

Một khi bạn có các từ, bạn có hai cách tiếp cận có thể:

Bạn có thể phân loại các từ thành các loại ngữ pháp và sử dụng một ngữ pháp chính thức để phân tích câu - rõ ràng, đôi khi bạn sẽ nhận được không phù hợp hoặc nhiều trận đấu - Tôi không quen với các kỹ thuật mà sẽ cho phép bạn nới lỏng các quy tắc ngữ pháp trong trường hợp không khớp, nhưng tôi chắc chắn phải có một số.

Mặt khác, bạn chỉ có thể lấy một số văn bản tiếng Anh lớn và tính toán xác suất tương đối của các từ nhất định ở bên cạnh nhau - nhận danh sách cặp và ba từ. Vì cấu trúc dữ liệu đó sẽ khá lớn, bạn có thể sử dụng các loại từ (ngữ pháp và/hoặc dựa trên ý nghĩa) để đơn giản hóa nó. Sau đó, bạn chỉ cần xây dựng một automaton và chọn chuyển tiếp có thể xảy ra nhất giữa các từ.

Tôi chắc chắn có nhiều cách tiếp cận khả thi hơn. Bạn thậm chí có thể kết hợp cả hai tôi đã đề cập, xây dựng một số loại ngữ pháp với trọng lượng gắn liền với các quy tắc của nó. Đó là một lĩnh vực phong phú để thử nghiệm.

1

Đây chỉ là một số mã nhanh mà tôi đã viết ra rằng tôi nghĩ rằng sẽ hoạt động khá tốt để trích xuất các từ từ đoạn trích như đoạn bạn đã đưa ra ... Không hoàn toàn suy nghĩ, nhưng tôi nghĩ rằng bạn không thể tìm thấy một loại đóng gói sẵn dung dịch

textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo." 

indiv_characters = list(textstring) #splits string into individual characters 

teststring = '' 
sequential_indiv_word_list = [] 

for cur_char in indiv_characters: 
    teststring = teststring + cur_char 
    # do some action here to test the testsring against an English dictionary where you can API into it to get True/False if it exists as an entry 
    if in_english_dict == True: 
     sequential_indiv_word_list.append(teststring) 
     teststring = '' 

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word 

có một số vấn đề nhiều hơn để được làm việc ra, chẳng hạn như nếu nó không bao giờ trả về một trận đấu, điều này sẽ rõ ràng không làm việc vì nó sẽ không bao giờ phù hợp nếu nó chỉ cần tiếp tục bổ sung thêm nhiều ký tự, tuy nhiên vì chuỗi demo của bạn có một số khoảng trống, bạn có thể nhận ra các ký tự này và tự động bắt đầu lại ở mỗi ký tự này.

Ngoài ra bạn cần phải giải thích cho dấu chấm câu, viết điều kiện như

if cur_char == ',' or cur_char =='.': 
    #do action to start new "word" automatically 
Các vấn đề liên quan