Новые кодеры иногда пишут такой код:
my_calculator.button_0 = tkinter.Button(root, text=0)
my_calculator.button_1 = tkinter.Button(root, text=1)
my_calculator.button_2 = tkinter.Button(root, text=2)
...
Затем кодер остается с кучей именованных переменных с усилием кодирования O ( m * n ), где m - это число именованных переменных, а n - это количество раз, к которому необходимо получить доступ к группе переменных (включая создание) , Более проницательный новичок отмечает, что единственная разница в каждой из этих строк - это число, которое изменяется на основе правила и решает использовать цикл. Тем не менее, они зациклились на том, как динамически создавать эти имена переменных, и могут попробовать что-то вроде этого:
for i in range(10):
my_calculator.('button_%d' % i) = tkinter.Button(root, text=i)
Вскоре они обнаруживают, что это не сработает.
Если программа требует произвольных переменных «имена», лучше всего подходит словарь, как объясняется в других ответах. Однако, если вы просто пытаетесь создать много переменных, и вы не возражаете ссылаться на них с последовательностью целых чисел, вы, вероятно, ищете list
. Это особенно верно, если ваши данные однородны, например, ежедневные показания температуры, еженедельные оценки викторины или сетка графических виджета.
Это можно собрать следующим образом:
my_calculator.buttons = []
for i in range(10):
my_calculator.buttons.append(tkinter.Button(root, text=i))
Этот list
также может быть создан в одной строке с пониманием:
my_calculator.buttons = [tkinter.Button(root, text=i) for i in range(10)]
Результат в любом случае - это заполненный list
, с первым элементом, к которому обращаются с помощью my_calculator.buttons[0]
, следующего с my_calculator.buttons[1]
и т. д. Имя переменной «base» становится именем list
, и для доступа к нему используется различный идентификатор.
Наконец, не забудьте другие структуры данных, такие как set
- это аналогично словарю, за исключением того, что каждое «имя» не имеет привязанного к нему значения. Если вам просто нужна «сумка» объектов, это может быть отличным выбором. Вместо этого:
keyword_1 = 'apple'
keyword_2 = 'banana'
if query == keyword_1 or query == keyword_2:
print('Match.')
У вас будет следующее:
keywords = {'apple', 'banana'}
if query in keywords:
print('Match.')
Используйте последовательность list
для последовательности похожих объектов, a set
для произвольного - помещенный пакет предметов или dict
для мешка с именами со связанными значениями.
Короче:
NLTK не совершенен.
Примечание:
Начиная с версии NLTK 3.1 функция по умолчанию
pos_tag
больше не является старым английским маринованием MaxEnt .Теперь это теггер персептрона из @ реализации Хоннибала , см.
nltk.tag.pos_tag
>>> import inspect >>> print inspect.getsource(pos_tag) def pos_tag(tokens, tagset=None): tagger = PerceptronTagger() return _pos_tag(tokens, tagset, tagger)
Тем не менее, лучше, но не идеально:
>>> from nltk import pos_tag >>> pos_tag("The quick brown fox jumps over the lazy dog".split()) [('The', 'DT'), ('quick', 'JJ'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
В какой-то момент, если кто-то хочет
TL;DR
решения, см. https://github.com/alvations/nltk_cli
В long:
Попробуйте использовать другой теггер (см. https://github.com/nltk/nltk/tree/develop/nltk/tag ), например:
- HunPos
- Stanford POS
- Senna
Использование по умолчанию MaxEnt POS tagger из NLTK, т.е.
nltk.pos_tag
:>>> from nltk import word_tokenize, pos_tag >>> text = "The quick brown fox jumps over the lazy dog" >>> pos_tag(word_tokenize(text)) [('The', 'DT'), ('quick', 'NN'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'NN'), ('dog', 'NN')]
Использование тестера PSP в Stanford:
$ cd ~ $ wget http://nlp.stanford.edu/software/stanford-postagger-2015-04-20.zip $ unzip stanford-postagger-2015-04-20.zip $ mv stanford-postagger-2015-04-20 stanford-postagger $ python >>> from os.path import expanduser >>> home = expanduser("~") >>> from nltk.tag.stanford import POSTagger >>> _path_to_model = home + '/stanford-postagger/models/english-bidirectional-distsim.tagger' >>> _path_to_jar = home + '/stanford-postagger/stanford-postagger.jar' >>> st = POSTagger(path_to_model=_path_to_model, path_to_jar=_path_to_jar) >>> text = "The quick brown fox jumps over the lazy dog" >>> st.tag(text.split()) [(u'The', u'DT'), (u'quick', u'JJ'), (u'brown', u'JJ'), (u'fox', u'NN'), (u'jumps', u'VBZ'), (u'over', u'IN'), (u'the', u'DT'), (u'lazy', u'JJ'), (u'dog', u'NN')]
Использование HunPOS (ПРИМЕЧАНИЕ: кодировка по умолчанию - ISO-8859-1, а не UTF8):
$ cd ~ $ wget https://hunpos.googlecode.com/files/hunpos-1.0-linux.tgz $ tar zxvf hunpos-1.0-linux.tgz $ wget https://hunpos.googlecode.com/files/en_wsj.model.gz $ gzip -d en_wsj.model.gz $ mv en_wsj.model hunpos-1.0-linux/ $ python >>> from os.path import expanduser >>> home = expanduser("~") >>> from nltk.tag.hunpos import HunposTagger >>> _path_to_bin = home + '/hunpos-1.0-linux/hunpos-tag' >>> _path_to_model = home + '/hunpos-1.0-linux/en_wsj.model' >>> ht = HunposTagger(path_to_model=_path_to_model, path_to_bin=_path_to_bin) >>> text = "The quick brown fox jumps over the lazy dog" >>> ht.tag(text.split()) [('The', 'DT'), ('quick', 'JJ'), ('brown', 'JJ'), ('fox', 'NN'), ('jumps', 'NNS'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN')]
Использование Senna (убедитесь, что у вас установлена последняя версия NLTK, были внесены некоторые изменения в API):
$ cd ~ $ wget http://ronan.collobert.com/senna/senna-v3.0.tgz $ tar zxvf senna-v3.0.tgz $ python >>> from os.path import expanduser >>> home = expanduser("~") >>> from nltk.tag.senna import SennaTagger >>> st = SennaTagger(home+'/senna') >>> text = "The quick brown fox jumps over the lazy dog" >>> st.tag(text.split()) [('The', u'DT'), ('quick', u'JJ'), ('brown', u'JJ'), ('fox', u'NN'), ('jumps', u'VBZ'), ('over', u'IN'), ('the', u'DT'), ('lazy', u'JJ'), ('dog', u'NN')]
Или попробуйте создать лучший теггер POS:
- Ngram Tagger: http://streamhacker.com/2008/11/03/part-of-speech-tagging-with-nltk-part-1/
- Affix / Regex Tagger: http: // st reamhacker.com/2008/11/10/part-of-speech-tagging-with-nltk-part-2/
- Создайте свой собственный Brill (читайте код, это довольно забавный теггер , http://www.nltk.org/_modules/nltk/tag/brill.html ), см. http://streamhacker.com/2008/12/03/part-of -speech-tagging-with-nltk-part-3 /
- Perceptron Tagger: https://honnibal.wordpress.com/2013/09/11/a-good- часть-of-speechpos-tagger-in-about-200-lines-of-python /
- LDA Tagger: http://scm.io/blog/hack/2015 / 02 / lda-намерения /
Жалобы на точность
pos_tag
в stackoverflow включают:
- Пометка POS - NLTK считает, что существительное является прилагательным
- python NLTK POS tagger не ведет себя как ожидалось
- Как получить лучшие результаты с помощью NLTK pos тег
- pos_tag в NLTK не корректно помещает предложения
Проблемы с NLTK HunPos включают:
- Как пометить текстовые файлы с помощью hunpos в nltk?
- Кто-нибудь знает, как настроить класс оболочки hunpos на nltk?
Проблемы с NLTK и тестером POS-терминалов в Stanford включают :
- проблема с импортированием stanford pos tagger в nltk
- Ошибка Java Command в NLTK Stanford POS Tagger
- Ошибка при использовании Stanford POS Tagger в NLTK Python
- Как улучшить скорость с помощью Stanford NLP Tagger и NLTK
- Ошибка в методе Nltk stanford pos: ошибка команды Java
- Создание и использование StanfordTagger в NLTK
- Запуск тестера в NLTK приводит к «недействительному приложению Win32», на Windows
nltk-dev
группы google: github.com/arne-cl/nltk-maxent-pos-tagger . И модель была создана 7 лет назад = ( github.com/nltk/nltk/blob/develop/nltk/tag / __ init __. Py # L84 – alvas 13 June 2015 в 23:49