Helpex - Trao đổi & giúp đỡ Đăng nhập

Hướng dẫn NLP bằng Python NLTK (Ví dụ đơn giản)

Trong bài đăng này, chúng tôi sẽ nói về xử lý ngôn ngữ tự nhiên (NLP) bằng Python. Hướng dẫn NLP này sẽ sử dụng thư viện Python NLTK. NLTK là một thư viện Python phổ biến được sử dụng cho NLP.

Vậy NLP là gì? Và lợi ích của việc học NLP là gì?

Nói một cách đơn giản, xử lý ngôn ngữ tự nhiên (NLP) là phát triển các ứng dụng và dịch vụ có khả năng hiểu ngôn ngữ của con người.

Ở đây chúng ta đang nói về các ví dụ thực tế về xử lý ngôn ngữ tự nhiên (NLP) như nhận dạng giọng nói, dịch lời nói, hiểu các câu hoàn chỉnh, hiểu các từ đồng nghĩa của các từ phù hợp và viết các câu và đoạn văn hoàn chỉnh đúng ngữ pháp.

Lợi ích của NLP

Như tất cả các bạn đều biết, hàng triệu gigabyte mỗi ngày được tạo ra bởi blog, trang web xã hội và trang web.

Có nhiều công ty thu thập tất cả các dữ liệu này để hiểu rõ hơn về người dùng và niềm đam mê của họ và thực hiện các thay đổi phù hợp.

Những dữ liệu này có thể cho thấy người dân Brazil hài lòng với sản phẩm A, trong khi người dân Mỹ hài lòng hơn với sản phẩm B. Với NLP, kiến ​​thức này có thể được tìm thấy ngay lập tức (tức là kết quả theo thời gian thực). Ví dụ: công cụ tìm kiếm là một loại NLP cung cấp kết quả phù hợp cho đúng người vào đúng thời điểm.

Nhưng các công cụ tìm kiếm không phải là triển khai duy nhất của xử lý ngôn ngữ tự nhiên (NLP). Có rất nhiều triển khai thậm chí còn tuyệt vời hơn ngoài kia.

Triển khai NLP

Đây là một số triển khai thành công của xử lý ngôn ngữ tự nhiên (NLP):

  • Các công cụ tìm kiếm như Google, Yahoo, v.v ... Công cụ tìm kiếm của Google hiểu rằng bạn là một anh chàng công nghệ, vì vậy nó cho bạn thấy kết quả liên quan đến điều đó.
  • Nguồn cấp dữ liệu trang web xã hội như nguồn cấp tin tức Facebook của bạn. Thuật toán nguồn cấp tin tức hiểu được sở thích của bạn bằng cách xử lý ngôn ngữ tự nhiên và hiển thị cho bạn các quảng cáo và bài đăng liên quan nhiều khả năng hơn các bài đăng khác.
  • Động cơ lời nói như Apple Siri.
  • Bộ lọc thư rác như bộ lọc thư rác của Google. Nó không chỉ là về lọc thư rác thông thường của bạn ; Bây giờ, các bộ lọc thư rác hiểu nội dung bên trong email và xem đó có phải là thư rác hay không.

Thư viện NLP

Có nhiều thư viện Xử lý ngôn ngữ tự nhiên (NLP) mã nguồn mở. Đây là một số trong số họ:

  • Bộ công cụ ngôn ngữ tự nhiên (NLTK)
  • OpenNLP của Apache
  • Bộ NLP Stanford
  • Thư viện cổng NLP

Bộ công cụ ngôn ngữ tự nhiên (NLTK) là thư viện phổ biến nhất để xử lý ngôn ngữ tự nhiên (NLP). Nó được viết bằng Python và có một cộng đồng lớn đằng sau nó.

NLTK cũng rất dễ học, thực ra, đó là thư viện xử lý ngôn ngữ tự nhiên (NLP) dễ dàng nhất mà bạn sẽ sử dụng.

Trong hướng dẫn NLP này, chúng tôi sẽ sử dụng thư viện Python NLTK. Trước khi tôi bắt đầu cài đặt NLTK, tôi giả sử rằng bạn biết một số điều cơ bản về Python để bắt đầu.

Cài đặt NLTK

Nếu bạn đang sử dụng Windows hoặc Linux hoặc Mac, bạn có thể cài đặt NLTK bằng pip# pip install nltk.

Bạn có thể sử dụng NLTK trên Python 2.7, 3.4 và 3.5 tại thời điểm viết bài này. Ngoài ra, bạn có thể cài đặt nó từ nguồn từ tar này .

Để kiểm tra xem NLTK đã được cài đặt đúng chưa, bạn có thể mở thiết bị đầu cuối Python của mình và gõ như sau : Import nltk. Nếu mọi thứ đều ổn, điều đó có nghĩa là bạn đã cài đặt thành công thư viện NLTK.

Khi bạn đã cài đặt NLTK, bạn nên cài đặt các gói NLTK bằng cách chạy mã sau:

import nltk
nltk.download()

Điều này sẽ hiển thị trình tải xuống NLTK để chọn gói nào cần được cài đặt.

Hướng dẫn NLP bằng Python NLTK (Ví dụ đơn giản)Bạn có thể cài đặt tất cả các gói vì tất cả chúng đều có kích thước nhỏ mà không có vấn đề gì. Bây giờ, hãy bắt đầu chương trình!

Token hóa văn bản bằng Python thuần túy

Đầu tiên, chúng tôi sẽ lấy một số nội dung trang web. Sau đó, chúng tôi sẽ phân tích văn bản để xem trang đó nói về cái gì. Chúng tôi sẽ sử dụng mô-đun urllib để thu thập dữ liệu trang web:

import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)

Như bạn có thể thấy từ đầu ra được in, kết quả chứa rất nhiều thẻ HTML cần được làm sạch. Chúng ta có thể sử dụng  BeautifulSoup để xóa văn bản đã lấy như thế này:

from bs4 import BeautifulSoup
import urllib.request 
response = urllib.request.urlopen('http://php.net/') 
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
print (text)

Bây giờ, chúng tôi có văn bản sạch từ trang web được thu thập thông tin. Tuyệt vời phải không?

Cuối cùng, hãy chuyển đổi văn bản đó thành mã thông báo bằng cách chia văn bản như thế này:

from bs4 import BeautifulSoup 
import urllib.request 
response = urllib.request.urlopen('http://php.net/') 
html = response.read() 
soup = BeautifulSoup(html,"html5lib") 
text = soup.get_text(strip=True) 
tokens = [t for t in text.split()] 
print (tokens)

Đếm tần số từ

Các văn bản tốt hơn nhiều bây giờ. Hãy tính toán phân phối tần suất của các mã thông báo đó bằng Python NLTK. Có một chức năng trong NLTK được gọi là  FreqDist() thực hiện công việc:

from bs4 import BeautifulSoup
import urllib.request
import nltk 
response = urllib.request.urlopen('http://php.net/') 
html = response.read() 
soup = BeautifulSoup(html,"html5lib") 
text = soup.get_text(strip=True) 
tokens = [t for t in text.split()] 
freq = nltk.FreqDist(tokens) 
for key,val in freq.items(): 
    print (str(key) + ':' + str(val))

Nếu bạn tìm kiếm đầu ra, bạn sẽ thấy rằng mã thông báo thường xuyên nhất là PHP.

Bạn có thể vẽ biểu đồ cho các mã thông báo đó bằng cách sử dụng chức năng vẽ biểu đồ như sau :  freq.plot(20, cumulative=False).

Hướng dẫn NLP bằng Python NLTK (Ví dụ đơn giản)

Từ biểu đồ, bạn có thể chắc chắn rằng bài viết này đang nói về PHP. Tuyệt quá! Có một số từ như "the," "của", "a", "an", v.v. Những từ này là từ dừng lại. Nói chung, các từ dừng nên được loại bỏ để ngăn chúng ảnh hưởng đến kết quả của chúng tôi.

Xóa các từ dừng sử dụng NLTK

NLTK được vận chuyển với danh sách từ dừng cho hầu hết các ngôn ngữ. Để có được các từ dừng tiếng Anh, bạn có thể sử dụng mã này:

from nltk.corpus import stopwords
stopwords.words('english')

Bây giờ, hãy sửa đổi mã của chúng tôi và làm sạch mã thông báo trước khi vẽ đồ thị. Đầu tiên, chúng tôi sẽ tạo một bản sao của danh sách. Sau đó, chúng tôi sẽ lặp lại các mã thông báo và xóa các từ dừng:

clean_tokens = tokens[:] 
sr = stopwords.words('english')
for token in tokens:
    if token in stopwords.words('english'):
        clean_tokens.remove(token)

Bạn có thể xem lại các hàm danh sách Python tại đây  để biết cách xử lý danh sách.

Mã cuối cùng sẽ trông như thế này:

from bs4 import BeautifulSoup 
import urllib.request 
import nltk 
from nltk.corpus import stopwords 
response = urllib.request.urlopen('http://php.net/') 
html = response.read() 
soup = BeautifulSoup(html,"html5lib") 
text = soup.get_text(strip=True) 
tokens = [t for t in text.split()] 
clean_tokens = tokens[:] 
sr = stopwords.words('english') 
for token in tokens: 
    if token in stopwords.words('english'): 
        clean_tokens.remove(token) 
freq = nltk.FreqDist(clean_tokens) 
for key,val in freq.items(): 
    print (str(key) + ':' + str(val))

Nếu bạn kiểm tra biểu đồ bây giờ, nó sẽ tốt hơn trước vì không có từ dừng nào trong số đếm.

freq.plot(20,cumulative=False)

Hướng dẫn NLP bằng Python NLTK (Ví dụ đơn giản)

Mã thông báo văn bản bằng cách sử dụng NLTK

Chúng tôi chỉ thấy cách chia văn bản thành các mã thông báo bằng cách sử dụng  split chức năng. Bây giờ, chúng ta sẽ xem làm thế nào để token hóa văn bản bằng cách sử dụng NLTK. Văn bản mã thông báo rất quan trọng vì văn bản không thể được xử lý mà không có mã thông báo. Quá trình token hóa có nghĩa là tách các phần lớn hơn thành các phần nhỏ.

Bạn có thể mã hóa các đoạn văn thành câu và mã hóa câu thành từ theo nhu cầu của bạn. NLTK được vận chuyển với mã thông báo câu và mã thông báo từ.

Giả sử rằng chúng ta có một văn bản mẫu như sau:

Hello Adam, how are you? I hope everything is going well.  Today is a good day, see you dude.

Để mã hóa văn bản này thành câu, chúng tôi sẽ sử dụng mã thông báo câu:

from nltk.tokenize import sent_tokenize 
mytext = "Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude." 
print(sent_tokenize(mytext))

Đầu ra là như sau:

['Hello Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

Bạn có thể nói, Đây là một công việc dễ dàng; Tôi không cần sử dụng mã thông báo NLTK và tôi có thể phân tách các câu bằng cách sử dụng các biểu thức thông thường vì mỗi câu có trước dấu câu và dấu cách.

Vâng, hãy xem văn bản sau đây:

Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude.

Ừ! Từ Mr. là một từ của chính nó. OK, hãy thử NLTK:

from nltk.tokenize import sent_tokenize 
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude." 
print(sent_tokenize(mytext))

Đầu ra trông như thế này:

['Hello Mr. Adam, how are you?', 'I hope everything is going well.', 'Today is a good day, see you dude.']

Tuyệt quá! Nó hoạt động như sự quyến rũ. Hãy thử dùng tokenizer để xem nó sẽ hoạt động như thế nào:

from nltk.tokenize import word_tokenize
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(word_tokenize(mytext))

Đầu ra là:

['Hello', 'Mr.', 'Adam', ',', 'how', 'are', 'you', '?', 'I', 'hope', 'everything', 'is', 'going', 'well', '.', 'Today', 'is', 'a', 'good', 'day', ',', 'see', 'you', 'dude', '.']

Từ Mr. là một từ, như mong đợi. NLTK sử dụng  PunktSentenceTokenizer, là một phần của  nltk.tokenize.punkt module. Mã thông báo này được đào tạo tốt để làm việc với nhiều ngôn ngữ.

Mã thông báo văn bản không phải tiếng Anh

Để mã hóa các ngôn ngữ khác, bạn có thể chỉ định ngôn ngữ như thế này:

from nltk.tokenize import sent_tokenize
mytext = "Bonjour M. Adam, comment allez-vous? J'espère que tout va bien. Aujourd'hui est un bon jour."
print(sent_tokenize(mytext,"french"))

Kết quả sẽ như thế này:

['Bonjour M. Adam, comment allez-vous?', "J'espère que tout va bien.", "Aujourd'hui est un bon jour."]

Chúng tôi đang làm rất tốt!

Nhận từ đồng nghĩa từ WordNet

Nếu bạn nhớ chúng tôi đã cài đặt các gói NLTK bằng cách sử dụng nltk.download(). Một trong những gói là WordNet. WordNet là một cơ sở dữ liệu được xây dựng để xử lý ngôn ngữ tự nhiên. Nó bao gồm các nhóm từ đồng nghĩa và một định nghĩa ngắn gọn.

Bạn có thể lấy các định nghĩa và ví dụ cho một từ đã cho như thế này:

from nltk.corpus import wordnet
syn = wordnet.synsets("pain")
print(syn[0].definition())
print(syn[0].examples())

Kết quả là:

a symptom of some physical hurt or disorder
['the patient developed severe pain and distension']

WordNet bao gồm rất nhiều định nghĩa:

from nltk.corpus import wordnet
syn = wordnet.synsets("NLP")
print(syn[0].definition())
syn = wordnet.synsets("Python")
print(syn[0].definition())

Kết quả là:

the branch of information science that deals with natural language information
large Old World boas

Bạn có thể sử dụng WordNet để nhận các từ đồng nghĩa như thế này:

from nltk.corpus import wordnet 
synonyms = []
for syn in wordnet.synsets('Computer'):
    for lemma in syn.lemmas():
        synonyms.append(lemma.name())
print(synonyms)

Đầu ra là:

['computer', 'computing_machine', 'computing_device', 'data_processor', 'electronic_computer', 'information_processing_system', 'calculator', 'reckoner', 'figurer', 'estimator', 'computer']

Mát mẻ!

Nhận từ trái nghĩa từ WordNet

Bạn có thể nhận được các từ trái nghĩa của các từ theo cùng một cách. Tất cả bạn phải làm là kiểm tra  lemmas trước khi thêm chúng vào mảng. nó có phải là từ trái nghĩa hay không.

from nltk.corpus import wordnet
antonyms = []
for syn in wordnet.synsets("small"):
    for l in syn.lemmas():
        if l.antonyms():
            antonyms.append(l.antonyms()[0].name())
print(antonyms)

Đầu ra là:

['large', 'big', 'big']

Đây là sức mạnh của NLTK trong xử lý ngôn ngữ tự nhiên.

Từ NLTK

Từ gốc có nghĩa là loại bỏ các phụ tố từ các từ và trả lại từ gốc. (Nguồn gốc của từ làm việc là công việc .) Công cụ tìm kiếm sử dụng kỹ thuật này khi lập chỉ mục các trang, vì vậy nhiều người viết các phiên bản khác nhau cho cùng một từ và tất cả chúng đều bắt nguồn từ từ gốc.

Có nhiều thuật toán để xuất phát, nhưng thuật toán được sử dụng nhiều nhất là thuật toán xuất phát Porter. NLTK có một lớp gọi là PorterStemmer sử dụng thuật toán này.

from nltk.stem import PorterStemmer
stemmer = PorterStemmer() 
print(stemmer.stem('working'))

Kết quả là :  work.

Rõ ràng đủ rồi!

Có một số thuật toán xuất phát khác, như thuật toán xuất phát của Lancaster. Đầu ra của thuật toán này cho thấy một số kết quả khác nhau cho một vài từ. Bạn có thể thử cả hai để xem kết quả.

Từ gốc tiếng Anh

SnowballStemmer có thể xuất phát 13 ngôn ngữ bên cạnh ngôn ngữ tiếng Anh. Các ngôn ngữ được hỗ trợ là:

from nltk.stem import SnowballStemmer
print(SnowballStemmer.languages)
'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'spanish', 'swedish'

Bạn có thể sử dụng  stem chức năng của  SnowballStemmer lớp để bắt nguồn các từ không phải tiếng Anh như thế này:

from nltk.stem import SnowballStemmer
french_stemmer = SnowballStemmer('french')
print(french_stemmer.stem("French word"))

Các bình luận viên Pháp có thể cho chúng tôi biết về kết quả!

Từ ngữ sử dụng WordNet

Từ lemmatizing tương tự như bắt nguồn, nhưng sự khác biệt là kết quả của từ lem là một từ thực sự. Không giống như bắt nguồn, khi bạn cố gắng bắt nguồn một số từ, nó sẽ dẫn đến kết quả như thế này:

from nltk.stem import PorterStemmer 
stemmer = PorterStemmer() 
print(stemmer.stem('increases'))

Kết quả là : increas.

Bây giờ, nếu chúng tôi cố gắng từ vựng cùng một từ bằng cách sử dụng NLTK WordNet, kết quả là chính xác:

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('increases'))

Kết quả là  increase.

Kết quả có thể kết thúc bằng một từ đồng nghĩa hoặc một từ khác có cùng nghĩa. Đôi khi, nếu bạn cố gắng viết tắt một từ như từ đang chơi, nó sẽ kết thúc với cùng một từ. Điều này là do phần mặc định của lời nói là danh từ. Để có được động từ, bạn nên chỉ định nó như thế này:

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))

Kết quả là :  play.

Trên thực tế, đây là một mức độ nén văn bản rất tốt. Bạn kết thúc với khoảng 50% đến 60% nén. Kết quả có thể là một động từ, danh từ, tính từ hoặc trạng từ:

from nltk.stem import WordNetLemmatizer 
lemmatizer = WordNetLemmatizer() 
print(lemmatizer.lemmatize('playing', pos="v")) 
print(lemmatizer.lemmatize('playing', pos="n")) 
print(lemmatizer.lemmatize('playing', pos="a")) 
print(lemmatizer.lemmatize('playing', pos="r"))

Kết quả là:

play 
playing 
playing 
playing

Sự khác biệt giữa gốc và chữ

OK, chúng ta hãy thử bắt nguồn và từ vựng cho một số từ:

from nltk.stem import WordNetLemmatizer 
from nltk.stem import PorterStemmer 
stemmer = PorterStemmer() 
lemmatizer = WordNetLemmatizer() 
print(stemmer.stem('stones')) 
print(stemmer.stem('speaking')) 
print(stemmer.stem('bedroom')) 
print(stemmer.stem('jokes')) 
print(stemmer.stem('lisa')) 
print(stemmer.stem('purple')) 
print('----------------------') 
print(lemmatizer.lemmatize('stones')) 
print(lemmatizer.lemmatize('speaking'))
print(lemmatizer.lemmatize('bedroom'))
print(lemmatizer.lemmatize('jokes'))
print(lemmatizer.lemmatize('lisa'))
print(lemmatizer.lemmatize('purple'))

Kết quả là:

stone 
speak 
bedroom 
joke 
lisa 
purpl 
---------------------- 
stone 
speaking 
bedroom
joke
lisa
purple

Từ gốc hoạt động trên các từ mà không biết ngữ cảnh của chúng, đó là lý do tại sao nó có độ chính xác thấp hơn và nhanh hơn so với từ vựng.

Theo tôi, vượn cáo tốt hơn là bắt nguồn. Từ lem ngữ trả về một từ thực sự ngay cả khi nó không phải là cùng một từ; nó có thể là một từ đồng nghĩa, nhưng ít nhất nó là một từ thực sự. Đôi khi, bạn không quan tâm đến mức độ chính xác này và tất cả những gì bạn cần là tốc độ. Trong trường hợp này, thân cây là tốt hơn.

Tất cả các bước chúng tôi đã thảo luận trong hướng dẫn NLP này liên quan đến tiền xử lý văn bản. Trong các bài viết trong tương lai, chúng tôi sẽ thảo luận về phân tích văn bản bằng cách sử dụng Python NLTK.

0 hữu ích 0 bình luận 34k xem chia sẻ

Có thể bạn quan tâm

loading