Я считал, что часто ответ на мой заголовок - пойти и прочитать документацию, но я пробежался по книге NLTK, но она не дает ответа. Я новичок в Python.
У меня есть куча .txt
файлов, и я хочу иметь возможность использовать функции корпуса, которые NLTK предоставляет для корпуса nltk_data
.
Я пробовал, PlaintextCorpusReader
но не смог продвинуться дальше:
>>>import nltk
>>>from nltk.corpus import PlaintextCorpusReader
>>>corpus_root = './'
>>>newcorpus = PlaintextCorpusReader(corpus_root, '.*')
>>>newcorpus.words()
Как сегментировать newcorpus
предложения с помощью пунктов? Я пробовал использовать функции punkt, но функции punkt не могли читать PlaintextCorpusReader
класс?
Не могли бы вы также рассказать мне, как записать сегментированные данные в текстовые файлы?
После нескольких лет выяснения того, как это работает, вот обновленное руководство по
Как создать корпус NLTK с каталогом текстовых файлов?
Основная идея - использовать пакет nltk.corpus.reader . В случае, если у вас есть каталог текстовых файлов на английском языке , лучше всего использовать PlaintextCorpusReader .
Если у вас есть каталог, который выглядит так:
Просто используйте эти строки кода, и вы можете получить корпус:
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 корпус в других языках, вы должны сначала убедиться , что у вас есть питон-вызываемые слова лексических и предложение лексемизации модули , которые принимают строку / 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', '.']
источник
AttributeError: __exit__
ошибка. Использоватьopen()
вместоwith()
>>> import nltk >>> from nltk.corpus import PlaintextCorpusReader >>> corpus_root = './' >>> newcorpus = PlaintextCorpusReader(corpus_root, '.*') """ if the ./ dir contains the file my_corpus.txt, then you can view say all the words it by doing this """ >>> newcorpus.words('my_corpus.txt')
источник
from nltk.corpus.reader.plaintext import PlaintextCorpusReader filecontent1 = "This is a cow" filecontent2 = "This is a Dog" corpusdir = 'nltk_data/' with open(corpusdir + 'content1.txt', 'w') as text_file: text_file.write(filecontent1) with open(corpusdir + 'content2.txt', 'w') as text_file: text_file.write(filecontent2) text_corpus = PlaintextCorpusReader(corpusdir, ["content1.txt", "content2.txt"]) no_of_words_corpus1 = len(text_corpus.words("content1.txt")) print(no_of_words_corpus1) no_of_unique_words_corpus1 = len(set(text_corpus.words("content1.txt"))) no_of_words_corpus2 = len(text_corpus.words("content2.txt")) no_of_unique_words_corpus2 = len(set(text_corpus.words("content2.txt"))) enter code here
источник