Corpus reader và Custom Corpora

Kho ngữ liệu là gì?

Kho ngữ liệu là một bộ sưu tập lớn, ở định dạng có cấu trúc, các văn bản có thể đọc được bằng máy đã được tạo ra trong môi trường giao tiếp tự nhiên. Từ Corpora là số nhiều của Corpus. Corpus có thể được bắt nguồn theo nhiều cách như sau:

  • Từ văn bản ban đầu là điện tử
  • Từ bản ghi của ngôn ngữ nói
  • Từ nhận dạng ký tự quang học, v.v.

Tính đại diện của Corpus, Số dư Corpus, Lấy mẫu, Kích thước Corpus là những yếu tố đóng vai trò quan trọng trong khi thiết kế kho dữ liệu. Một số ngữ liệu phổ biến nhất cho các nhiệm vụ NLP là TreeBank, PropBank, VarbNet và WordNet.

Làm thế nào để xây dựng kho dữ liệu tùy chỉnh?

Trong khi tải xuống NLTK, chúng tôi cũng đã cài đặt gói dữ liệu NLTK. Vì vậy, chúng tôi đã cài đặt gói dữ liệu NLTK trên máy tính của mình. Nếu chúng ta nói về Windows, chúng ta sẽ giả định rằng gói dữ liệu này được cài đặt tạiC:\natural_language_toolkit_data và nếu chúng ta nói về Linux, Unix và Mac OS X, chúng ta sẽ giả định rằng gói dữ liệu này được cài đặt tại /usr/share/natural_language_toolkit_data.

Trong công thức Python sau đây, chúng ta sẽ tạo kho ngữ liệu tùy chỉnh phải nằm trong một trong các đường dẫn do NLTK xác định. Nó là như vậy bởi vì nó có thể được tìm thấy bởi NLTK. Để tránh xung đột với gói dữ liệu NLTK chính thức, chúng ta hãy tạo một thư mục natural_language_toolkit_data tùy chỉnh trong thư mục chính của chúng ta.

import os, os.path
path = os.path.expanduser('~/natural_language_toolkit_data')
if not os.path.exists(path):
   os.mkdir(path)
os.path.exists(path)

Đầu ra

True

Bây giờ, chúng ta hãy kiểm tra xem chúng ta có thư mục natural_language_toolkit_data trong thư mục chính hay không -

import nltk.data
path in nltk.data.path

Đầu ra

True

Khi chúng ta có đầu ra Đúng, nghĩa là chúng ta có nltk_data thư mục trong thư mục chính của chúng tôi.

Bây giờ chúng ta sẽ tạo một tệp danh sách từ, có tên wordfile.txt và đặt nó vào một thư mục, có tên là kho tài liệu trong nltk_data danh mục (~/nltk_data/corpus/wordfile.txt) và sẽ tải nó bằng cách sử dụng nltk.data.load -

import nltk.data
nltk.data.load(‘corpus/wordfile.txt’, format = ‘raw’)

Đầu ra

b’tutorialspoint\n’

Độc giả Corpus

NLTK cung cấp nhiều lớp CorpusReader khác nhau. Chúng tôi sẽ giới thiệu chúng trong các công thức nấu ăn từ trăn sau đây

Tạo kho ngữ liệu danh sách từ

NLTK có WordListCorpusReaderlớp cung cấp quyền truy cập vào tệp chứa danh sách các từ. Đối với công thức Python sau, chúng ta cần tạo một tệp danh sách từ có thể là tệp CSV hoặc tệp văn bản bình thường. Ví dụ: chúng tôi đã tạo một tệp có tên 'danh sách' chứa dữ liệu sau:

tutorialspoint
Online
Free
Tutorials

Bây giờ Hãy để chúng tôi khởi tạo một WordListCorpusReader lớp tạo ra danh sách các từ từ tệp đã tạo của chúng tôi ‘list’.

from nltk.corpus.reader import WordListCorpusReader
reader_corpus = WordListCorpusReader('.', ['list'])
reader_corpus.words()

Đầu ra

['tutorialspoint', 'Online', 'Free', 'Tutorials']

Tạo kho ngữ liệu từ được gắn thẻ POS

NLTK có TaggedCorpusReadervới sự trợ giúp của chúng tôi có thể tạo một kho ngữ liệu từ được gắn thẻ POS. Trên thực tế, gắn thẻ POS là quá trình xác định thẻ phần của giọng nói cho một từ.

Một trong những định dạng đơn giản nhất cho ngữ liệu được gắn thẻ là có dạng 'từ / thẻ' giống như đoạn trích sau từ ngữ liệu màu nâu -

The/at-tl expense/nn and/cc time/nn involved/vbn are/ber
astronomical/jj ./.

Trong đoạn trích trên, mỗi từ có một thẻ biểu thị POS của nó. Ví dụ,vb đề cập đến một động từ.

Bây giờ Hãy để chúng tôi khởi tạo một TaggedCorpusReaderlớp sản xuất các từ được gắn thẻ POS tạo thành tệp ‘list.pos’, trong đó có đoạn trích trên.

from nltk.corpus.reader import TaggedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.pos')
reader_corpus.tagged_words()

Đầu ra

[('The', 'AT-TL'), ('expense', 'NN'), ('and', 'CC'), ...]

Tạo kho ngữ liệu cụm từ Chunked

NLTK có ChnkedCorpusReadervới sự trợ giúp của chúng tôi có thể tạo một kho ngữ liệu cụm từ Chunked. Trên thực tế, một đoạn là một cụm từ ngắn trong một câu.

Ví dụ: chúng tôi có đoạn trích sau từ thẻ được gắn thẻ treebank ngữ liệu -

[Earlier/JJR staff-reduction/NN moves/NNS] have/VBP trimmed/VBN about/
IN [300/CD jobs/NNS] ,/, [the/DT spokesman/NN] said/VBD ./.

Trong đoạn trích trên, mỗi đoạn đều là một cụm danh từ nhưng những từ không nằm trong ngoặc đều thuộc cây câu và không thuộc bất kỳ cây con cụm danh từ nào.

Bây giờ Hãy để chúng tôi khởi tạo một ChunkedCorpusReader lớp sản xuất cụm từ phân đoạn từ tệp ‘list.chunk’, trong đó có đoạn trích trên.

from nltk.corpus.reader import ChunkedCorpusReader
reader_corpus = TaggedCorpusReader('.', r'.*\.chunk')
reader_corpus.chunked_words()

Đầu ra

[
   Tree('NP', [('Earlier', 'JJR'), ('staff-reduction', 'NN'), ('moves', 'NNS')]),
   ('have', 'VBP'), ...
]

Tạo kho văn bản được phân loại

NLTK có CategorizedPlaintextCorpusReadervới sự trợ giúp của chúng tôi có thể tạo một kho ngữ liệu văn bản được phân loại. Nó rất hữu ích trong trường hợp chúng ta có một kho văn bản lớn và muốn phân loại nó thành các phần riêng biệt.

Ví dụ, kho màu nâu có nhiều loại khác nhau. Hãy để chúng tôi tìm hiểu chúng với sự trợ giúp của mã Python sau:

from nltk.corpus import brown^M
brown.categories()

Đầu ra

[
   'adventure', 'belles_lettres', 'editorial', 'fiction', 'government',
   'hobbies', 'humor', 'learned', 'lore', 'mystery', 'news', 'religion',
   'reviews', 'romance', 'science_fiction'
]

Một trong những cách dễ nhất để phân loại một kho ngữ liệu là có một tệp cho mọi danh mục. Ví dụ: chúng ta hãy xem hai đoạn trích từmovie_reviews ngữ liệu -

movie_pos.txt

Đường kẻ mỏng màu đỏ là thiếu sót nhưng nó gây ấn tượng mạnh.

movie_neg.txt

Kinh phí lớn và sản xuất hào nhoáng không thể bù đắp cho sự thiếu tự nhiên tràn ngập chương trình truyền hình của họ.

Vì vậy, từ hai tệp trên, chúng ta có hai danh mục cụ thể là posneg.

Bây giờ hãy để chúng tôi khởi tạo một CategorizedPlaintextCorpusReader lớp học.

from nltk.corpus.reader import CategorizedPlaintextCorpusReader
reader_corpus = CategorizedPlaintextCorpusReader('.', r'movie_.*\.txt',
cat_pattern = r'movie_(\w+)\.txt')
reader_corpus.categories()
reader_corpus.fileids(categories = [‘neg’])
reader_corpus.fileids(categories = [‘pos’])

Đầu ra

['neg', 'pos']
['movie_neg.txt']
['movie_pos.txt']