2012-02-15 36 views
8

Trình phân tích cú pháp Stanford hiện 'an toàn chủ đề' kể từ version 2.0 (02.03.2012). Tôi hiện đang chạy các công cụ dòng lệnh và không thể tìm ra cách sử dụng nhiều lõi của tôi bằng cách luồng chương trình.Stanford Parser sử dụng đa luồng

Trong quá khứ, câu hỏi này đã được trả lời bằng "Stanford Parser không an toàn cho luồng", vì Câu hỏi thường gặp vẫn cho biết. Tôi hy vọng sẽ tìm thấy một người đã thành công trong việc truyền tải phiên bản mới nhất.

Tôi đã thử sử dụng -t cờ (-t10 và -tLLP) vì đó là tất cả những gì tôi có thể tìm thấy trong tìm kiếm của mình, nhưng cả hai đều ném lỗi.

Một ví dụ về một lệnh tôi đưa ra là:

java -cp stanford-parser.jar edu.stanford.nlp.parser.lexparser.LexicalizedParser \ 
-outputFormat "oneline" ./grammar/englishPCFG.ser.gz ./corpus > corpus.lex 

Trả lời

16

Bắt đầu với phiên bản 2.0.5, bạn có thể dễ dàng sử dụng nhiều chủ đề với các tùy chọn -nthreads k. Ví dụ, lệnh của bạn có thể như thế này:

java -mx6g edu.stanford.nlp.parser.lexparser.LexicalizedParser -nthreads 4 edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz file.txt > file.stp 

(phiên bản của phiên bản 2 trước đến năm 2013 không có cách nào để cho phép đa luồng từ dòng lệnh, nhưng chỉ khi sử dụng API.)

nội , bạn có thể chạy đồng thời nhiều chuỗi phân tích cú pháp bên trong một quá trình JVM như bạn muốn. Bạn có thể làm điều này bằng cách nhận và sử dụng nhiều đối tượng LexicalizedParserQuery (thông qua phương thức parserQuery()) hoặc ngầm bằng cách gọi apply(...) hoặc parseTree(...) tắt một LexicalizedParser. Tùy chọn -nthreads k thực hiện điều này cho bạn bằng cách gửi các câu liên tiếp đến các trình phân tích cú pháp khác nhau bằng cách sử dụng khung công tác Executor. Bạn cũng có thể đồng thời tạo nhiều LexicalizedParser, ví dụ: để phân tích các ngôn ngữ khác nhau.

Nhiều đối tượng LexicalizedparserQuery chia sẻ cùng một ngữ pháp (LexicalizedParser), nhưng tiết kiệm không gian bộ nhớ không lớn, vì phần lớn bộ nhớ chuyển đến cấu trúc tạm thời được sử dụng trong phân tích biểu đồ. Vì vậy, nếu bạn đang chạy nhiều chuỗi phân tích cú pháp đồng thời, bạn sẽ cần phải cung cấp nhiều bộ nhớ cho JVM, như trong ví dụ trên.

p.s. Rất tiếc, có, một số tài liệu vẫn cần cập nhật. Nhưng -tLPP là một cờ để chỉ định các tài nguyên cụ thể về ngôn ngữ. Trình phân tích cú pháp Stanford không có cờ -t.

+1

Xin chào, tôi muốn lập trình với API thay vì sử dụng dòng lệnh. Bạn có nghĩa là không cần phải tách kho văn bản theo cách thủ công và LexicalizedParser sẽ xử lý việc chia tách và kết hợp công việc? vì vậy đa luồng là minh bạch cho các lập trình viên? – Matt

+3

Nó không minh bạch. Nó có nghĩa là bạn có thể gọi các phương thức parseTree() hoặc apply() của LexicalizedParser trên các câu khác nhau cùng một lúc và nó sẽ hoạt động chính xác, trong khi nó không được sử dụng trước phiên bản 2.0. Làm thế nào bạn làm những việc sau đó là tùy thuộc vào bạn, nhưng cách Java hiện đại rõ ràng sẽ không chia nhỏ kho văn bản nhưng thiết lập một dịch vụ Executor và có một loạt các trình phân tích cú pháp của Executor đang chạy đồng thời. –

+0

cảm ơn, tôi đã xem khóa học trực tuyến NLP của bạn. Điều đó cũng giúp ích rất nhiều! Sự tôn trọng. – Matt