2012-03-12 38 views
11

Tôi có hơn 30.000 bài viết bằng tiếng Pháp trong một tệp JSON. Tôi muốn thực hiện một số phân tích văn bản trên cả hai bài viết riêng lẻ và trên toàn bộ tập hợp. Trước khi tôi đi xa hơn, tôi bắt đầu với tiêu chí đơn giản:Làm cách nào để gắn thẻ và đoạn văn bản tiếng Pháp bằng NLTK và Python?

  • Xác định các đối tượng quan trọng (người, địa điểm, khái niệm)
  • Tìm những thay đổi đáng kể trong tầm quan trọng (~ = tần số) của các đơn vị theo thời gian (sử dụng số thứ tự bài viết như là một proxy cho thời gian)

các bước tôi đã lấy cho đến nay:

  1. nhập dữ liệu vào một danh sách python:

    import json 
    json_articles=open('articlefile.json') 
    articlelist = json.load(json_articles) 
    
  2. chọn một bài báo duy nhất để kiểm tra, và nối phần nội dung vào một chuỗi duy nhất:

    txt = ' '.join(data[10000]['body']) 
    
  3. Loaded một câu tokenizer Pháp và chia chuỗi thành một danh sách các câu:

    nltk.data.load('tokenizers/punkt/french.pickle') 
    tokens = [french_tokenizer.tokenize(s) for s in sentences] 
    
  4. Đã cố gắng chia các câu thành các từ bằng cách sử dụng WhiteSpaceTokenizer:

    from nltk.tokenize import WhitespaceTokenizer 
    wst = WhitespaceTokenizer() 
    tokens = [wst.tokenize(s) for s in sentences] 
    

Đây là nơi tôi đang gặp khó khăn, vì những lý do sau đây:

  • NLTK không có một built-in tokenizer mà có thể chia nhỏ thành các từ tiếng Pháp. Không gian trắng không hoạt động tốt, đặc biệt là do thực tế nó sẽ không tách biệt chính xác trên các dấu nháy đơn.
  • Ngay cả khi tôi sử dụng cụm từ thông dụng để tách thành từng từ, không có trình gắn thẻ PoS của Pháp (phần lời nói) mà tôi có thể sử dụng để gắn thẻ những từ đó và không có cách nào để tách chúng thành các đơn vị logic có nghĩa là

Đối với tiếng Anh, tôi có thể tag và đoạn văn bản như sau:

tagged = [nltk.pos_tag(token) for token in tokens] 
    chunks = nltk.batch_ne_chunk(tagged) 

tùy chọn chính của tôi (theo thứ tự ưu tiên hiện nay) dường như là:

  1. Sử dụng nltk-trainer để đào tạo người gắn thẻ và chunker của riêng tôi.
  2. Sử dụng trình bao bọc python cho TreeTagger chỉ cho phần này, vì TreeTagger đã có thể gắn thẻ tiếng Pháp và một người nào đó đã viết một trình bao bọc gọi là nhị phân TreeTagger và phân tích kết quả.
  3. Sử dụng một công cụ hoàn toàn khác.

Nếu tôi phải làm (1), tôi hình dung rằng tôi sẽ cần tạo kho dữ liệu được gắn thẻ của riêng mình. Điều này có đúng không, hoặc có thể (và đã được nhận) để sử dụng Treebank của Pháp không?

Nếu định dạng tập tin Treebank của Pháp (example here) không phù hợp để sử dụng với nltk-trainer, có khả thi để chuyển đổi thành định dạng như vậy không?

Phương pháp tiếp cận nào có người dùng nói tiếng Pháp của NLTK được đưa đến thẻ PoS và văn bản đoạn văn?

Trả lời

4

Dưới đây là một số gợi ý:

  1. WhitespaceTokenizer là làm những gì nó có nghĩa là. Nếu bạn muốn chia nhỏ trên dấu nháy đơn, hãy thử WordPunctTokenizer, xem các trình mã thông báo có sẵn khác hoặc cuộn mã thông báo của riêng bạn bằng trình xác thực Regexp hoặc trực tiếp với mô-đun re.

  2. Đảm bảo bạn đã giải quyết vấn đề mã hóa văn bản (unicode hoặc latin1), nếu không mã thông báo sẽ vẫn bị lỗi.

  3. Nltk chỉ đi kèm với trình gắn thẻ tiếng Anh, như bạn đã khám phá. Nghe có vẻ như sử dụng TreeTagger sẽ là công việc ít nhất, vì nó gần như đã sẵn sàng để sử dụng.

  4. Đào tạo của riêng bạn cũng là một lựa chọn thực tế. Nhưng bạn chắc chắn không nên tạo tập tài liệu đào tạo của riêng mình! Sử dụng kho dữ liệu được gắn thẻ hiện có của tiếng Pháp. Bạn sẽ nhận được kết quả tốt nhất nếu thể loại văn bản đào tạo khớp với tên miền của bạn (bài viết). Ngoài ra, bạn có thể sử dụng nltk-trainer nhưng bạn cũng có thể sử dụng các tính năng NLTK trực tiếp.

  5. Bạn có thể sử dụng kho tài liệu Treebank của Pháp để đào tạo, nhưng tôi không biết liệu có người đọc biết định dạng chính xác của nó hay không. Nếu không, bạn phải bắt đầu với XMLCorpusReader và phân lớp nó để cung cấp một phương thức tagged_sents().

  6. Nếu bạn chưa có trong danh sách gửi thư của người dùng nltk, tôi nghĩ bạn sẽ muốn tham gia.

+1

+1 WordPunctTokenizer. Nếu có một Treebank của Pháp, thì đó có thể là một nguồn tài nguyên tuyệt vời để đào tạo một người gắn thẻ pos. Và nếu nó đòi hỏi phải tạo một trình đọc tập tin tùy chỉnh, thì tôi chắc chắn NLTK sẽ rất vui khi đưa nó vào. Khi bạn đã thực hiện điều đó, nltk-trainer hỗ trợ chỉ định một trình đọc tập tin tùy chỉnh. – Jacob

+0

Cảm ơn Alexis và Jacob. Tôi không biết một tập hợp được gắn thẻ hiện có của tiếng Pháp, vì vậy tôi có thể sẽ thử TreeTagger trước. Như bạn nói, nó có thể dễ dàng hơn việc viết một trình đọc văn bản tùy chỉnh để đọc Treebank của Pháp. Cảm ơn bạn đã đề xuất lại: danh sách gửi thư của người dùng nltk. Tôi đã đọc một số bài đăng trước đó trên lưu trữ web nhưng đã quên đăng ký. – Rahim

5

Kể từ phiên bản 3.1.0 (tháng 1 năm 2012), Stanford PoS tagger hỗ trợ tiếng Pháp.

Nó nên có thể sử dụng tagger Pháp này trong NLTK, sử dụng Nitin Madnani của Interface to the Stanford POS-tagger

Tôi đã không cố gắng này, nhưng nó có vẻ dễ dàng hơn so với các phương pháp khác mà tôi đã được xem xét, và tôi sẽ có thể để kiểm soát toàn bộ đường ống từ bên trong một tập lệnh Python. Tôi sẽ bình luận về bài viết này khi tôi có một kết quả để chia sẻ.

+0

Trình gắn thẻ PoS của Stanford có đầy đủ html thô bằng tiếng Pháp và kết hợp với các từ tiếng Anh Tôi không khuyến nghị giải pháp – c24b

+0

Trình gắn thẻ PoS của Stanford dường như không phải là cách tốt nhất về hiệu suất. Trộn Python với một JVM không thực sự là một cách bắt buộc. – toshiro92

5

Ngoài ra còn có TreeTagger (hỗ trợ tài liệu tiếng Pháp) với trình bao bọc Python. Đây là giải pháp tôi hiện đang sử dụng và nó hoạt động khá tốt.

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