NLTK не смог найти stanford-ner.jar! Установите переменную среды CLASSPATH [duplicate]

Вот несколько способов доступа к родительскому контексту внутри дочернего контекста -
  1. Вы можете использовать функцию bind().
  2. Хранить ссылку на контекст / внутри внутри другой переменной (см. пример ниже).
  3. Использовать функции ES6 Arrow .
  4. Изменить код / function design / architecture - для этого вы должны иметь команду над шаблонами проектирования в javascript.

1. Используйте функцию bind()

function MyConstructor(data, transport) {
    this.data = data;
    transport.on('data', ( function () {
        alert(this.data);
    }).bind(this) );
}
// Mock transport object
var transport = {
    on: function(event, callback) {
        setTimeout(callback, 1000);
    }
};
// called as
var obj = new MyConstructor('foo', transport);

Если вы используете underscore.js - http://underscorejs.org/#bind

transport.on('data', _.bind(function () {
    alert(this.data);
}, this));

2 Сохраните ссылку на контекст / внутри внутри другой переменной

function MyConstructor(data, transport) {
  var self = this;
  this.data = data;
  transport.on('data', function() {
    alert(self.data);
  });
}

3 Функция стрелки

function MyConstructor(data, transport) {
  this.data = data;
  transport.on('data', () => {
    alert(this.data);
  });
}
81
задан Peter O. 6 December 2015 в 06:28
поделиться

11 ответов

Я использую версию nltk 3.2.4. И следующий код работал для меня.

from nltk.internals import find_jars_within_path
from nltk.tag import StanfordPOSTagger
from nltk import word_tokenize

# Alternatively to setting the CLASSPATH add the jar and model via their 
path:
jar = '/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar'
model = '/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger'

pos_tagger = StanfordPOSTagger(model, jar)

# Add other jars from Stanford directory
stanford_dir = pos_tagger._stanford_jar.rpartition('/')[0]
stanford_jars = find_jars_within_path(stanford_dir)
pos_tagger._stanford_jar = ':'.join(stanford_jars)

text = pos_tagger.tag(word_tokenize("Open app and play movie"))
print(text)

Выход:

[('Open', 'VB'), ('app', 'NN'), ('and', 'CC'), ('play', 'VB'), ('movie', 'NN')]
2
ответ дан Aditi 21 August 2018 в 20:15
поделиться

Отредактировано

Начиная с текущего анализатора Stanford (2015-04-20), выход по умолчанию для lexparser.sh изменился, поэтому сценарий ниже не будет работать.

Но этот ответ сохранен для наследия, он все равно будет работать с http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip .


Оригинальный ответ

Я предлагаю вам не общаться с Jython, JPype. Пусть python делает вещи python и позволяет java делать java-материал, вытаскивать файл Stanford Parser через консоль.

После того, как вы установили Stanford Parser в свой домашний каталог ~/ , просто используйте этот рецепт python, чтобы получить плоский синтаксический разбор:

import os
sentence = "this is a foo bar i want to parse."

os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()

bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] )
print bracketed_parse
21
ответ дан alvas 21 August 2018 в 20:15
поделиться
  • 1
    Это сработало для меня, за исключением того, что мне нужно было добавить условие для проверки len(i.strip()) > 0, иначе я получил ошибку индекса. Я думаю, у моего вывода парсера была хотя бы одна строка, которая была чисто пробельной. – aelfric5578 26 May 2013 в 00:25
  • 2
    альтернативно, используйте эту оболочку python для инструментов stanford corenlp, bitbucket.org/torotoki/corenlp-python – alvas 11 September 2013 в 21:40
  • 3
    Будьте осторожны с этим. Если ваш вход содержит любые ' s, вы получите некоторые странные ошибки. Там являются лучшими способами для вызова вещей в командной строке – Nick Garvey 6 April 2014 в 20:38
  • 4
    Какая версия nltk добавлена ​​nltk.parse.stanford? У меня есть только nltk.tag.stanford в NLTK 2.0.4. – alexis 30 May 2014 в 16:00
  • 5
    AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse' – Nick Retallack 26 June 2014 в 19:36
  • 6
    @alexis: скачать nltk 3.0 из здесь @Nick Retallack: его следует изменить на raw_parse_sents() – Rasika Perera 24 August 2014 в 08:30
  • 7
    Я с 1989 года не 98, но спасибо за ваш пример;) – danger89 9 November 2014 в 13:25
  • 8
    Как насчет использования NLTK Downloader? Будет ли использование этого предложения более актуальной версией пакетов NLTK? – Radu Gheorghiu 15 April 2015 в 21:17
  • 9
    В настоящее время пакет PyPi обновляется с помощью NLTK 3.0.2. Однако загрузчик NLTK загружает данные, которые не влияют на проблему в вопросе. – ZeerakW 16 April 2015 в 22:25
  • 10
    Хорошо, ты прав. NLTK изменяет функцию на: raw_parse_sents (). См. Документацию: nltk.org/_modules/nltk/parse/stanford.html Если вы используете raw_parse (), вы получите возвращаемое значение iter (Tree). Значение приведенной выше выборки draw () должно работать. Если вы используете raw_parse_sents (), вам нужен двойной цикл, очевидно; он возвращает итератор (iter (Дерево)). Итак, пример кода: for line in sentences: for sentence in line: sentence.draw() Вы можете выполнить draw () только для объекта Tree;) – danger89 17 April 2015 в 08:59
  • 11
    @ danger89, извините за переписку ответа с записью EDITED. Недавно люди жаловались, что парсер Stanford Dependency только недавно добавлен с NLTK v3.1, и я думаю, что они дублировали некоторые фрагменты кода здесь и там из устаревших ответов здесь. Поэтому, чтобы свести к минимуму путаницу, я подумал, что лучше всего добавить упоминания об ответах на все ответы здесь, следуя инструкциям из документации NLTK official 3rd party tools. – alvas 6 December 2015 в 04:00

Если я хорошо помню, парсер Stanford представляет собой библиотеку java, поэтому на вашем сервере / компьютере должен быть Java-интерпретатор.

Я использовал его один раз на сервере в сочетании с php-скриптом. Сценарий использовал функцию exec () php для вызова командной строки для синтаксического анализатора следующим образом:

<?php

exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );

?>

Я не помню всех деталей этой команды, она в основном открывала fileToParse, анализировалась он, и написал вывод в файле результатов. PHP затем откроет файл результатов для дальнейшего использования.

Конец команды направляет подробный отчет парсеру NULL, чтобы предотвратить ненужную информацию из командной строки от нарушения сценария.

Не знаю много о Python, но может быть способ сделать вызовы командной строки.

Возможно, это не тот точный маршрут, на который вы надеялись, но, надеюсь, это даст вам некоторое вдохновение. Удачи.

6
ответ дан bob dope 21 August 2018 в 20:15
поделиться

Я занял много часов и, наконец, нашел простое решение для пользователей Windows. В основном его обобщенная версия существующего ответа по alvas, но была легко следовать (надеюсь) для тех, кто новичок в stanford NLP и являются пользователями Window.

1) Загрузите модуль, который вы хотите использовать, например, NER, POS и т. д. В моем случае я хотел использовать NER, поэтому я загрузил модуль из http://nlp.stanford.edu/software/stanford-ner-2015-04 -20.zip

2) Разархивируйте файл.

3) Установите переменные среды (classpath и stanford_modules) из распакованной папки.

import os
os.environ['CLASSPATH'] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar"
os.environ['STANFORD_MODELS'] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"

4) установить переменные среды для JAVA, например, там, где вы установили JAVA. для меня это было ниже

os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"

5) импортировать модуль, который вы хотите

from nltk.tag import StanfordNERTagger

6) вызвать предварительно обработанную модель, которая присутствует в папке классификатора в распакованной папке. добавьте «.gz» в конце для расширения файла. для меня модель, которую я хотел использовать, была english.all.3class.distsim.crf.ser

st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')

7) Теперь выполните парсер! и мы закончили !!

st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
2
ответ дан Community 21 August 2018 в 20:15
поделиться

Существует интерфейс python для парсера stanford

http://projects.csail.mit.edu/spatial/Stanford_Parser

7
ответ дан Rohith 21 August 2018 в 20:15
поделиться

Вы можете использовать вывод Stanford Parsers для создания дерева в nltk (nltk.tree.Tree).

Предполагая, что анализатор stanford дает вам файл, в котором есть ровно одно дерево разбора для каждого предложения , Тогда этот пример работает, хотя он может выглядеть не очень pythonic:

f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
  if line.isspace():
    parse_trees_text.append(tree)
tree = ""
  elif "(. ...))" in line:
#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree = ""
  else:
tree = tree + line

parse_trees=[]
for t in parse_trees_text:
  tree = nltk.Tree(t)
  tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that)
  s = traverse(tree)
  parse_trees.append(tree)
4
ответ дан Sadik 21 August 2018 в 20:15
поделиться
  • 1
    +1 для того, чтобы позволить java делать java-материал и python делать вещи python. В зависимости от того, как вы вызываете команду java и какие параметры, разбор выходного файла из парсера stanford может отличаться. Было бы хорошо, если бы вы также добавили подробности о том, как вы вызвали «Стэнфордский парсер», чтобы получить ваш выходной файл. – alvas 6 December 2015 в 03:48

На странице программного обеспечения Stanford Core NLP есть список оболочек python:

http://nlp.stanford.edu/software/corenlp.shtml#Extensions

7
ответ дан silverasm 21 August 2018 в 20:15
поделиться

Я нахожусь на машине Windows, и вы можете просто запустить парсер, как обычно, из командной строки, но как в другом каталоге, поэтому вам не нужно редактировать файл lexparser.bat. Просто поставьте полный путь.

cmd = r'java -cp \Documents\stanford_nlp\stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" \Documents\stanford_nlp\stanford-parser-full-2015-01-30\stanford-parser-3.5.1-models\edu\stanford\nlp\models\lexparser\englishFactored.ser.gz stanfordtemp.txt'
parse_out = os.popen(cmd).readlines()

Трудная часть для меня заключалась в понимании, как запускать java-программу с другого пути. Должен быть лучший способ, но это работает.

3
ответ дан Ted Petrou 21 August 2018 в 20:15
поделиться

Поскольку никто не упоминал об этом, и это меня так сильно беспокоило, вот альтернативный способ использования парсера Stanford в python:

stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar'
stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar'    
parser = StanfordParser(path_to_jar=stanford_parser_jar, 
                        path_to_models_jar=stanford_model_jar)

таким образом, вам не нужно беспокоиться о

Для тех, кто не может правильно использовать его на Ubuntu или запустить код в Eclipse.

3
ответ дан Zhong Zhu 21 August 2018 в 20:15
поделиться
8
ответ дан alvas 4 November 2018 в 17:24
поделиться
75
ответ дан Servy 4 November 2018 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: