nltk StanfordNERTagger не работает [дублировать]

Во-первых, вам нужно иметь четкое представление о scope и поведении ключевого слова this в контексте scope.

this & amp; scope:


there are two types of scope in javascript. They are :

   1) Global Scope

   2) Function Scope

вкратце, глобальная область относится к объекту window.Variables, объявленные в глобальной области, доступны из любого места. С другой стороны, область функций находится внутри функции .variable, объявленный внутри функции, не может быть доступен из внешнего мира в обычном режиме. this ключевое слово в глобальной области относится к объекту window. Внутренняя функция this также относится к объекту window.So this всегда будет ссылаться на окно до тех пор, пока мы найдем способ манипулировать this, чтобы указать контекст по собственному выбору.

--------------------------------------------------------------------------------
-                                                                              -
-   Global Scope                                                               -
-   ( globally "this" refers to window object)                                 -     
-                                                                              -
-         function outer_function(callback){                                   -
-                                                                              -
-               // outer function scope                                        -
-               // inside outer function"this" keyword refers to window object -                                                                              -
-              callback() // "this" inside callback also refers window object  -

-         }                                                                    -
-                                                                              -
-         function callback_function(){                                        -
-                                                                              -
-                //  function to be passed as callback                         -
-                                                                              -
-                // here "THIS" refers to window object also                   -
-                                                                              -
-         }                                                                    -
-                                                                              -
-         outer_function(callback_function)                                    -
-         // invoke with callback                                              -
--------------------------------------------------------------------------------

Различные способы управления this внутри функций обратного вызова:

Здесь У меня есть функция-конструктор, называемая Person. Он имеет свойство, называемое name, и четыре метода, называемые sayNameVersion1, sayNameVersion2, sayNameVersion3, sayNameVersion4. Все четыре из них имеют одну конкретную задачу. Заберите обратный вызов и вызовите его. Обратный вызов имеет конкретную задачу, которая заключается в регистрации свойства имени экземпляра функции конструктора Person.

function Person(name){

    this.name = name

    this.sayNameVersion1 = function(callback){
        callback.bind(this)()
    }
    this.sayNameVersion2 = function(callback){
        callback()
    }

    this.sayNameVersion3 = function(callback){
        callback.call(this)
    }

    this.sayNameVersion4 = function(callback){
        callback.apply(this)
    }

}

function niceCallback(){

    // function to be used as callback

    var parentObject = this

    console.log(parentObject)

}

Теперь давайте создадим экземпляр из конструктора person и вызывать разные версии sayNameVersionX (X относится к 1,2,3,4) методу с niceCallback, чтобы увидеть, как много способов управления this внутри обратного вызова ссылаться на person.

var p1 = new Person('zami') // create an instance of Person constructor

bind:

Что нужно сделать, это создать новую функцию с ключевым словом this, установленным на предоставленное значение.

sayNameVersion1 и sayNameVersion2 используют bind для управления this функции обратного вызова.

this.sayNameVersion1 = function(callback){
    callback.bind(this)()
}
this.sayNameVersion2 = function(callback){
    callback()
}

сначала связывают this с обратным вызовом внутри самого метода. для второго обратного вызова передается связанный с ним объект.

p1.sayNameVersion1(niceCallback) // pass simply the callback and bind happens inside the sayNameVersion1 method

p1.sayNameVersion2(niceCallback.bind(p1)) // uses bind before passing callback

вызов:

first argument в call используется как функция this внутри функции, которая вызывается с call, прикрепленной к ней.

sayNameVersion3 использует call для управления this ], чтобы ссылаться на созданный нами объект person, а не на объект окна.

this.sayNameVersion3 = function(callback){
    callback.call(this)
}

и он называется следующим:

p1.sayNameVersion3(niceCallback)

apply:

Как и в call, первый аргумент apply относится к объекту, который будет обозначен ключевым словом this.

sayNameVersion4 использует apply для манипулирования this для обращения к объекту человека

this.sayNameVersion4 = function(callback){
    callback.apply(this)
}

, и он называется следующим. Просто передается обратный вызов,

p1.sayNameVersion4(niceCallback)

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 в 14:05
поделиться
70
ответ дан alvas 21 August 2018 в 14:05
поделиться
  • 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 в 14:05
поделиться

Я занял много часов и, наконец, нашел простое решение для пользователей 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 в 14:05
поделиться

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

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

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

Вы можете использовать вывод 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 в 14:05
поделиться
  • 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 в 14:05
поделиться

Я нахожусь на машине 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 в 14:05
поделиться

Поскольку никто не упоминал об этом, и это меня так сильно беспокоило, вот альтернативный способ использования парсера 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 в 14:05
поделиться
21
ответ дан alvas 1 November 2018 в 08:08
поделиться
75
ответ дан Servy 1 November 2018 в 08:08
поделиться
Другие вопросы по тегам:

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