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

Gắn thẻ POS

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

Hãy cùng tìm hiểu với một ví dụ về Phần lời nói của NLTK:

Đầu vào: Mọi thứ đều cho phép chúng tôi.

Đầu ra: [('Mọi thứ', 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 cho bước trên là nltk.pos_tag(tokenize_text)

Ví dụ về thẻ NLTK POS như sau:

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 Thẻ POS NLTK này là một tính từ (lớn)
JJR tính từ, so sánh (lớn hơn)
JJS tính từ, so sánh nhất (lớn nhất)
LS niêm yết thị trường
MD phương thức (có thể, sẽ)
NN danh từ, số ít (mèo, cây)
NNS danh từ số nhiều (bàn làm việc)
NNP danh từ riêng, số ít (sarah)
NNPS danh từ riêng, số nhiều (người Ấn Độ hoặc người Mỹ)
PDT người xác định trước (tất cả, cả hai, một nửa)
POS kết thúc sở hữu (parent\ 's)
PRP đại từ nhân xưng (cô ấy, chính cô ấy, anh ấy, chính anh ấy)
PRP$ đại từ sở hữu (cô ấy, của anh ấy, của tôi, của tôi, của chúng tôi)
RB trạng từ (thỉnh thoảng, nhanh chóng)
RBR trạng từ, so sánh (lớn hơn)
RBS trạng từ, so sánh nhất (lớn nhất)
RP hạt (khoảng)
ĐẾN điểm đánh dấu vô hạn (đến)
UH sự cảm thán (tạm biệt)
VB động từ (hỏi)
GBV động từ gerund (đánh giá)
VBĐD Động từ thì quá khứ (cầu xin)
VBN động từ quá khứ phân từ (thống nhất)
VBP động từ, thì hiện tại không phải ngôi thứ 3 số ít(bọc)
VBZ động từ, thì hiện tại với ngôi thứ 3 số ít (cơ sở)
wdt wh-determiner (cái đó, cái gì)
WP wh- đại từ (ai)
VIẾT wh- trạng từ (như thế nào)

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

Chunking trong NLP là gì?

Chunk trong NLP là một quá trình lấy các phần thông tin nhỏ và nhóm chúng thành các đơn vị lớn. Công dụng chính của Chunking là tạo ra các nhóm “cụm danh từ”. Nó được sử dụng để thêm cấu trúc vào câu bằng cách theo sau gắn thẻ POS kết hợp với các biểu thức chính quy. Nhóm từ kết quả được gọi là “chunks”. Nó cũng được gọi là phân tích cú pháp nông.

Trong phân tích cú pháp nông, có tối đa một cấp độ giữa gốc và lá trong khi phân tích sâu bao gồm nhiều cấp độ. Phân tích cú pháp nông còn được gọi là phân tích cú pháp nhẹ hoặc phân đoạn.

Quy tắc chia nhỏ

Không có quy tắc nào được xác định trước, nhưng bạn có thể kết hợp chúng theo nhu cầu và yêu cầu.

Ví dụ: bạn cần gắn thẻ Danh từ, động từ (thì quá khứ), tính từ và nối từ phối hợp trong câu. Bạn có thể sử dụng quy tắc như dưới đây

khúc:{ * * * ?}

Bảng sau đâ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

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:{<NN.?>*<VBD.?>*<JJ.?>*<CC>?}"""
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:
       <ChunkRule: '<NN.?>*<VBD.?>*<JJ.?>*<CC>?'>
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 có trong quy tắc nên nó không được gắn thẻ là mychunk

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

Chunking được sử dụng để phát hiện thực thể. Thực thể là một phần của câu mà qua đó máy nhận được 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 được sử dụng để chọn các tập hợp con của mã thông báo. Vui lòng làm theo đoạn mã dưới đây để hiểu cách sử dụng chunking để chọn mã thông báo. Trong ví dụ này, bạn sẽ thấy biểu đồ tương ứng với một đoạn của cụm danh từ. Chúng ta sẽ viết code và vẽ biểu đồ để hiểu rõ hơn.

Mã để minh họa trường hợp sử dụng

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {<DT>?<JJ>*<NN>}"
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

Đồ thị

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

Từ biểu đồ, chúng ta có thể kết luận rằng “learn” và “guru99” là hai mã thông báo khác nhau nhưng được phân loại là Cụm danh từ trong khi mã thông báo “from” không thuộc Cụm danh từ.

Phân đoạn được sử dụng để phân loại các mã thông báo khác nhau thành cùng một phân đoạn. Kết quả sẽ phụ thuộc vào ngữ pháp đã được chọn. Hơn nữa Chunking NLTK được sử dụng để gắn thẻ các mẫu và khám phá kho văn bản.

ĐẾM THẺ POS

Chúng tôi đã thảo luận nhiều pos_tag ở phần trước. Trong hướng dẫn cụ thể nà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 trong việc phân loại văn bản cũng như chuẩn bị các tính năng cho các hoạt động dựa trên ngôn ngữ tự nhiên. Tôi sẽ thảo luận với bạn về cách tiếp cận mà guru99 đã tuân theo khi chuẩn bị mã cùng với cuộc thảo luận về đầu ra. Hy vọng điều này sẽ giúp bạn.

Cách đếm Thẻ:

Ở đây trước tiên chúng ta sẽ viết mã làm việc và sau đó chúng ta sẽ viết các bước khác nhau để giải thích mã.

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:

Bộ đếm({'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})

Xây dựng mã

ĐẾM THẺ POS

  1. Để đếm các thẻ, bạn có thể sử dụng gói Counter từ mô-đun của bộ sưu tập. Bộ đếm là một lớp con từ điển hoạt động theo nguyên tắc hoạt động khóa-giá trị. Nó là một bộ sưu tập không có thứ tự trong đó các phần tử được lưu trữ dưới dạng khóa từ điển trong khi số đếm là giá trị của chúng.
  2. Nhập nltk chứa các mô-đun để mã hóa văn bản.
  3. Viết văn bản có pos_tag bạn muốn đếm.
  4. Một số từ ở dạng chữ hoa và một số từ ở dạng chữ thường, vì vậy việc chuyển đổi tất cả các từ ở dạng chữ thường trước khi áp dụng mã thông báo là phù hợp.
  5. Chuyển các từ thông qua word_tokenize từ nltk.
  6. Tính toán pos_tag của mỗi mã thông báo
    Output = [('guru99', 'NN'), ('is', 'VBZ'), ('one', 'CD'), ('of', 'IN'), ('the', 'DT'), ('best', 'JJS'), ('site', 'NN'), ('to', 'TO'), ('learn', 'VB'), ('web', 'NN'), (',', ','), ('sap', 'NN'), (',', ','), ('ethical', 'JJ'), ('hacking', 'NN'), ('and', 'CC'), ('much', 'RB'), ('more', 'JJR'), ('online', 'JJ')]
  7. Bây giờ đến vai trò của bộ đếm từ điển. Chúng tôi đã nhập vào dòng mã 1. Các từ là khóa và thẻ là giá trị và bộ đếm sẽ đếm tổng số lượng thẻ có trong văn bản.

Phân phối tần số

Phân phối tần số được gọi là số lần kết quả của một thử nghiệm xảy ra. Nó được sử dụng để tìm tần suất của mỗi từ xuất hiện trong tài liệu. Nó sử dụng Tần sốDistclass và được xác định bởi nltk.xác suất mô-đun.

Phân bố tần suất thường được tạo bằng cách đếm các mẫu chạy thử nghiệm nhiều lần. Số lần đếm được tăng lên một đơn vị mỗi lần. Ví dụ

freq_dist = FreqDist()

đối với mã thông báo trong tài liệu:

freq_dist.inc(token.type())

Đối với bất kỳ từ nào, chúng ta có thể kiểm tra xem nó xuất hiện bao nhiêu lần trong một tài liệu cụ thể. Ví dụ

  1. Phương pháp đếm: freq_dist.count('and')Biểu thức này trả về giá trị của số lần 'và' xảy ra. Nó được gọi là phương pháp đếm.
  2. Phương pháp tần số: freq_dist.freq('and')Biểu thức này 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ỏ và giải thích cách hoạt động của nó một cách chi tiết. Chúng ta sẽ viết một số văn bản và tính toán sự phân bố tần suất 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()

Phân phối tần số

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. Mã hóa từng từ trong văn bản được dùng làm đầu vào cho mô-đun FreqDist của nltk.
  4. Áp dụng từng từ cho nlk.FreqDist dưới dạng danh sách
  5. Vẽ các từ trong biểu đồ bằng cách sử dụng lô()

Hãy hình dung đồ thị để hiểu rõ hơn về văn bản viết

Phân bố tần suất của từng từ trong biểu đồ

Phân bố tần suất của từng từ trong biểu đồ

LƯU Ý: Bạn cần cài đặt matplotlib để xem biểu đồ trên

Quan sát biểu đồ trên. Nó tương ứng với việc đếm số lần xuất hiện của mỗi từ trong văn bản. Nó giúp nghiên cứu văn bản và hơn nữa trong việc thực hiện phân tích tình cảm dựa trên văn bản. Tóm lại, có thể kết luận rằng nltk có một mô-đun đếm sự xuất hiện của từng từ trong văn bản, giúp chuẩn bị số liệu thống kê về các tính năng ngôn ngữ tự nhiên. Nó đóng một vai trò quan trọng trong việc tìm kiếm các từ khóa trong văn bản. Bạn cũng có thể trích xuất văn bản từ pdf bằng các thư viện như extract, PyPDF2 và đưa văn bản vào nlk.FreqDist.

Thuật ngữ chính là “tokenize”. Sau khi mã hóa, nó sẽ kiểm tra từng từ trong một đoạn văn hoặc tài liệu văn bản nhất định để xác định số lần nó xuất hiện. Bạn không cần bộ công cụ NLTK cho việc này. Bạn cũng có thể làm điều đó bằng kỹ năng lập trình python của riêng mình. Bộ công cụ NLTK chỉ cung cấp mã sẵn sàng sử dụng cho các hoạt động khác nhau.

Đếm từng từ có thể không hữu ích lắm. Thay vào đó, người ta nên tập trung vào cụm từ và bigrams, những cụm từ này liên quan đến nhiều từ trong một cặp. Những cặp từ này xác định các từ khóa hữu ích để cải thiện các tính năng ngôn ngữ tự nhiên có thể được đưa vào máy. Vui lòng xem bên dưới để biết chi tiết.

Collocations: Bigrams và Trigrams

Collocations là gì?

Collocations là các 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 số lượng các cặp xuất hiện cùng nhau trên tổng số từ của tài liệu.

Hãy xét phổ điện từ với các từ như tia cực tím, tia hồng ngoại.

Các từ tia cực tím và tia không được sử dụng riêng lẻ và do đó có thể được coi là Collocation. Một ví dụ khác là CT Scan. Chúng tôi không nói CT và Quét riêng biệt và do đó chúng cũng được coi là sắp xếp thứ tự.

Chúng ta có thể nói rằng việc tìm kiếm các cụm từ đòi hỏi phải tính toán tần suất của các từ và sự xuất hiện của chúng trong ngữ cảnh của các từ khác. Những tập hợp từ cụ thể này yêu cầu lọc để giữ lại các thuật ngữ nội dung hữu ích. Sau đó, mỗi gram từ có thể được tính điểm theo một số thước đo liên kết nào đó, để xác định khả năng tương đối của mỗi Ingram là một cụm từ.

Collocation có thể được phân loại thành hai loại-

  • Bigram csự kết hợp của hai từ
  • Bát quáisự kết hợp của ba từ

Bigram và Trigram cung cấp nhiều tính năng có ý nghĩa và hữu ích hơn cho giai đoạn trích xuất tính năng. Những điều này đặc biệt hữu ích trong việc phân tích tình cảm dựa trên văn bản.

Mã ví dụ về Bigram

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

Mã ví dụ về bát quái

Đô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 (tính năng xử lý ngôn ngữ tự nhiên) cũng như dự đoán tình cảm dựa trên văn bản.

Mã tương tự được chạy để tính bát quá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 theo nghĩa rộng hơn đề cập đến việc bổ sung các nhãn của động từ, danh từ, v.v., theo ngữ cảnh của câu. Việc xác định thẻ POS là một quá trình phức tạp. Do đó, việc gắn thẻ chung cho POS là không thể thực hiện được theo cách thủ công vì một số từ có thể có nghĩa khác nhau (mơ hồ) tùy theo cấu trúc của câu. Chuyển đổi văn bản dưới dạng danh sách là một bước quan trọng trước khi gắn thẻ vì mỗi từ trong danh sách được lặp lại và tính cho một thẻ cụ thể. Vui lòng xem đoạn mã dưới đây để hiểu rõ hơn

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

Đầu ra:

[('Xin chào', 'NNP'), ('Guru99', 'NNP'), (',', ','), ('Bạn', 'PRP'), ('có', 'VBP') , ('xây dựng', 'VBN'), ('a', 'DT'), ('rất', 'RB'), ('tốt', 'JJ'), ('trang web', 'NN') , ('và', 'CC'), ('Tôi', 'PRP'), ('yêu', 'VBP'), ('ghé thăm', 'VBG'), ('của bạn', 'PRP$' ), ('trang web', 'NN'), ('.', '.')]

Gắn thẻ câu

Giải thích mã:

  1. Mã để nhập nltk (Bộ công cụ ngôn ngữ tự nhiên chứa các mô-đun con như mã thông báo câu và mã thông báo từ.)
  2. Văn bản có thẻ sẽ được in.
  3. Mã thông báo câu
  4. Vòng lặp for được triển khai trong đó các từ được mã hóa từ câu và thẻ của mỗi từ được in dưới dạng đầu ra.

Trong Corpus có hai loại trình gắn thẻ POS:

  • Dựa trên quy tắc
  • Trình gắn thẻ POS ngẫu nhiên

1. Trình gắn thẻ POS dựa trên quy tắc: Đối với các từ có nghĩa mơ hồ, phương pháp tiếp cận dựa trên quy tắc dựa trên thông tin ngữ cảnh được áp dụng. Phương pháp này được thực hiện bằng cách kiểm tra hoặc phân tích nghĩa của từ trước hoặc từ sau. Thông tin được phân tích từ xung quanh từ hoặc trong chính từ đó. Do đó, các từ được gắn nhãn theo các quy tắc ngữ pháp của một ngôn ngữ cụ thể như viết hoa và dấu câu. Ví dụ: Brill's Tagger.

2. Trình gắn thẻ POS ngẫu nhiên: Các cách tiếp cận khác nhau như tần suất hoặc xác suất được áp dụng theo phương pháp này. Nếu một từ hầu hết được gắn thẻ bằng một thẻ cụ thể trong tập huấn luyện thì trong câu kiểm tra, từ đó sẽ được gắn thẻ cụ thể đó. Thẻ 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 đó. Phương pháp này không phải lúc nào cũng chính xác. Một cách khác là tính xác suất xuất hiện của một thẻ cụ thể trong câu. Do đó, thẻ cuối cùng được tính bằng cách kiểm tra xác suất cao nhất của một từ với một thẻ cụ thể.

Gắn thẻ POS với Mô hình Markov ẩn

Vấn đề gắn thẻ cũng có thể được mô hình hóa bằng HMM. Nó coi mã thông báo đầu vào là chuỗi có thể quan sát được trong khi thẻ được coi là 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 mã thông báo trong khi y = y1,y2,y3,y4………ynlà dãy ẩn.

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

HMM sử dụng phân phối kết nối là P(x, y) trong đó x là chuỗi đầu vào/chuỗi mã thông báo và y là chuỗi thẻ.

Chuỗi thẻ cho x sẽ là argmaxy1….ynp(x1,x2,….xn,y1,y2,y3,…..). Chúng tôi đã phân loại các thẻ từ văn bản, nhưng số liệu thống kê về các thẻ đó 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ê.

Tổng kết

  • Gắn thẻ POS trong NLTK là một quá trình đánh dấu các từ ở định dạng văn bản cho một phần cụ thể của bài phát biểu dựa trên định nghĩa và ngữ cảnh của nó.
  • Một số ví dụ về gắn thẻ NLTK POS là: CC, CD, EX, JJ, MD, NNP, PDT, PRP$, TO, v.v.
  • Trình gắn thẻ POS được sử dụng để gán thông tin ngữ pháp của từng từ trong câu. Quá trình cài đặt, nhập và tải xuống tất cả các gói gắn thẻ Phần lời nói bằng NLTK đã hoàn tất.
  • Phân đoạn trong NLP là một quá trình lấy những mẩu thông tin nhỏ và nhóm chúng thành những đơn vị lớn.
  • Không có quy tắc nào được xác định trước, nhưng bạn có thể kết hợp chúng theo nhu cầu và yêu cầu.
  • Chunking được sử dụng để phát hiện thực thể. Thực thể là một phần của câu mà qua đó máy nhận được giá trị cho bất kỳ ý định nào.
  • Phân đoạn được sử dụng để phân loại các mã thông báo khác nhau thành cùng một phân đoạn.