Gắn thẻ POS bằng NLTK và Chunking trong NLP [VÍ DỤ]

⚡ Tóm tắt thông minh

Gắn thẻ từ loại (POS Tagging) gán từ loại cho mỗi từ trong câu, trong khi phân đoạn (Chunking) nhóm các từ đã được gắn thẻ đó thành các cụm từ có nghĩa như cụm danh từ, bổ sung cấu trúc nông mà NLTK xây dựng bằng biểu thức chính quy. Python.

  • 🏷️ Gắn thẻ POS: Mỗi từ nhận được một mã ngữ pháp như NN, VB hoặc JJ từ ngữ cảnh của nó.
  • 🌿 Phân đoạn: Các từ được gắn thẻ được nhóm lại thành các cụm từ, một quá trình cũng được gọi là phân tích cú pháp nông.
  • 🔤 Quy trình làm việc: Đầu tiên, tách văn bản thành các token, sau đó áp dụng pos_tag, rồi phân tích cú pháp bằng ngữ pháp RegexpParser.
  • 📊 Thẻ đếm: Counter và FreqDist giúp tiết lộ tần suất xuất hiện của thẻ và từ khóa để phục vụ cho việc thiết kế đặc trưng.
  • 🔗 Các cụm từ cố định: Các cặp từ (bigram) và bộ ba từ (trigram) nắm bắt các cặp từ và bộ ba từ để tạo nên các đặc điểm văn bản mạnh mẽ hơn.
  • 🤖 Sử dụng AI: Các công cụ gắn thẻ dựa trên học máy và mô hình HMM xử lý các từ mơ hồ theo phương pháp xác suất.

Gắn thẻ POS với NLTK và Chunking trong NLP

Gắn thẻ POS

Gắn thẻ POS (Gắn thẻ từ loại) là một quy trình đánh dấu các từ trong văn bản để xác định từ loại cụ thể dựa trên định nghĩa và ngữ cảnh của từ đó. Nó chịu trách nhiệm đọc văn bản trong một ngôn ngữ và gán một mã số cụ thể (từ loại) cho mỗi từ. Nó còn được gọi là gắn thẻ ngữ pháp.

Hãy cùng học với một ví dụ về Từ loại trong NLTK:

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

Các bước liên quan đến ví dụ gắn thẻ POS

  • Mã hóa văn bản (word_tokenize)
  • Áp dụng pos_tag vào bước trên, tức là nltk.pos_tag(tokenize_text)

Dưới đây là một số ví dụ về thẻ POS của NLTK:

Viết tắt Ý nghĩa
CC phối hợp cùng
CD chữ số hồng y
DT người xác định
EX tồn tại ở đó
FW từ nước ngoài
IN giới từ/liên từ phụ thuộc
JJ tính từ
JJR tính từ, so sánh
JJS tính từ, so sánh nhất
LS niêm yết thị trường
MD phương thức
NN danh từ, số ít
NNS danh từ số nhiều
NNP danh từ riêng, số ít
NNPS danh từ riêng, số nhiều
PDT yếu tố quyết định trước
POS kết thúc sở hữu
PRP đại từ nhân xưng
PRP$ đại từ sở hữu
RB trạng từ
RBR trạng từ, so sánh
RBS trạng từ, so sánh nhất
RP hạt
ĐẾN dấu vô cực
UH tiếng lóng
VB động từ
GBV động từ dạng gerund
VBĐD động từ thì quá khứ
VBN động từ phân từ quá khứ
VBP động từ, thì hiện tại không phải ngôi thứ ba số ít
VBZ Động từ, thì hiện tại với ngôi thứ ba số ít
wdt xác định wh
WP đại từ wh
VIẾT trạng từ wh

Danh sách thẻ POS NLTK ở trên chứa tất cả các thẻ POS của NLTK. Trình gắn thẻ POS NLTK được sử dụng để gán thông tin ngữ pháp cho mỗi từ trong câu. Việc cài đặt, nhập và tải xuống tất cả các gói POS NLTK hiện đã hoàn tất.

Chunking trong NLP là gì?

Chunk Trong xử lý ngôn ngữ tự nhiên (NLP), phân đoạn (chunking) là một quá trình lấy những mẩu thông tin nhỏ và nhóm chúng lại thành những đơn vị lớn hơn. Công dụng chính của phân đoạn là tạo ra các nhóm "cụm danh từ". Nó được sử dụng để thêm cấu trúc cho câu bằng cách kết hợp gắn thẻ từ loại (POS tagging) với biểu thức chính quy. Nhóm từ thu được được gọi là "chunks". Nó cũng được gọi là phân tích cú pháp nông (shallow parsing).

Trong phân tích cú pháp nông (shallow parsing), chỉ có tối đa một cấp độ giữa gốc và lá, trong khi phân tích cú pháp sâu (deep parsing) bao gồm nhiều hơn một cấp độ. Phân tích cú pháp nông còn được gọi là phân tích cú pháp đơn giản (light parsing) hoặc phân đoạn (chunking).

Quy tắc chia nhỏ

Không có quy tắc nào được định sẵn, nhưng bạn có thể kết hợp chúng tùy theo nhu cầu và yêu cầu. Ví dụ, giả sử bạn cần gắn thẻ Danh từ, động từ (thì quá khứ), tính từ và liên từ phối hợp từ câu. Bạn có thể sử dụng quy tắc dưới đây:

chunk:{***?}

Bảng dưới đây cho thấy ý nghĩa của các ký hiệu khác nhau:

Tên ký hiệu Mô tả Chi tiết
. Bất kỳ ký tự nào ngoại trừ dòng mới
* Khớp 0 hoặc nhiều lần lặp lại
? Khớp 0 hoặc 1 lần lặp lại

Bây giờ chúng ta hãy viết mã để hiểu rõ hơn về quy tắc này.

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{***?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

Đầu ra:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       '***?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

Kết luận từ việc gắn thẻ Phần bài phát biểu ở trên Python Ví dụ, "make" là một động từ không nằm trong quy tắc, vì vậy nó không được gắn thẻ là mychunk.

Trường hợp sử dụng Chunking

Phân đoạn câu được sử dụng để phát hiện thực thể. Thực thể là một phần của câu mà máy tính dùng để lấy giá trị cho bất kỳ ý định nào.

Example:
Temperature of New York.
Here Temperature is the intention and New York is an entity.

Nói cách khác, phân đoạn (chunking) được sử dụng để chọn các tập con của từ (token). Vui lòng theo dõi đoạn mã bên dưới để hiểu cách phân đoạn được sử dụng để chọn các từ. Trong ví dụ này, bạn sẽ thấy một đồ thị tương ứng với một đoạn của cụm danh từ.

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {
?*}" cp =nltk.RegexpParser(grammar) result = cp.parse(tag) print(result) result.draw() # It will draw the pattern graphically which can be seen in Noun Phrase chunking

Đầu ra:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

Biểu đồ phân đoạn danh từ

Biểu đồ phân chia cụm danh từ

Từ biểu đồ, ta có thể kết luận rằng “learn” và “guru99” là hai token khác nhau nhưng được phân loại là cụm danh từ, trong khi token “from” không thuộc cụm danh từ. Phân đoạn (Chunking) được sử dụng để phân loại các token khác nhau vào cùng một nhóm (chunk). Kết quả sẽ phụ thuộc vào ngữ pháp đã được chọn. Hơn nữa, phân đoạn trong NLTK được sử dụng để gắn thẻ các mẫu và khám phá các kho ngữ liệu văn bản.

Đếm thẻ POS

Chúng tôi đã thảo luận nhiều pos_tag Các giá trị đã được đề cập trước đó. Ở đây, bạn sẽ nghiên cứu cách đếm các thẻ này. Việc đếm thẻ rất quan trọng đối với phân loại văn bản và chuẩn bị các đặc trưng cho các hoạt động xử lý ngôn ngữ tự nhiên. Trước tiên, chúng ta sẽ viết mã hoạt động và sau đó giải thích các bước.

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

Đầu ra:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1, 'DT': 1, 'JJS': 1, 'JJ': 1, 'JJR': 1, 'IN': 1, 'VB': 1, 'RB': 1})

Giải thích chi tiết mã nguồn:

  1. Hãy sử dụng gói Counter từ mô-đun collections. Counter là một lớp con của từ điển, lưu trữ các phần tử dưới dạng khóa và số lượng của chúng dưới dạng giá trị.
  2. Nhập nltk để phân tách văn bản thành các token.
  3. Viết văn bản có pos_tag bạn muốn đếm.
  4. Chuyển đổi tất cả các từ thành chữ thường trước khi phân tách từ.
  5. Đưa các từ vào hàm word_tokenize và tính toán pos_tag của mỗi token.
  6. Sau đó, bộ đếm sẽ đếm tổng số lần xuất hiện của mỗi thẻ trong văn bản.

Phân phối tần số

Phân phối tần suất đề cập đến số lần một kết quả của thí nghiệm xảy ra. Nó được sử dụng để tìm tần suất xuất hiện của mỗi từ trong một tài liệu. Nó sử dụng... Khoảng cách tần số lớp được định nghĩa bởi nltk.probability mô-đun. Bộ đếm được tăng lên một mỗi khi có một mẫu xuất hiện.

Với bất kỳ từ nào, chúng ta đều có thể kiểm tra số lần từ đó xuất hiện trong tài liệu. Ví dụ:

  • Phương pháp đếm: freq_dist.count('and') trả về số lần xuất hiện của 'and'. Nó được gọi là phương thức đếm.
  • Phương pháp tần số: freq_dist.freq('and') trả về tần số của một mẫu nhất định.

Chúng ta sẽ viết một chương trình nhỏ để tính toán phân bố tần suất xuất hiện của mỗi từ trong văn bản.

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

Giải thích mã:

  1. Nhập mô-đun nltk.
  2. Viết đoạn văn có cách phân bố từ mà bạn cần tìm.
  3. Phân tách từng từ trong văn bản thành các token, sau đó dùng chúng làm đầu vào cho mô-đun FreqDist của nltk.
  4. Áp dụng từng từ vào nltk.FreqDist dưới dạng một danh sách.
  5. Vẽ các từ lên đồ thị bằng hàm plot().

LƯU Ý: Bạn cần cài đặt matplotlib để xem biểu đồ. Nó đếm số lần xuất hiện của mỗi từ trong văn bản và hỗ trợ phân tích cảm xúc dựa trên văn bản. Thuật ngữ chính là “tokenize”: sau khi tokenize, mỗi từ được kiểm tra để xác định số lần xuất hiện của nó.

Collocations: Bigrams và Trigrams

Cụm từ cố định là những cặp từ xuất hiện cùng nhau nhiều lần trong một tài liệu. Nó được tính bằng tỷ lệ giữa số lần các cặp từ đó xuất hiện cùng nhau với tổng số từ trong tài liệu.

Hãy xem xét các từ như tia cực tím và tia hồng ngoại. Từ "tia cực tím" và "tia" không được sử dụng riêng lẻ và do đó có thể được coi là một cụm từ cố định. Một ví dụ khác là chụp CT, vì chúng ta không nói "CT" và "Scan" riêng biệt. Cụm từ cố định có thể được phân loại thành hai loại:

  • Cặp chữ số: sự kết hợp của hai từ
  • Quẻ: sự kết hợp của ba từ

Bigram và Trigram cung cấp các tính năng có ý nghĩa và hữu ích hơn, ví dụ như tính năng này.tracgiai đoạn diễn đạt. Chúng đặc biệt hữu ích trong phân tích cảm xúc dựa trên văn bản.

Ví dụ về Bigram Code:

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

Đầu ra:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

Ví dụ về quẻ ba vạch Code:

Đôi khi việc xem một cặp ba từ trong câu để phân tích thống kê và đếm tần số trở nên quan trọng. Điều này một lần nữa đóng vai trò quan trọng trong việc hình thành NLP (Xử lý ngôn ngữ tự nhiên) bao gồm các tính năng cũng như dự đoán cảm xúc dựa trên văn bản. Mã lệnh tương tự được sử dụng để tính toán các bộ ba chữ cái.

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

Đầu ra:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]

Gắn thẻ câu

Gắn thẻ câu nghĩa là thêm các nhãn như động từ hoặc danh từ dựa trên ngữ cảnh của câu. Việc xác định thẻ POS rất phức tạp, vì vậy việc gắn thẻ chung chung không thể thực hiện thủ công, vì một số từ có nghĩa mơ hồ tùy thuộc vào cấu trúc câu. Chuyển đổi văn bản thành danh sách là một bước quan trọng trước khi gắn thẻ, vì mỗi từ được lặp lại và đếm cho một thẻ cụ thể.

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

Code Giải thích:

  1. Code để nhập nltk (Natural) Language Toolbộ công cụ này bao gồm các mô-đun con như phân tách câu và phân tách từ.
  2. Văn bản có thẻ sẽ được in.
  3. Phân tách câu thành các từ riêng biệt.
  4. Một vòng lặp for được triển khai để tách các từ trong câu và thẻ (tag) của mỗi từ được in ra làm kết quả.

Trong một tập dữ liệu văn bản (Corpus), có hai loại bộ gắn thẻ từ loại (POS tagger):

1. Công cụ gắn thẻ POS dựa trên quy tắc: Đối với những từ có nghĩa mơ hồ, người ta áp dụng phương pháp dựa trên quy tắc và thông tin ngữ cảnh. Điều này được thực hiện bằng cách phân tích nghĩa của từ đứng trước hoặc đứng sau. Do đó, các từ được gắn thẻ theo các quy tắc ngữ pháp của một ngôn ngữ cụ thể, chẳng hạn như viết hoa và dấu câu. Ví dụ: công cụ gắn thẻ của Brill.

2. Công cụ gắn thẻ POS ngẫu nhiên: Phương pháp này áp dụng các cách tiếp cận như tần suất hoặc xác suất. Nếu một từ được gắn thẻ cụ thể nhiều nhất trong tập huấn luyện, nó sẽ được gán thẻ đó trong câu kiểm tra. Thẻ của từ không chỉ phụ thuộc vào thẻ của chính nó mà còn phụ thuộc vào thẻ trước đó, vì vậy phương pháp này không phải lúc nào cũng chính xác.

Gắn thẻ POS bằng mô hình Markov ẩn

Các bài toán gắn thẻ cũng có thể được mô hình hóa bằng Mô hình Markov ẩn (HMM). Mô hình này coi các token đầu vào là một chuỗi quan sát được, trong khi các thẻ được coi là các trạng thái ẩn, và mục tiêu là xác định chuỗi trạng thái ẩn. Ví dụ: x = x1,x2,…,xn, trong đó x là một chuỗi token, còn y = y1,y2,y3,y4…yn là chuỗi ẩn.

Mô hình Markov ẩn (HMM) hoạt động như thế nào?

HMM sử dụng phân phối chung P(x, y), trong đó x là chuỗi mã thông báo đầu vào và y là chuỗi thẻ. Chuỗi thẻ cho x sẽ là argmax trên y1…yn của p(x1,x2,…xn,y1,y2,y3,…). Chúng ta đã phân loại các thẻ từ văn bản, nhưng thống kê của các thẻ này rất quan trọng, vì vậy phần tiếp theo là đếm các thẻ này để nghiên cứu thống kê.

Câu Hỏi Thường Gặp

Gắn thẻ POS (Positive Dictionary) gán cho mỗi từ riêng lẻ một loại từ cụ thể, ví dụ như danh từ hoặc động từ. Phân đoạn (Chunking) tiến thêm một bước nữa bằng cách nhóm các từ đã được gắn thẻ đó thành các cụm từ, chẳng hạn như cụm danh từ, tạo cho câu một cấu trúc đơn giản hơn.

Phân tích cú pháp nông, còn được gọi là phân đoạn hoặc phân tích cú pháp nhẹ, chỉ giữ tối đa một cấp độ giữa gốc và lá. Nó xác định ranh giới cụm từ mà không cần xây dựng cây phân tích cú pháp hoàn chỉnh, do đó nhanh hơn so với phân tích cú pháp sâu.

Việc nhóm các từ được gắn thẻ thành các cụm từ, cho phép hệ thống phát hiện các thực thể như người, địa điểm, ngày tháng hoặc sản phẩm. Nhận dạng thực thể được đặt tên dựa vào các nhóm từ này để...tracTìm giá trị có ý nghĩa từ văn bản thô.

Hàm nltk.pos_tag() gán các thẻ từ loại. Đầu tiên, bạn phân tách văn bản thành các token bằng word_tokenize, sau đó truyền danh sách token cho pos_tag, hàm này sẽ trả về mỗi từ được ghép nối với thẻ của nó như NN, VB hoặc JJ.

Đúng vậy. Các công cụ gắn thẻ AI hiện đại được đào tạo bằng máy học và mạng nơ-ron sâu giải quyết các từ mơ hồ bằng cách học ngữ cảnh từ các kho dữ liệu lớn, đạt độ chính xác cao hơn so với các phương pháp dựa trên quy tắc trên văn bản thực tế.

Các thuật toán gắn thẻ ngẫu nhiên sử dụng xác suất được học từ dữ liệu huấn luyện. Máy học ước tính xác suất xuất hiện của mỗi thẻ đối với một từ dựa trên các thẻ xung quanh, sau đó chọn chuỗi có xác suất tổng thể cao nhất.

Bên cạnh đó NLTKCác lựa chọn phổ biến bao gồm spaCy Để có quy trình sản xuất nhanh, hãy sử dụng Stanford CoreNLP và Hugging Face Transformers để gắn thẻ dựa trên bộ chuyển đổi.

Trong ngữ pháp khối, dấu chấm khớp với bất kỳ ký tự nào ngoại trừ ký tự xuống dòng, dấu hoa thị khớp với không hoặc nhiều lần lặp lại, và dấu chấm hỏi khớp với không hoặc một lần lặp lại của mẫu thẻ POS đứng trước.

Tóm tắt bài viết này với: