Bộ công cụ ngôn ngữ tự nhiên - Chuyển đổi Chunks
Tại sao lại biến đổi Chunks?
Cho đến bây giờ chúng ta đã có các đoạn hoặc cụm từ câu nhưng chúng ta phải làm gì với chúng. Một trong những nhiệm vụ quan trọng là chuyển hóa chúng. Nhưng tại sao? Nó là để làm như sau -
- sửa ngữ pháp và
- sắp xếp lại các cụm từ
Lọc các từ không quan trọng / vô ích
Giả sử nếu bạn muốn đánh giá nghĩa của một cụm từ thì có nhiều từ thường được sử dụng như, 'the', 'a', là không quan trọng hoặc vô dụng. Ví dụ, hãy xem cụm từ sau:
'Bộ phim rất hay'.
Ở đây những từ quan trọng nhất là 'phim' và 'hay'. Các từ khác, 'the' và 'was' đều vô dụng hoặc không đáng kể. Đó là bởi vì không có chúng, chúng ta cũng có thể nhận được cùng một ý nghĩa của cụm từ. 'Phim hay'.
Trong công thức python sau, chúng ta sẽ học cách loại bỏ các từ vô dụng / không quan trọng và giữ lại các từ quan trọng với sự trợ giúp của thẻ POS.
Thí dụ
Đầu tiên, bằng cách xem qua treebankngữ liệu cho từ dừng, chúng tôi cần quyết định thẻ phần lời nói nào là quan trọng và thẻ nào không. Hãy để chúng tôi xem bảng các từ và thẻ không quan trọng sau đây -
Word | Nhãn |
---|---|
a | DT |
Tất cả | PDT |
An | DT |
Và | CC |
Hoặc là | CC |
Cái đó | WDT |
Các | DT |
Từ bảng trên, chúng ta có thể thấy ngoài CC, tất cả các thẻ khác đều kết thúc bằng DT, nghĩa là chúng ta có thể lọc ra những từ không quan trọng bằng cách nhìn vào hậu tố của thẻ.
Đối với ví dụ này, chúng ta sẽ sử dụng một hàm có tên filter()lấy một đoạn duy nhất và trả lại một đoạn mới mà không có bất kỳ từ được gắn thẻ không quan trọng nào. Chức năng này lọc ra bất kỳ thẻ nào kết thúc bằng DT hoặc CC.
Thí dụ
import nltk
def filter(chunk, tag_suffixes=['DT', 'CC']):
significant = []
for word, tag in chunk:
ok = True
for suffix in tag_suffixes:
if tag.endswith(suffix):
ok = False
break
if ok:
significant.append((word, tag))
return (significant)
Bây giờ, chúng ta hãy sử dụng hàm filter () này trong công thức Python của chúng tôi để xóa các từ không quan trọng -
from chunk_parse import filter
filter([('the', 'DT'),('good', 'JJ'),('movie', 'NN')])
Đầu ra
[('good', 'JJ'), ('movie', 'NN')]
Sửa động từ
Nhiều khi, trong ngôn ngữ thực tế, chúng ta thấy các dạng động từ không chính xác. Ví dụ, 'bạn khỏe chứ?' không đúng. Dạng động từ không đúng trong câu này. Câu nên là 'bạn ổn chứ?' NLTK cung cấp cho chúng ta cách để sửa những lỗi như vậy bằng cách tạo ánh xạ sửa động từ. Các ánh xạ hiệu chỉnh này được sử dụng tùy thuộc vào việc có một danh từ số nhiều hay số ít trong đoạn này.
Thí dụ
Để triển khai công thức Python, trước tiên chúng ta cần xác định ánh xạ sửa động từ. Hãy để chúng tôi tạo hai ánh xạ như sau:
Plural to Singular mappings
plural= {
('is', 'VBZ'): ('are', 'VBP'),
('was', 'VBD'): ('were', 'VBD')
}
Singular to Plural mappings
singular = {
('are', 'VBP'): ('is', 'VBZ'),
('were', 'VBD'): ('was', 'VBD')
}
Như đã thấy ở trên, mỗi ánh xạ có một động từ được gắn thẻ ánh xạ tới một động từ được gắn thẻ khác. Các ánh xạ ban đầu trong ví dụ của chúng tôi bao gồm cơ bản của ánh xạis to are, was to were, và ngược lại.
Tiếp theo, chúng ta sẽ xác định một hàm có tên verbs(), trong đó bạn có thể chuyển một đoạn với dạng động từ không chính xác và sẽ lấy lại một đoạn đã sửa. Để hoàn thành,verb() hàm sử dụng một hàm trợ giúp có tên index_chunk() sẽ tìm kiếm vị trí của từ được gắn thẻ đầu tiên.
Hãy để chúng tôi xem các chức năng này -
def index_chunk(chunk, pred, start = 0, step = 1):
l = len(chunk)
end = l if step > 0 else -1
for i in range(start, end, step):
if pred(chunk[i]):
return i
return None
def tag_startswith(prefix):
def f(wt):
return wt[1].startswith(prefix)
return f
def verbs(chunk):
vbidx = index_chunk(chunk, tag_startswith('VB'))
if vbidx is None:
return chunk
verb, vbtag = chunk[vbidx]
nnpred = tag_startswith('NN')
nnidx = index_chunk(chunk, nnpred, start = vbidx+1)
if nnidx is None:
nnidx = index_chunk(chunk, nnpred, start = vbidx-1, step = -1)
if nnidx is None:
return chunk
noun, nntag = chunk[nnidx]
if nntag.endswith('S'):
chunk[vbidx] = plural.get((verb, vbtag), (verb, vbtag))
else:
chunk[vbidx] = singular.get((verb, vbtag), (verb, vbtag))
return chunk
Lưu các hàm này trong tệp Python trong thư mục cục bộ của bạn nơi Python hoặc Anaconda được cài đặt và chạy nó. Tôi đã lưu nó làverbcorrect.py.
Bây giờ, hãy để chúng tôi gọi verbs() chức năng trên máy POS được gắn thẻ is you fine khúc -
from verbcorrect import verbs
verbs([('is', 'VBZ'), ('you', 'PRP$'), ('fine', 'VBG')])
Đầu ra
[('are', 'VBP'), ('you', 'PRP$'), ('fine','VBG')]
Loại bỏ giọng nói thụ động khỏi các cụm từ
Một nhiệm vụ hữu ích khác là loại bỏ giọng nói thụ động khỏi các cụm từ. Điều này có thể được thực hiện với sự trợ giúp của việc hoán đổi các từ xung quanh một động từ. Ví dụ,‘the tutorial was great’ có thể được chuyển đổi thành ‘the great tutorial’.
Thí dụ
Để đạt được điều này, chúng tôi đang xác định một hàm có tên eliminate_passive()điều đó sẽ hoán đổi phía bên phải của đoạn với phía bên trái bằng cách sử dụng động từ làm điểm xoay. Để tìm động từ xoay quanh, nó cũng sẽ sử dụngindex_chunk() chức năng được xác định ở trên.
def eliminate_passive(chunk):
def vbpred(wt):
word, tag = wt
return tag != 'VBG' and tag.startswith('VB') and len(tag) > 2
vbidx = index_chunk(chunk, vbpred)
if vbidx is None:
return chunk
return chunk[vbidx+1:] + chunk[:vbidx]
Bây giờ, hãy để chúng tôi gọi eliminate_passive() chức năng trên máy POS được gắn thẻ the tutorial was great khúc -
from passiveverb import eliminate_passive
eliminate_passive(
[
('the', 'DT'), ('tutorial', 'NN'), ('was', 'VBD'), ('great', 'JJ')
]
)
Đầu ra
[('great', 'JJ'), ('the', 'DT'), ('tutorial', 'NN')]
Hoán đổi danh từ cardinals
Như chúng ta đã biết, một từ chính như 5, được gắn thẻ là CD trong một đoạn. Những từ chính này thường xuất hiện trước hoặc sau một danh từ nhưng vì mục đích bình thường hóa, rất hữu ích khi đặt chúng trước danh từ luôn. Ví dụ, ngàyJanuary 5 có thể được viết như 5 January. Hãy để chúng tôi hiểu nó với ví dụ sau.
Thí dụ
Để đạt được điều này, chúng tôi đang xác định một hàm có tên swapping_cardinals()điều đó sẽ hoán đổi bất kỳ thẻ nào xuất hiện ngay sau một danh từ với danh từ. Với điều này, cardinal sẽ xuất hiện ngay trước danh từ. Để so sánh bình đẳng với thẻ đã cho, nó sử dụng hàm trợ giúp mà chúng tôi đặt tên làtag_eql().
def tag_eql(tag):
def f(wt):
return wt[1] == tag
return f
Bây giờ chúng ta có thể định nghĩa swapping_cardinals () -
def swapping_cardinals (chunk):
cdidx = index_chunk(chunk, tag_eql('CD'))
if not cdidx or not chunk[cdidx-1][1].startswith('NN'):
return chunk
noun, nntag = chunk[cdidx-1]
chunk[cdidx-1] = chunk[cdidx]
chunk[cdidx] = noun, nntag
return chunk
Bây giờ, hãy để chúng tôi gọi swapping_cardinals() chức năng vào một ngày “January 5” -
from Cardinals import swapping_cardinals()
swapping_cardinals([('Janaury', 'NNP'), ('5', 'CD')])
Đầu ra
[('10', 'CD'), ('January', 'NNP')]
10 January