Tạo kho ngữ liệu mới với NLTK


83

Tôi nghĩ rằng thường câu trả lời cho tiêu đề của tôi là đi và đọc các tài liệu, nhưng tôi đã xem qua cuốn sách NLTK nhưng nó không đưa ra câu trả lời. Tôi là người mới sử dụng Python.

Tôi có một loạt .txttệp và tôi muốn có thể sử dụng các hàm ngữ liệu mà NLTK cung cấp cho kho tài liệu nltk_data.

Tôi đã cố gắng PlaintextCorpusReadernhưng tôi không thể tiến xa hơn:

>>>import nltk
>>>from nltk.corpus import PlaintextCorpusReader
>>>corpus_root = './'
>>>newcorpus = PlaintextCorpusReader(corpus_root, '.*')
>>>newcorpus.words()

Làm cách nào để phân đoạn các newcorpuscâu bằng punkt? Tôi đã thử sử dụng các hàm punkt nhưng các hàm punkt không thể đọc PlaintextCorpusReaderlớp?

Bạn cũng có thể hướng dẫn tôi cách tôi có thể ghi dữ liệu đã phân đoạn vào tệp văn bản được không?

Câu trả lời:


40

Tôi nghĩ rằng các PlaintextCorpusReaderphân đoạn đầu vào đã được phân đoạn bằng một tokenizer punkt, ít nhất là nếu ngôn ngữ đầu vào của bạn là tiếng Anh.

Hàm tạo của 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'):

Bạn có thể chuyển cho người đọc một trình mã hóa từ và câu, nhưng đối với phần sau thì mặc định đã là như vậy nltk.data.LazyLoader('tokenizers/punkt/english.pickle').

Đối với một chuỗi đơn, một tokenizer sẽ được sử dụng như sau (giải thích ở đây , xem phần 5 cho punkt tokenizer).

>>> 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())

cảm ơn vì lời giải thích. Hiểu rồi. nhưng làm cách nào để xuất các câu được phân đoạn thành tệp txt riêng biệt?
alvas


67

Sau một số năm tìm hiểu cách thức hoạt động, đây là hướng dẫn cập nhật của

Làm thế nào để tạo một kho ngữ liệu NLTK với một thư mục các tệp văn bản?

Ý tưởng chính là sử dụng gói nltk.corpus.reader . Trong trường hợp bạn có một thư mục các tệp văn bản bằng tiếng Anh , tốt nhất bạn nên sử dụng PlaintextCorpusReader .

Nếu bạn có một thư mục giống như sau:

newcorpus/
         file1.txt
         file2.txt
         ...

Chỉ cần sử dụng những dòng mã này và bạn có thể nhận được một kho tài liệu:

import os
from nltk.corpus.reader.plaintext import PlaintextCorpusReader

corpusdir = 'newcorpus/' # Directory of corpus.

newcorpus = PlaintextCorpusReader(corpusdir, '.*')

LƯU Ý: rằng PlaintextCorpusReaderwill sử dụng mặc định nltk.tokenize.sent_tokenize()nltk.tokenize.word_tokenize()để chia văn bản của bạn thành câu và từ và các chức năng này được xây dựng cho tiếng Anh, nó có thể KHÔNG hoạt động cho tất cả các ngôn ngữ.

Dưới đây là toàn bộ mã với việc tạo các tệp văn bản thử nghiệm và cách tạo một kho tài liệu với NLTK và cách truy cập kho văn bản ở các cấp độ khác nhau:

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])

Cuối cùng, để đọc một thư mục các văn bản và tạo ra một corpus NLTK bằng các ngôn ngữ khác, trước tiên bạn phải đảm bảo rằng bạn có một con trăn-callable từ tokenizationcâu tokenization module mất chuỗi / basestring đầu vào và sản lượng sản xuất như:

>>> 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', '.']

Cảm ơn bạn đã làm rõ. Tuy nhiên, nhiều ngôn ngữ được hỗ trợ theo mặc định.
Andrew Tobey

1
Nếu ai đó AttributeError: __exit__gặp lỗi. Sử dụng open()thay vìwith()
Tasdik Rahman

12
 >>> 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')

Gây ra một số vấn đề cho ngôn ngữ devnagari.
ashim888

0
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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.