2010-09-09 3 views
6

thể trùng lặp:
PHP - How to split a paragraph into sentences.biểu hiện thường xuyên cho đếm câu trong một khối văn bản

Tôi có một khối văn bản mà tôi muốn để tách thành câu, những gì sẽ là cách tốt nhất để làm điều này? Tôi đã nghĩ đến việc tìm kiếm '.', '!', '?' nhân vật, nhưng tôi nhận ra có một số vấn đề với điều này, chẳng hạn như khi mọi người sử dụng từ viết tắt, hoặc kết thúc một câu với một cái gì đó như thế nào? Điều gì sẽ là cách tốt nhất để xử lý việc này? Tôi figured sẽ có một số regex có thể xử lý này, nhưng tôi mở cửa cho một giải pháp không regex nếu phù hợp với vấn đề tốt hơn.

Trả lời

2

Regex không phải là giải pháp tốt nhất cho vấn đề này. Bạn sẽ được phục vụ tốt hơn bằng cách tạo thư viện phân tích cú pháp. Một cái gì đó mà bạn dễ dàng tạo ra các khối logic để phân biệt một thứ với nhau. Bạn sẽ cần phải đưa ra một bộ quy tắc chia nhỏ văn bản thành các phần bạn muốn xem.

"Are you sure?" he asked. 

Điều đó không gây rối khi sử dụng regex? Tuy nhiên, với trình phân tích cú pháp, bạn có thể thực sự thấy

<start quote><capitalization>are you sure<question><end quote>he asked<period> 

rằng với các quy tắc đơn giản có thể nói "đó là một câu".

+1

Hoặc, khó chịu, bạn có thể nhận được những thứ như '" Bạn có chắc chắn "? anh ta hỏi.' đó là ngữ nghĩa chính xác nhưng nhìn oh quá sai. Ngoài ra, danh từ chứa dấu chấm câu cũng xấu: 'Cái nào? khuyên bạn nên mua .... ' –

+0

Trên thực tế? nên ở bên trong dấu ngoặc kép. –

1

Rất tiếc, không có giải pháp hoàn hảo nào cho điều này, vì những lý do bạn đã nêu. Nếu nó là nội dung mà bạn bằng cách nào đó có thể kiểm soát hoặc buộc một dấu phân cách được chỉ định sau mỗi câu, điều đó sẽ là lý tưởng. Ngoài ra, tất cả những gì bạn có thể làm là tìm kiếm (\.|!|?)+ và thậm chí có thể ném vào \ s sau đó vì hầu hết mọi người đệm các câu mới với 1 hoặc 2 dấu cách giữa câu trước và câu tiếp theo.

0

Tôi nghĩ rằng vấn đề lớn nhất là sự tồn tại có thể của từ viết tắt! Vì vậy, bạn phải sử dụng một cái gì đó như Prof.&nbsp;Knuth trong một bản tóm tắt JavaDoc sao cho trình tạo javadoc không nghĩ rằng câu đầu tiên kết thúc sau Prof.. Đây là một vấn đề tôi không biết làm thế nào ai có thể xử lý một cách đáng tin cậy. Giải pháp gần đúng duy nhất tôi có thể tưởng tượng là việc sử dụng từ điển viết tắt.

+0

Không có từ viết tắt nào (từ được tạo thành từ chữ viết tắt của các từ khác, ví dụ: ASAP) trong ví dụ của bạn, chỉ viết tắt (một từ được đại diện bởi tập con hàng đầu của các chữ cái thông thường). – dmckee