2013-08-22 43 views
9

Điều này có thể: để nhận (tương tự) chức năng nhận dạng đối tượng Stanford được đặt tên chỉ sử dụng NLTK không?Chức năng nhận diện đối tượng được đặt tên Stanford (NER) với NLTK

Có ví dụ nào không?

Cụ thể, tôi quan tâm đến việc khai thác phần LOCATION của văn bản. Ví dụ, từ văn bản

Cuộc họp sẽ được tổ chức tại 22 Tây Westin st., South Carolina, 12345 vào ngày-18

lý tưởng tôi muốn có được một cái gì đó giống như

(S 
22/LOCATION 
(LOCATION West/LOCATION Westin/LOCATION) 
st./LOCATION 
,/, 
(South/LOCATION Carolina/LOCATION) 
,/, 
12345/LOCATION 

.....

hoặc đơn giản là

22 West Westin st., South Carolina, 12345 

Thay vào đó, tôi chỉ có thể nhận được

(S 
    The/DT 
    meeting/NN 
    will/MD 
    be/VB 
    held/VBN 
    at/IN 
    22/CD 
    (LOCATION West/NNP Westin/NNP) 
    st./NNP 
    ,/, 
    (GPE South/NNP Carolina/NNP) 
    ,/, 
    12345/CD 
    on/IN 
    Nov.-18/-NONE-) 

Lưu ý rằng nếu tôi nhập văn bản của tôi vào http://nlp.stanford.edu:8080/ner/process tôi nhận được kết quả xa hoàn hảo (số đường phố và mã zip vẫn đang mất tích) nhưng ít nhất "st. " là một phần của LOCATION và South Carolina là LOCATION và không phải là một số "GPE/NNP":?

Tôi đang làm gì sai? làm thế nào tôi có thể sửa chữa nó để sử dụng NLTK để trích xuất mảnh vị trí từ một số văn bản xin vui lòng?

Rất cám ơn trước!

Trả lời

19

nltk DOES có giao diện cho Stanford NER, kiểm tra nltk.tag.stanford.NERTagger.

from nltk.tag.stanford import NERTagger 
st = NERTagger('/usr/share/stanford-ner/classifiers/all.3class.distsim.crf.ser.gz', 
       '/usr/share/stanford-ner/stanford-ner.jar') 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) 

đầu ra:

[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), 
('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), 
('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION')] 

Tuy nhiên mỗi khi bạn gọi tag, NLTK chỉ đơn giản là viết câu mục tiêu vào một tập tin và chạy công cụ Stanford NER dòng lệnh để phân tích tập tin đó và cuối cùng là phân tích đầu ra trở lại python. Do đó, chi phí của các bộ phân loại tải (khoảng 1 phút đối với tôi mỗi lần) là không thể tránh khỏi.

Nếu đó là sự cố, hãy sử dụng Pyner.

chạy đầu tiên Stanford NER như một máy chủ

java -mx1000m -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer \ 
-loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -port 9191 

sau đó đi đến pyner thư mục

import ner 
tagger = ner.SocketNER(host='localhost', port=9191) 
tagger.get_entities("University of California is located in California, United States") 
# {'LOCATION': ['California', 'United States'], 
# 'ORGANIZATION': ['University of California']} 
tagger.json_entities("Alice went to the Museum of Natural History.") 
#'{"ORGANIZATION": ["Museum of Natural History"], "PERSON": ["Alice"]}' 

Hope this helps.

+1

Bạn có biết tôi có thể đào tạo Stanford NER hay không? Tôi đã thử nó với. "Wizard of Oz rời khỏi Emerald City." và "Alexander Đại đế chinh phục Đế chế Ba Tư." Không làm việc. – Hans

+0

@edfward java chạy nó trên cổng 9191 nhưng con trăn chạy nó trên cổng 8080. Tại sao vậy? – bernie2436

+0

@ akh2103 lỗi của tôi. Tôi đã sửa chữa trong câu trả lời, họ phải nhất quán trong khi cổng thực tế có thể thay đổi. – junjiah

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