Создайте новый корпус с помощью NLTK, который игнорирует определенные строки во входных файлах и не вводит их в корпус - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь создать свой собственный корпус из набора текстовых файлов. Тем не менее, я хочу выполнить некоторую предварительную обработку текстовых файлов, прежде чем они будут корпусизированы, и я не могу понять, как это сделать, если только не создать сценарий для запуска каждого отдельного текстового файла, выполнить предварительную обработку текста, сохранить новый текстовый файл, а затем создать корпус для новых, обработанных файлов. (Сейчас это кажется неэффективным, потому что у меня есть ~ 200 МБ файлов, которые мне нужно было бы прочитать дважды, и это не очень масштабируемо, если бы у меня был гораздо больший корпус.)

Предварительная обработка, которую я хочу сделать, является очень простой текстовой манипуляцией:

  • Сделать каждое слово, как указано в корпусе в нижнем регистре
  • Удалите все элементы, полностью заключенные в скобки, например, [кашель]
  • Удалить цифры в начале каждой строки (это номера строк из исходной транскрипции), которые являются первыми четырьмя символами каждой строки

Критически, я хочу сделать эту предварительную обработку ДО того, как слова войдут в корпус - я не хочу, например, «[кашлять]» или «0001» как запись в моем корпусе, и вместо «ДЕРЕВО» я хочу "дерево".

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

corpusdir = "C:/corpus/"     
newcorpus = PlaintextCorpusReader(corpusdir, '.*') 
corpus_words = newcorpus.words()     # get words in the corpus 
fdist = nltk.FreqDist(corpus_words)  # make frequency distribution of the words in the corpus

Этот ответ вроде как на правильном пути, но соответствующие слова уже есть в корпусе, и плакат хочет игнорировать / убрать пунктуацию перед маркировкой корпуса. Я хочу затронуть, какие типы слов вообще вводятся (то есть считаются) в корпусе вообще.

Заранее спасибо!

1 Ответ

0 голосов
/ 10 мая 2018

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

Насколько я понимаю, PlaintextCorpusReader нужны файлы в качестве входных данных. Я использовал код из ответа Alvas на другой вопрос, чтобы построить этот ответ. Смотрите фантастический ответ Алваса об использовании PlaintextCorpusReader здесь .

Вот мой рабочий процесс:

from glob import glob
import re
import os
from nltk.corpus import PlaintextCorpusReader
from nltk.probability import FreqDist as FreqDist

mycorpusdir = glob('path/to/your/corpus/*')

# captures bracket-ed text 
re_brackets = r'(\[.*?\])'
# exactly 4 numbers
re_numbers = r'(\d{4})'

Строчные все, убрать цифры:

corpus = []
for file in mycorpusdir:
    f = open(file).read()
    # lowercase everything
    all_lower = f.lower()
    # remove brackets
    no_brackets = re.sub(re_brackets, '', all_lower)
    # remove #### numbers
    just_words = re.sub(re_numbers, '', no_brackets)
    corpus.append(just_words)

Создать новый каталог для обработанного корпуса:

corpusdir = 'newcorpus/'
if not os.path.isdir(corpusdir):
    os.mkdir(corpusdir)

# Output the files into the directory.
filename = 0
for text in corpus:
    with open(corpusdir + str(filename) + '.txt' , 'w+') as fout:
        print(text, file=fout)
    filename += 1

Звоните PlaintextCorpusReader:

newcorpus = PlaintextCorpusReader('newcorpus/', '.*')

corpus_words = newcorpus.words()
fdist = FreqDist(corpus_words)

print(fdist)
...