Как добавить пользовательские корпуса на локальную машину в nltk

У меня есть пользовательские корпуса, которые созданы с данными, которые мне нужно сделать некоторую классификацию. У меня есть набор данных в том же формате, который содержится в корпусе movie_reviews. Согласно документации nltk я использую следующий код для доступа к корпусу movie_reviews. В любом случае можно ли добавить какие-либо пользовательские корпусы в каталог nltk_data/corpora и получить доступ к этим корпусам так же, как мы обращаемся к существующим корпусам?

    import nltk
    from nltk.corpus import movie_reviews

    documents = [(list(movie_reviews.words(fileid)), category)
         for category in movie_reviews.categories()
         for fileid in movie_reviews.fileids(category)]

3 ответа

Решение

Хотя вы можете взломать nltk, чтобы ваш корпус выглядел как встроенный корпус nltk, это неправильный путь. nltk предоставляет обширную коллекцию "читателей корпуса", которые вы можете использовать для чтения своих корпусов, где бы вы ни находились, без перемещения их в nltk_data каталог или взлом nltk источник. Собственные корпуса nltk используют те же программы чтения корпуса за кулисами, что ваш читатель будет иметь все методы и поведение эквивалентных встроенных корпусов.

Посмотрим, как movie_reviews корпус определяется в nltk/corpora/__init__.py:

movie_reviews = LazyCorpusLoader(
    'movie_reviews', CategorizedPlaintextCorpusReader,
    r'(?!\.).*\.txt', cat_pattern=r'(neg|pos)/.*',
    encoding='ascii')

Вы можете игнорировать LazyCorpusLoader часть; Ваша программа, скорее всего, никогда не будет использовать корпорацию. Остальное показывает, что корпус обзора фильма читается с CategorizedPlaintextCorpusReaderчто все его файлы заканчиваются .txtи что обзоры сортируются по категориям, находясь в подкаталогах pos а также neg, Наконец, кодировка корпуса - ascii. Поэтому определите свой собственный корпус следующим образом (меняя значения по мере необходимости):

mycorpus = nltk.corpus.reader.CategorizedPlaintextCorpusReader(
    r"/home/user/path/to/my_corpus",
    r'(?!\.).*\.txt', 
    cat_pattern=r'(neg|pos)/.*',
    encoding="ascii")

Это оно; теперь вы можете позвонить mycorpus.words(), mycorpus.sents(categories="neg")и т. д., как если бы это был корпус, предоставленный NLTK.

Сначала поместите фактические данные из вашего нового корпуса в ваш nltk_data/corpora/ каталог. Затем вы должны отредактировать __init__.py файл для nltk.corpus, Вы можете найти путь к этому файлу, выполнив:

import nltk
print(nltk.corpus.__file__)

Откройте этот файл в текстовом редакторе, и вы увидите, что большая часть файла создает LazyCorpusLoader объекты и присвоение их глобальным переменным.

Так, например, раздел может выглядеть так:

....
verbnet = LazyCorpusLoader(
    'verbnet', VerbnetCorpusReader, r'(?!\.).*\.xml')
webtext = LazyCorpusLoader(
    'webtext', PlaintextCorpusReader, r'(?!README|\.).*\.txt', encoding='ISO-8859-2')
wordnet = LazyCorpusLoader(
    'wordnet', WordNetCorpusReader,
    LazyCorpusLoader('omw', CorpusReader, r'.*/wn-data-.*\.tab', encoding='utf8'))  
....

Чтобы добавить новый корпус, вам просто нужно добавить новую строку в этот файл в том же формате, что и в приведенных выше примерах. Так что если у вас есть корпус по имени movie_reviews и у вас есть данные, сохраненные в nltk_data/corpora/movie_reviews тогда вы захотите добавить строку вроде:

movie_reviews = LazyCorpusLoader('movie_reviews', .... )

Дополнительные аргументы для LazyCorpusLoader можно найти в документации здесь.

Затем вы просто сохраняете этот файл, и вы должны быть в состоянии сделать:

from nltk.corpus import movie_reviews

Итак, у меня возникла небольшая проблема с предоставленным решением, и я считаю, что самый простой способ, который сработал для меня, - это сначала создать мои папки и подпапки в каталоге "corpora", а затем отредактировать документ init.py.

так что в моем случае корпус, который я создал, был vc, а подпапки были audio_them, audio_us, video_them, video_us

vc = LazyCorpusLoader(
    'vc', CategorizedPlaintextCorpusReader,
    r'(?!\.).*\.txt', 
cat_pattern = r'(audio_them|audio_us|video_them|video_us)/.$
    encoding="ascii")
Другие вопросы по тегам