Создание нового корпуса с помощью NLTK
Я считал, что часто ответ на мой титул-это пойти и прочитать документы, но я пробежал через nltk book но это не дает ответа. Я вроде как новичок в python.
у меня есть куча .txt
файлы и я хочу иметь возможность использовать функции корпуса, которые NLTK предоставляет для корпуса nltk_data
.
Я пробовал PlaintextCorpusReader
но я не мог продвинуться дальше:
>>>import nltk
>>>from nltk.corpus import PlaintextCorpusReader
>>>corpus_root = './'
>>>newcorpus = PlaintextCorpusReader(corpus_root, '.*')
>>>newcorpus.words()
как мне сегментировать newcorpus
предложения с использованием punkt? Я попытался с помощью функции пункт но пункт не мог читать PlaintextCorpusReader
класса?
можете ли вы также привести меня к тому, как я могу записать сегментированные данные в текстовые файлы?
Edit: Этот вопрос когда-то был щедрым, и теперь у него есть вторая щедрость. См. текст в поле щедрость.
3 ответа:
Я думаю
PlaintextCorpusReader
уже сегментирует вход с помощью токенизатора punkt, по крайней мере, если ваш язык ввода-английский.конструктор PlainTextCorpusReader
def __init__(self, root, fileids, word_tokenizer=WordPunctTokenizer(), sent_tokenizer=nltk.data.LazyLoader( 'tokenizers/punkt/english.pickle'), para_block_reader=read_blankline_block, encoding='utf8'):
вы можете передать читателю Слово и предложение токенизатор, но для последнего значение по умолчанию уже
nltk.data.LazyLoader('tokenizers/punkt/english.pickle')
.для одной строки токенизатор будет использоваться следующим образом (объяснено здесь, см. раздел 5 для токенизатора punkt).
>>> import nltk.data >>> text = """ ... Punkt knows that the periods in Mr. Smith and Johann S. Bach ... do not mark sentence boundaries. And sometimes sentences ... can start with non-capitalized words. i is a good variable ... name. ... """ >>> tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') >>> tokenizer.tokenize(text.strip())
после нескольких лет выяснения, как это работает, вот обновленный учебник
Как создать корпус NLTK с каталогом текстовых файлов?
основная идея состоит в том, чтобы использовать nltk.туловище.читатель. В том случае, если у вас есть каталог текстовых файлов в английский язык лучше использовать PlaintextCorpusReader.
если у вас есть каталог, который выглядит так:
newcorpus/ file1.txt file2.txt ...
просто используйте эти строки кода, и вы можете получить корпус:
import os from nltk.corpus.reader.plaintext import PlaintextCorpusReader corpusdir = 'newcorpus/' # Directory of corpus. newcorpus = PlaintextCorpusReader(corpusdir, '.*')
Примечание: что
PlaintextCorpusReader
использовать по умолчаниюnltk.tokenize.sent_tokenize()
иnltk.tokenize.word_tokenize()
чтобы разделить ваши тексты на предложения и слова, и эти функции построены для английского языка, это может не работа для всех языков.вот полный код с созданием тестовых текстовых файлов и как создать корпус с NLTK и как получить доступ к корпус на разных уровнях:
import os from nltk.corpus.reader.plaintext import PlaintextCorpusReader # Let's create a corpus with 2 texts in different textfile. txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" txt2 = """Are you a foo bar? Yes I am. Possibly, everyone is.\n""" corpus = [txt1,txt2] # Make new dir for the corpus. corpusdir = 'newcorpus/' if not os.path.isdir(corpusdir): os.mkdir(corpusdir) # Output the files into the directory. filename = 0 for text in corpus: filename+=1 with open(corpusdir+str(filename)+'.txt','w') as fout: print>>fout, text # Check that our corpus do exist and the files are correct. assert os.path.isdir(corpusdir) for infile, text in zip(sorted(os.listdir(corpusdir)),corpus): assert open(corpusdir+infile,'r').read().strip() == text.strip() # Create a new corpus by specifying the parameters # (1) directory of the new corpus # (2) the fileids of the corpus # NOTE: in this case the fileids are simply the filenames. newcorpus = PlaintextCorpusReader('newcorpus/', '.*') # Access each file in the corpus. for infile in sorted(newcorpus.fileids()): print infile # The fileids of each file. with newcorpus.open(infile) as fin: # Opens the file. print fin.read().strip() # Prints the content of the file print # Access the plaintext; outputs pure string/basestring. print newcorpus.raw().strip() print # Access paragraphs in the corpus. (list of list of list of strings) # NOTE: NLTK automatically calls nltk.tokenize.sent_tokenize and # nltk.tokenize.word_tokenize. # # Each element in the outermost list is a paragraph, and # Each paragraph contains sentence(s), and # Each sentence contains token(s) print newcorpus.paras() print # To access pargraphs of a specific fileid. print newcorpus.paras(newcorpus.fileids()[0]) # Access sentences in the corpus. (list of list of strings) # NOTE: That the texts are flattened into sentences that contains tokens. print newcorpus.sents() print # To access sentences of a specific fileid. print newcorpus.sents(newcorpus.fileids()[0]) # Access just tokens/words in the corpus. (list of strings) print newcorpus.words() # To access tokens of a specific fileid. print newcorpus.words(newcorpus.fileids()[0])
наконец, чтобы прочитать каталог текстов и создать корпус NLTK на других языках, вы должны сначала убедиться, что у вас есть python-callable слово "маркирование" и приговор разметки модули, которые принимают строку / basestring вход и производит такой вывод:
>>> from nltk.tokenize import sent_tokenize, word_tokenize >>> txt1 = """This is a foo bar sentence.\nAnd this is the first txtfile in the corpus.""" >>> sent_tokenize(txt1) ['This is a foo bar sentence.', 'And this is the first txtfile in the corpus.'] >>> word_tokenize(sent_tokenize(txt1)[0]) ['This', 'is', 'a', 'foo', 'bar', 'sentence', '.']