สร้างโปรแกรมการจัดประเภทข้อความ: บทช่วยสอน NLP
เผยแพร่แล้ว: 2022-03-11การเรียนรู้เชิงลึกเป็นเทคโนโลยีที่กลายเป็นส่วนสำคัญของเวิร์กโฟลว์แมชชีนเลิร์นนิง การใช้ประโยชน์จากการปรับปรุงพลังการประมวลผลแบบคู่ขนานและเครื่องมือสนับสนุน เครือข่ายประสาทเทียมที่ซับซ้อนและลึกซึ่งครั้งหนึ่งเคยใช้งานไม่ได้กำลังกลายเป็นจริง
การเกิดขึ้นของห้องสมุดที่ทรงพลังและเข้าถึงได้ เช่น Tensorflow, Torch และ Deeplearning4j ได้เปิดการพัฒนาให้กับผู้ใช้นอกเหนือจากฝ่ายวิชาการและแผนกวิจัยของบริษัทเทคโนโลยีขนาดใหญ่ ในข้อพิสูจน์ถึงความแพร่หลายที่เพิ่มขึ้น บริษัทต่างๆ เช่น Huawei และ Apple ได้รวมโปรเซสเซอร์ที่ปรับให้เหมาะกับการเรียนรู้เชิงลึกโดยเฉพาะในอุปกรณ์ใหม่ล่าสุดเพื่อขับเคลื่อนแอปพลิเคชันการเรียนรู้เชิงลึก
การเรียนรู้เชิงลึกได้พิสูจน์ถึงพลังของมันในหลายโดเมน สิ่งที่น่าสังเกตมากที่สุดคือ AlphaGo ของ Google สามารถเอาชนะผู้เล่นที่เป็นมนุษย์ได้ในเกม Go ซึ่งเป็นเกมที่ครั้งหนึ่งเคยคิดว่าความซับซ้อนที่น่าเหลือเชื่อนั้นเคยเป็นอุปสรรคต่อคอมพิวเตอร์ที่แทบจะเอาชนะไม่ได้ในการแข่งขันกับผู้เล่นที่เป็นมนุษย์ โครงการ Flow Machines โดย Sony ได้พัฒนาโครงข่ายประสาทเทียมที่สามารถแต่งเพลงในสไตล์นักดนตรีชื่อดังในอดีตได้ FaceID ซึ่งเป็นคุณสมบัติด้านความปลอดภัยที่พัฒนาโดย Apple ใช้การเรียนรู้เชิงลึกในการจดจำใบหน้าของผู้ใช้และเพื่อติดตามการเปลี่ยนแปลงของใบหน้าของผู้ใช้เมื่อเวลาผ่านไป
ในบทความนี้ เราจะนำการเรียนรู้เชิงลึกมาใช้กับสองหัวข้อที่ฉันชื่นชอบ ได้แก่ การประมวลผลภาษาธรรมชาติและไวน์ เราจะสร้างแบบจำลองเพื่อทำความเข้าใจบทวิจารณ์ไวน์ในภาษาธรรมชาติโดยผู้เชี่ยวชาญ และสรุปความหลากหลายของไวน์ที่พวกเขากำลังวิจารณ์
การเรียนรู้เชิงลึกสำหรับ NLP
การเรียนรู้เชิงลึกมีการใช้กันอย่างแพร่หลายใน การประมวลผลภาษาธรรมชาติ (NLP) เนื่องจากเหมาะสำหรับการเรียนรู้โครงสร้างพื้นฐานที่ซับซ้อนของประโยคและความใกล้เคียงของความหมายของคำต่างๆ ตัวอย่างเช่น ปัจจุบันของศิลปะสำหรับการวิเคราะห์ความรู้สึกนั้นใช้การเรียนรู้เชิงลึกเพื่อรวบรวมแนวคิดทางภาษาศาสตร์ที่ยากต่อการสร้างแบบจำลอง เช่น การปฏิเสธและความรู้สึกแบบผสม
การเรียนรู้เชิงลึกมีข้อดีหลายประการเหนืออัลกอริทึมอื่นๆ สำหรับ NLP:
- โมเดลที่ ยืดหยุ่นได้: โมเดล การเรียนรู้เชิงลึกมีความยืดหยุ่นมากกว่าโมเดล ML อื่นๆ เราสามารถทดลองกับโครงสร้างต่างๆ ได้อย่างง่ายดาย เพิ่มและลบเลเยอร์ตามต้องการ โมเดลการเรียนรู้เชิงลึกยังช่วยให้สามารถสร้างแบบจำลองที่มีผลลัพธ์ที่ยืดหยุ่นได้ ความยืดหยุ่นเป็นกุญแจสำคัญในการพัฒนาแบบจำลองที่เหมาะสมกับการทำความเข้าใจโครงสร้างทางภาษาที่ซับซ้อน นอกจากนี้ยังจำเป็นสำหรับการพัฒนาแอปพลิเคชัน NLP เช่น การแปล แชทบอท และแอปพลิเคชันการแปลงข้อความเป็นคำพูด
- ต้องการความรู้ในโดเมนน้อยกว่า: แม้ว่าจะต้องมีความรู้เกี่ยวกับโดเมนและสัญชาตญาณบางอย่างเพื่อพัฒนาโมเดลการเรียนรู้เชิงลึกที่ดี ความสามารถของอัลกอริทึมการเรียนรู้เชิงลึกในการเรียนรู้ลำดับชั้นของฟีเจอร์ด้วยตัวมันเองหมายความว่านักพัฒนาไม่จำเป็นต้องมีความรู้เชิงลึกเกี่ยวกับ พื้นที่ปัญหาในการพัฒนาอัลกอริธึม NLP การเรียนรู้เชิงลึก สำหรับพื้นที่ที่มีปัญหาซับซ้อนพอๆ กับภาษาธรรมชาติ นี่เป็นข้อได้เปรียบที่น่ายินดี
- การเรียนรู้ต่อเนื่องที่ง่ายขึ้น: อัลกอริธึมการเรียนรู้เชิงลึกนั้นง่ายต่อการฝึกอบรมเมื่อมีข้อมูลใหม่เข้ามา อัลกอริธึมการเรียนรู้ของเครื่องบางตัวต้องการให้ส่งชุดข้อมูลทั้งหมดผ่านแบบจำลองเพื่ออัปเดต ซึ่งจะทำให้เกิดปัญหาสำหรับชุดข้อมูลสดขนาดใหญ่
ปัญหาวันนี้
วันนี้ เราจะสร้างอัลกอริธึมการเรียนรู้เชิงลึกเพื่อกำหนดความหลากหลายของไวน์ที่จะถูกตรวจสอบตามข้อความรีวิว เราจะใช้ชุดข้อมูลนิตยสารไวน์ที่ https://www.kaggle.com/zynicide/wine-reviews ซึ่งจัดทำโดยผู้ใช้ Kaggle zackthoutt
ตามแนวคิดแล้ว คำถามคือ เราจะรีวิวไวน์อย่าง…
กลิ่นหอมรวมถึงผลไม้เมืองร้อน ไม้กวาด กำมะถัน และสมุนไพรแห้ง เพดานปากไม่แสดงออกมากเกินไป โดยนำเสนอแอปเปิ้ลที่ยังไม่สุก ส้ม และเสจแห้ง ควบคู่ไปกับความเป็นกรดที่ฉุนเฉียว
…และรู้หรือไม่ว่ามันเป็นเรื่องของสีขาวผสม? ผู้ชื่นชอบไวน์บางคนอาจรู้จักสัญญาณของไวน์ขาว เช่น แอปเปิล ส้ม และความเป็นกรดที่เด่นชัด แต่เราสามารถฝึกโครงข่ายประสาทของเราให้รับรู้สัญญาณเหล่านี้ได้หรือไม่ นอกจากนี้ เราสามารถฝึกโครงข่ายประสาทเทียมของเราให้รับรู้ความแตกต่างเล็กน้อยระหว่างการตรวจทานแบบผสมผสานสีขาวกับการตรวจทานพิโนต์ กริจิโอได้หรือไม่
อัลกอริทึมที่คล้ายกัน
ปัญหาที่เรากำลังดำเนินการอยู่ในปัจจุบันคือปัญหาการจัดหมวดหมู่ NLP มีอัลกอริธึมการจัดหมวดหมู่ NLP หลายแบบที่ใช้กับปัญหาต่างๆ ใน NLP ตัวอย่างเช่น มีการใช้ช่องไร้เดียงสาในอัลกอริธึมการตรวจจับสแปมต่างๆ และมีการใช้เครื่องสนับสนุนเวกเตอร์ (SVM) เพื่อจัดประเภทข้อความ เช่น บันทึกความคืบหน้าในสถาบันทางการแพทย์ การใช้อัลกอริธึมเวอร์ชันง่าย ๆ เหล่านี้เป็นพื้นฐานสำหรับโมเดลการเรียนรู้เชิงลึกของเรานั้นน่าสนใจ
Naive Bayes
การใช้งาน naive Bayes สำหรับ NLP ที่ได้รับความนิยมนั้นเกี่ยวข้องกับการประมวลผลข้อความล่วงหน้าโดยใช้ TF-IDF จากนั้นรัน multinomial naive Bayes บนเอาต์พุตที่ประมวลผลล่วงหน้า วิธีนี้ทำให้อัลกอริธึมสามารถเรียกใช้กับคำที่โดดเด่นที่สุดในเอกสารได้ เราสามารถนำ Bayes ไร้เดียงสามาใช้ได้ดังนี้:
import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
เรียกใช้โค้ดด้านบนและคุณจะเห็นสิ่งต่อไปนี้: 73.56%

เมื่อพิจารณาจาก 10 คลาส นี่เป็นผลลัพธ์ที่ดีทีเดียว
เรายังสามารถใช้เครื่องสนับสนุนเวกเตอร์และดูว่ามันจะทำอย่างไร เพื่อดูว่ามันทำงานอย่างไร เพียงแค่แทนที่คำจำกัดความตัวแยกประเภทด้วย
clf = SVC(kernel='linear').fit(train_x, train_y)
เรียกใช้สิ่งนี้และคุณควรเห็นผลลัพธ์ต่อไปนี้:
ความแม่นยำ: 80.66%
ไม่โทรมเกินไปด้วย
มาดูกันว่าเราสามารถสร้างโมเดลการเรียนรู้เชิงลึกที่สามารถเอาชนะหรืออย่างน้อยก็ตรงกับผลลัพธ์เหล่านี้ หากเราจัดการสิ่งนั้นได้ จะเป็นสัญญาณที่ดีว่าโมเดลการเรียนรู้เชิงลึกของเรามีประสิทธิภาพอย่างน้อยก็จำลองผลลัพธ์ของโมเดลการเรียนรู้ของเครื่องยอดนิยมที่ได้รับแจ้งจากผู้เชี่ยวชาญโดเมน
การสร้างแบบจำลอง
วันนี้ เราจะใช้ Keras ร่วมกับ Tensorflow เพื่อสร้างแบบจำลองของเรา Keras เป็นไลบรารี Python ที่ทำให้การสร้างโมเดลการเรียนรู้เชิงลึกทำได้ง่ายมาก เมื่อเทียบกับอินเทอร์เฟซระดับต่ำของ Tensorflow API นอกจากเลเยอร์ที่หนาแน่นแล้ว เรายังจะใช้เลเยอร์การฝังและเลเยอร์แบบวนซ้ำเพื่อเรียนรู้ข้อมูลเชิงความหมายของคำและรูปแบบโครงสร้างที่อาจเกิดขึ้นภายในข้อมูล
การล้างข้อมูล
อันดับแรก เราจะต้องจัดโครงสร้างข้อมูลใหม่ในลักษณะที่สามารถประมวลผลและเข้าใจได้ง่ายโดยโครงข่ายประสาทเทียมของเรา เราสามารถทำได้โดยแทนที่คำต่างๆ ด้วยตัวเลขที่ระบุเฉพาะ เมื่อรวมกับเวกเตอร์ที่ฝัง เราสามารถแสดงคำในลักษณะที่ทั้งยืดหยุ่นและละเอียดอ่อนทางความหมายได้
ในทางปฏิบัติ เราอยากจะฉลาดขึ้นเล็กน้อยเกี่ยวกับการประมวลผลล่วงหน้านี้ คุณควรให้ความสำคัญกับคำที่ใช้กันทั่วไป และกรองคำที่ใช้บ่อยที่สุด (เช่น the, this, a) ออกไปด้วย
เราสามารถใช้ฟังก์ชันนี้โดยใช้ Defaultdict และ NLTK เขียนโค้ดต่อไปนี้ลงในโมดูล Python แยกต่างหาก ฉันวางไว้ใน lib/get_top_x_words.py
from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)
ตอนนี้เราพร้อมที่จะสร้างแบบจำลองแล้ว เราต้องการเลเยอร์การฝัง เลเยอร์แบบ Convolutional และเลเยอร์ที่หนาแน่นเพื่อใช้ประโยชน์จากคุณลักษณะการเรียนรู้เชิงลึกทั้งหมดที่อาจเป็นประโยชน์สำหรับแอปพลิเคชันของเรา ด้วย Keras เราสามารถสร้างแบบจำลองได้ง่ายๆ:
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
เรียกใช้รหัสและคุณควรเห็นผลลัพธ์ต่อไปนี้
ความแม่นยำ: 77.20%
จำได้ว่าความแม่นยำของ Bayes ไร้เดียงสาและ SVC อยู่ที่ 73.56% และ 80.66% ตามลำดับ ดังนั้นโครงข่ายประสาทเทียมของเราจึงยึดถือเอาวิธีการจัดหมวดหมู่ข้อความทั่วไปบางวิธี
บทสรุป
วันนี้ เราได้กล่าวถึงการสร้างแบบจำลองการเรียนรู้เชิงลึกของการจำแนกประเภทเพื่อวิเคราะห์บทวิจารณ์เกี่ยวกับไวน์
เราพบว่าเราสามารถสร้างแบบจำลองที่สามารถแข่งขันและทำงานได้ดีกว่าอัลกอริธึมแมชชีนเลิร์นนิงอื่นๆ บางตัว เราหวังว่าคุณจะได้รับแรงบันดาลใจในการใช้ข้อมูลนี้เพื่อสร้างแอปพลิเคชันที่วิเคราะห์ชุดข้อมูลที่ซับซ้อนยิ่งขึ้นและสร้างผลลัพธ์ที่ซับซ้อนยิ่งขึ้น!
หมายเหตุ: คุณสามารถค้นหารหัสที่ฉันใช้สำหรับบทความนี้ใน GitHub
อ่านเพิ่มเติมในบล็อก Toptal Engineering:
- ความหมายที่ลึกซึ้งยิ่งขึ้น: การสร้างแบบจำลองหัวข้อใน Python
- วิธีสร้างบอทวิเคราะห์ความคิดเห็นทางอีเมล: บทช่วยสอน NLP