2015-11-17 4 views
4

Сначала я кодирую содержимое файла в предложения, а затем вызываю Stanford NER в каждом из предложений. Но этот процесс происходит очень медленно. Я знаю, буду ли я называть это содержимое всего файла, если будет быстрее, но я вызываю его в каждом предложении, так как хочу индексировать каждое предложение до и после распознавания сети.Как ускорить распознавание NE с помощью stanford NER с python nltk

st = NERTagger('stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar') 
for filename in filelist: 
    sentences = sent_tokenize(filecontent) #break file content into sentences 
    for j,sent in enumerate(sentences): 
     words = word_tokenize(sent) #tokenize sentences into words 
     ne_tags = st.tag(words) #get tagged NEs from Stanford NER 

Это, вероятно, связано с вызовом st.tag() для каждого предложения, но есть ли способ, чтобы сделать его работать быстрее?

EDIT

Причина, по которой я хочу, чтобы пометить предложения отделить то, что я хочу писать предложения в файл (например, предложения индексации), так что при п помечен предложение на более позднем этапе, я могу получить необработанное предложение (я также делаю lemmatizing здесь)

формат файла:

(sent_number, orig_sentence, NE_and_lemmatized_sentence)

ответ

6

StanfordNERTagger С, есть функция tag_sents() см https://github.com/nltk/nltk/blob/develop/nltk/tag/stanford.py#L68

>>> st = NERTagger('stanford-ner/classifiers/english.all.3class.distsim.crf.ser.gz', 'stanford-ner/stanford-ner.jar') 
>>> tokenized_sents = [[word_tokenize(sent) for sent in sent_tokenize(filecontent)] for filename in filelist] 
>>> st.tag_sents(tokenized_sents) 
+0

См также http://stackoverflow.com/questions/33676526/pos-tagger-is-incredibly-slow/33677051#33677051 – alvas

+0

I не думайте, что это будет делать то, что я хочу, поскольку оно будет выводить помеченные предложения. то, что я хочу, это оригинальное предложение и не помеченные пары предложений, которые я напишу в файл в следующем формате: – KillBill

+0

(sent_no, orig_sent, tagged_sent), например, 0, новый документ в королевскую женскую больницу, новый документ к королевскому королевству. Я не думаю, что ваш ответ позволяет мне это сделать? – KillBill

1

Сначала скачать Stanford CoreNLP 3.5.2 отсюда: http://nlp.stanford.edu/software/corenlp.shtml

Допустим, вы кладете загрузку в/User/имя пользователя/Стэнфорде -corenlp набитый-2015-04-20

Этот код Python будет работать конвейер:

stanford_distribution_dir = "/User/username/stanford-corenlp-full-2015-04-20" 
list_of_sentences_path = "/Users/username/list_of_sentences.txt" 
stanford_command = "cd %s ; java -Xmx2g -cp \"*\" edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner -ssplit.eolonly -filelist %s -outputFormat json" % (stanford_distribution_dir, list_of_sentences_path) 
os.system(stanford_command) 

Вот некоторые примеры кода Python для загрузки в файле .json для справки:

import json 
sample_json = json.loads(file("sample_file.txt.json").read() 

На данный момент sample_json будет хороший словарь со всеми предложениями из файла в нем.

for sentence in sample_json["sentences"]: 
    tokens = [] 
    ner_tags = [] 
    for token in sentence["tokens"]: 
    tokens.append(token["word"]) 
    ner_tags.append(token["ner"]) 
    print (tokens, ner_tags) 

list_of_sentences.txt должен быть ваш список файлов с предложениями, что-то вроде:

input_file_1.txt 
input_file_2.txt 
... 
input_file_100.txt 

Так input_file.txt (который должен иметь одно предложение в каждой строке) будет генерировать input_file.txt.json раз выполняется Java-команда и что .json-файлы будут иметь теги NER. Вы можете просто загрузить .json для каждого входного файла и легко получить пары (предложение, ner tag sequence). Вы можете поэкспериментировать с «текстом» в качестве альтернативного формата вывода, если вам это нравится. Но «json» создаст хороший .json-файл, который вы можете загрузить с помощью json.loads (...), и тогда у вас будет хороший словарь, который вы можете использовать для доступа к предложениям и аннотациям.

Таким образом, вы будете загружать только один конвейер один раз для всех файлов.

+0

звучит хорошо! но бит работы, создающий входные данные, даст ему попробовать латнеры! спасибо – KillBill

+0

ценят, если вы можете помочь мне с этим? http://stackoverflow.com/questions/33755092/stanford-ner-with-python-nltk-fails-with-strings-containing-multiple-s – KillBill

+0

Я добавил некоторую информацию о загрузке json в Python в ответ. – StanfordNLPHelp

4

вы можете использовать сервер stanford ner. Скорость будет намного быстрее.

установить Sner

pip install sner 

запустить сервер нер

cd your_stanford_ner_dir 
 
java -Djava.ext.dirs=./lib -cp stanford-ner.jar edu.stanford.nlp.ie.NERServer -port 9199 -loadClassifier ./classifiers/english.all.3class.distsim.crf.ser.gz

from sner import Ner 
 

 
test_string = "Alice went to the Museum of Natural History." 
 
tagger = Ner(host='localhost',port=9199) 
 
print(tagger.get_entities(test_string))
результат

этот код

[('Alice', 'PERSON'), 
 
('went', 'O'), 
 
('to', 'O'), 
 
('the', 'O'), 
 
('Museum', 'ORGANIZATION'), 
 
('of', 'ORGANIZATION'), 
 
('Natural', 'ORGANIZATION'), 
 
('History', 'ORGANIZATION'), 
 
('.', 'O')]

более подробно посмотреть https://github.com/caihaoyu/sner

+0

Это действительно намного быстрее! :) – jxn