2013-08-24 49 views
11

Tôi cố gắng để thẻ POS một câu trong Scala sử dụng Stanford phân tích cú pháp như dưới đâygắn thẻ POS tại Scala

val lp:LexicalizedParser = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz"); 
lp.setOptionFlags("-maxLength", "50", "-retainTmpSubcategories") 
val s = "I love to play" 
val parse :Tree = lp.apply(s) 
val taggedWords = parse.taggedYield() 
println(taggedWords) 

tôi có một loại không phù hợp lỗi ; tìm thấy: java.lang.String yêu cầu: java.util.List [_ <: edu.stanford.nlp.ling.HasWord] trong dòng val phân tích cú pháp: Cây = lp.apply (s)

tôi không biết đây có phải là cách làm đúng hay không. Có cách nào khác dễ dàng hơn trong việc gắn thẻ POS một câu trong Scala không?

Trả lời

4

Tôi tìm thấy một cách rất đơn giản để làm gắn thẻ POS tại Scala

Bước 1

Tải stanford tagger phiên bản 3.2.0 thành liên kết dưới đây

http://nlp.stanford.edu/software/stanford-postagger-2013-06-20.zip

Bước 2

Thêm stanford-postagger jar hiện diện trong thư mục để dự án của bạn và cũng có thể đặt tiếng Anh-left3words-distsim.tagger tập tin có mặt trong thư mục mô hình trong dự án

Sau đó, với mã bên dưới, bạn có thể gắn thẻ một câu trong Scala

   val tagger = new MaxentTagger(
       "english-left3words-distsim.tagger") 
       val art_con = "My name is Rahul" 
       val tagged = tagger.tagString(art_con) 
       println(tagged) 

Output: My_PRP $ name_NN is_VBZ Rahul_NNP

+0

Có những ràng buộc scala làm cho nó dễ dàng hơn! mất một chút công việc để cài đặt, nhưng sau đó toàn bộ điều đó được ngưng tụ thành một dòng duy nhất. Thư viện là [ở đây] (https://github.com/gangeli/CoreNLP-Scala) –

12

Bạn có thể muốn xem xét bộ công cụ FACTORIE (http://github.com/factorie/factorie). Nó là một thư viện tổng quát cho các mô hình đồ họa và học tập tự động bao gồm một bộ các thành phần xử lý ngôn ngữ tự nhiên (tokenization, token normalization, phân tích hình thái, phân đoạn câu, gắn thẻ một phần lời nói, nhận dạng thực thể, phân tích phụ thuộc) tìm kiếm, cốt lõi).

Ngoài ra, nó được viết hoàn toàn bằng Scala và được phát hành theo Giấy phép Apache.

Tài liệu hiện đang thưa thớt nhưng sẽ cải thiện trong những tháng tới.

Ví dụ, một khi cài đặt Maven dựa trên được hoàn tất, bạn có thể gõ vào dòng lệnh:

bin/fac nlp --pos1 --parser1 --ner1 

để khởi động một máy chủ NLP đa luồng socket lắng nghe. Sau đó truy vấn nó bằng đường ống văn bản đơn giản đến số socket của nó:

echo "Mr. Jones took a job at Google in New York. He and his Australian wife moved from New South Wales on 4/1/12." | nc localhost 3228 

Kết quả là sau đó

1  1  Mr.    NNP  2  nn  O 
2  2  Jones   NNP  3  nsubj U-PER 
3  3  took   VBD  0  root O 
4  4  a    DT  5  det  O 
5  5  job    NN  3  dobj O 
6  6  at    IN  3  prep O 
7  7  Google   NNP  6  pobj U-ORG 
8  8  in    IN  7  prep O 
9  9  New    NNP  10  nn  B-LOC 
10  10  York   NNP  8  pobj L-LOC 
11  11  .    .  3  punct O 

12  1  He    PRP  6  nsubj O 
13  2  and    CC  1  cc  O 
14  3  his    PRP$ 5  poss O 
15  4  Australian  JJ  5  amod U-MISC 
16  5  wife   NN  6  nsubj O 
17  6  moved   VBD  0  root O 
18  7  from   IN  6  prep O 
19  8  New    NNP  9  nn  B-LOC 
20  9  South   NNP  10  nn  I-LOC 
21  10  Wales   NNP  7  pobj L-LOC 
22  11  on    IN  6  prep O 
23  12  4/1/12   NNP  11  pobj O 
24  13  .    .  6  punct O 

Tất nhiên có một API chương trình đối với tất cả các chức năng này là tốt.

import cc.factorie._ 
import cc.factorie.app.nlp._ 
val doc = new Document("Education is the most powerful weapon which you can use to change the world.") 
DocumentAnnotatorPipeline(pos.POS1).process(doc) 
for (token <- doc.tokens) 
    println("%-10s %-5s".format(token.string, token.posLabel.categoryValue)) 

chí đầu ra:

Education NN 
is   VBZ 
the  DT 
most  RBS 
powerful JJ 
weapon  NN 
which  WDT 
you  PRP 
can  MD 
use  VB 
to   TO 
change  VB 
the  DT 
world  NN 
.   .  
+0

Tôi chỉ cần thêm factorie-1.0.0-M6.jar để build path và nó hiển thị lỗi "không tìm thấy: giá trị DocumentAnnotatorPipeline" trên dòng DocumentAnnotatorPipeline. quy trình (pos.POS1, doc). Tôi có cần thêm bất kỳ lọ nào khác để làm cho nó hoạt động không? – yAsH

+0

Bạn cần phiên bản tiên tiến từ GitHub. Chúng tôi hy vọng sẽ tạo một cột mốc quan trọng trong một vài tuần nữa. – mccallum

0

tôi tin rằng các API của Stanford Parser đã thay đổi phần nào, vì nó làm đôi. apply có chữ ký, public Tree apply(java.util.List<? extends HasWord> words) và đây là những gì bạn thấy trong thông báo lỗi.

Điều bạn nên sử dụng bây giờ là parse, có chữ ký public Tree parse(java.lang.String sentence).

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