Импортируйте мои собственные тексты, чтобы использовать тегирование части речи NLTK

Я новичок в этом, но я хотел бы создать папку, в которой у меня будет много текстов (скажем, романы, сохраненные как .txt). Затем я хотел бы попросить пользователя выбрать один из этих романов, а затем автоматически заставить анализатор частей речи проанализировать весь текст. Это возможно? Я пытался с:

text = nltk.word_tokenize("And now for something completely different")
nltk.pos_tag(text)

Как заставить его анализировать текст, который выбрал пользователь, вместо этого предложения? И как мне импортировать эти тексты?


person user3203883    schedule 16.01.2014    source источник


Ответы (1)


Есть несколько способов прочитать каталог текстовых файлов.

Давайте сначала попробуем нативный способ Python, из терминала/консоли/командной строки:

~$ mkdir ~/testcorpora
~$ cd ~/testcorpora/
~/testcorpora$ ls
~/testcorpora$ echo 'this is a foo foo bar bar.\n bar foo, dah dah.' > somefoobar.txt
~/testcorpora$ echo 'what are you talking about?' > talkingabout.txt
~/testcorpora$ ls
somefoobar.txt  talkingabout.txt
~/testcorpora$ cd ..
~$ python
>>> import os
>>> from nltk.tokenize import word_tokenize
>>> from nltk.tag import pos_tag
>>> corpus_directory = 'testcorpora/'
>>> for infile in os.listdir(corpus_directory):
...     with open(corpus_directory+infile, 'r') as fin:
...             pos_tag(word_tokenize(fin.read()))
... 
[('what', 'WP'), ('are', 'VBP'), ('you', 'PRP'), ('talking', 'VBG'), ('about', 'IN'), ('?', '.')]
[('this', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('foo', 'NN'), ('foo', 'NN'), ('bar', 'NN'), ('bar.\\n', 'NN'), ('bar', 'NN'), ('foo', 'NN'), (',', ','), ('dah', 'NN'), ('dah', 'NN'), ('.', '.')]

Другое решение использует PlaintextCorpusReader в NLTK, затем запускает word_tokenize и pos_tag в корпусе, см. Создание новый корпус с NLTK:

>>> from nltk.corpus.reader.plaintext import PlaintextCorpusReader
>>> from nltk.tag import pos_tag
>>> corpusdir = 'testcorpora/'
>>> newcorpus = PlaintextCorpusReader(corpusdir,'.*')
>>> dir(newcorpus)
['CorpusView', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_encoding', '_fileids', '_get_root', '_para_block_reader', '_read_para_block', '_read_sent_block', '_read_word_block', '_root', '_sent_tokenizer', '_tag_mapping_function', '_word_tokenizer', 'abspath', 'abspaths', 'encoding', 'fileids', 'open', 'paras', 'raw', 'readme', 'root', 'sents', 'words']
# POS tagging all the words in all text files at the same time.
>>> newcorpus.words()
['this', 'is', 'a', 'foo', 'foo', 'bar', 'bar', '.\\', ...]
>>> pos_tag(newcorpus.words())
[('this', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('foo', 'NN'), ('foo', 'NN'), ('bar', 'NN'), ('bar', 'NN'), ('.\\', ':'), ('n', 'NN'), ('bar', 'NN'), ('foo', 'NN'), (',', ','), ('dah', 'NN'), ('dah', 'NN'), ('.', '.'), ('what', 'WP'), ('are', 'VBP'), ('you', 'PRP'), ('talking', 'VBG'), ('about', 'IN'), ('?', '.')]
person alvas    schedule 16.01.2014
comment
Но тогда мне пришлось бы напечатать весь роман на python, а затем сохранить его как новый файл .txt, верно? Разве я не могу сделать это без этого шага, просто «вызвав» файлы .txt, которые у меня уже есть? - person user3203883; 18.01.2014
comment
вопрос: у вас есть каталог текстовых файлов. или один текстовый файл? - person alvas; 19.01.2014
comment
В любом случае, просто назначьте правильный путь для corpusdir и используйте newcorpus = PlaintextCorpusReader(corpusdir,'.*'). Нет необходимости вводить какие-либо данные из .txt в python. в приведенном выше коде ничего не напечатано на python, только чтение файла с использованием PlaintextCorpusReader - person alvas; 19.01.2014
comment
Большое спасибо, вы мне очень помогли! - person user3203883; 19.01.2014
comment
Привет @user3203883! Добро пожаловать в Stack Overflow! Пожалуйста, не забудьте принять ответ, если это помогло! :) - person arturomp; 22.01.2014