AI พร้อม Python - แพ็คเกจ NLTK

ในบทนี้เราจะเรียนรู้วิธีการเริ่มต้นใช้งาน Natural Language Toolkit Package

ข้อกำหนดเบื้องต้น

หากเราต้องการสร้างแอปพลิเคชันด้วยการประมวลผลภาษาธรรมชาติการเปลี่ยนแปลงในบริบทจะทำให้ยากที่สุด ปัจจัยบริบทมีอิทธิพลต่อวิธีที่เครื่องเข้าใจประโยคใดประโยคหนึ่ง ดังนั้นเราต้องพัฒนาแอปพลิเคชันภาษาธรรมชาติโดยใช้วิธีการเรียนรู้ของเครื่องเพื่อให้เครื่องเข้าใจวิธีที่มนุษย์สามารถเข้าใจบริบทได้

ในการสร้างแอปพลิเคชันดังกล่าวเราจะใช้แพ็คเกจ Python ที่เรียกว่า NLTK (Natural Language Toolkit Package)

การนำเข้า NLTK

เราจำเป็นต้องติดตั้ง NLTK ก่อนใช้งาน สามารถติดตั้งได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ -

pip install nltk

ในการสร้างแพ็คเกจ conda สำหรับ NLTK ให้ใช้คำสั่งต่อไปนี้ -

conda install -c anaconda nltk

หลังจากติดตั้งแพ็คเกจ NLTK แล้วเราจำเป็นต้องนำเข้าผ่านพรอมต์คำสั่ง python เราสามารถนำเข้าได้โดยเขียนคำสั่งต่อไปนี้ในพรอมต์คำสั่ง Python -

>>> import nltk

กำลังดาวน์โหลดข้อมูลของ NLTK

หลังจากนำเข้า NLTK แล้วเราจำเป็นต้องดาวน์โหลดข้อมูลที่ต้องการ สามารถทำได้ด้วยความช่วยเหลือของคำสั่งต่อไปนี้ในพรอมต์คำสั่ง Python -

>>> nltk.download()

การติดตั้งแพ็คเกจที่จำเป็นอื่น ๆ

สำหรับการสร้างแอปพลิเคชันการประมวลผลภาษาธรรมชาติโดยใช้ NLTK เราจำเป็นต้องติดตั้งแพ็คเกจที่จำเป็น แพ็คเกจมีดังนี้ -

เกนซิม

เป็นไลบรารีการสร้างแบบจำลองทางความหมายที่มีประสิทธิภาพซึ่งมีประโยชน์สำหรับแอปพลิเคชันมากมาย เราสามารถติดตั้งได้โดยดำเนินการคำสั่งต่อไปนี้ -

pip install gensim

รูปแบบ

จะใช้ในการทำ gensimแพคเกจทำงานอย่างถูกต้อง เราสามารถติดตั้งได้โดยดำเนินการคำสั่งต่อไปนี้

pip install pattern

แนวคิดของ Tokenization, Stemming และ Lemmatization

ในส่วนนี้เราจะทำความเข้าใจว่าอะไรคือโทเค็นการกำหนดต้นกำเนิดและการให้คำนาม

Tokenization

มันอาจถูกกำหนดให้เป็นกระบวนการทำลายข้อความที่กำหนดเช่นลำดับอักขระเป็นหน่วยเล็ก ๆ ที่เรียกว่าโทเค็น โทเค็นอาจเป็นคำตัวเลขหรือเครื่องหมายวรรคตอน เรียกอีกอย่างว่าการแบ่งส่วนคำ ต่อไปนี้เป็นตัวอย่างง่ายๆของโทเค็น -

Input - มะม่วงกล้วยสับปะรดและแอปเปิ้ลล้วนเป็นผลไม้

Output -

ขั้นตอนการทำลายข้อความที่กำหนดสามารถทำได้ด้วยความช่วยเหลือของการค้นหาขอบเขตของคำ การสิ้นสุดของคำและจุดเริ่มต้นของคำใหม่เรียกว่าขอบเขตของคำ ระบบการเขียนและโครงสร้างการพิมพ์ของคำมีอิทธิพลต่อขอบเขต

ในโมดูล Python NLTK เรามีแพ็คเกจต่างๆที่เกี่ยวข้องกับโทเค็นซึ่งเราสามารถใช้เพื่อแบ่งข้อความออกเป็นโทเค็นตามความต้องการของเรา บางส่วนของแพ็คเกจมีดังนี้ -

sent_tokenize แพ็คเกจ

ตามชื่อที่แนะนำแพ็คเกจนี้จะแบ่งข้อความที่ป้อนออกเป็นประโยค เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.tokenize import sent_tokenize

word_tokenize แพ็คเกจ

แพ็คเกจนี้แบ่งข้อความที่ป้อนเป็นคำ เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.tokenize import word_tokenize

แพ็คเกจ WordPunctTokenizer

แพ็กเกจนี้แบ่งข้อความที่ป้อนเป็นคำและเครื่องหมายวรรคตอน เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.tokenize import WordPuncttokenizer

Stemming

ในขณะที่ทำงานกับคำเราพบรูปแบบต่างๆมากมายเนื่องจากเหตุผลทางไวยากรณ์ แนวคิดของรูปแบบในที่นี้หมายความว่าเราต้องจัดการกับรูปแบบต่างๆของคำเดียวกันเช่นdemocracy, democratic, และ democratization. จำเป็นมากที่เครื่องจักรจะต้องเข้าใจว่าคำต่างๆเหล่านี้มีรูปแบบฐานเดียวกัน ด้วยวิธีนี้การแยกรูปแบบฐานของคำในขณะที่เราวิเคราะห์ข้อความจะมีประโยชน์

เราสามารถบรรลุสิ่งนี้ได้โดยการยับยั้ง ด้วยวิธีนี้เราสามารถพูดได้ว่าการแยกเสียงเป็นกระบวนการฮิวริสติกในการแยกรูปแบบฐานของคำโดยการตัดส่วนท้ายของคำ

ในโมดูล Python NLTK เรามีแพ็คเกจต่างๆที่เกี่ยวข้องกับการหยุดชะงัก แพคเกจเหล่านี้สามารถใช้เพื่อรับรูปแบบพื้นฐานของคำ แพ็คเกจเหล่านี้ใช้อัลกอริทึม บางส่วนของแพ็คเกจมีดังนี้ -

แพ็คเกจ PorterStemmer

แพคเกจ Python นี้ใช้อัลกอริทึมของ Porter เพื่อแยกรูปแบบพื้นฐาน เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.stem.porter import PorterStemmer

ตัวอย่างเช่นถ้าเราจะให้คำ ‘writing’ ในฐานะที่เป็นข้อมูลในการทำให้เกิดสิ่งนี้เราจะได้คำนั้น ‘write’ หลังจากหยุดชะงัก

แพ็คเกจ LancasterStemmer

แพคเกจ Python นี้จะใช้อัลกอริทึมของ Lancaster เพื่อแยกรูปแบบพื้นฐาน เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.stem.lancaster import LancasterStemmer

ตัวอย่างเช่นถ้าเราจะให้คำ ‘writing’ ในฐานะที่เป็นข้อมูลในการทำให้เกิดสิ่งนี้เราจะได้คำนั้น ‘write’ หลังจากหยุดชะงัก

แพ็คเกจ SnowballStemmer

แพคเกจ Python นี้จะใช้อัลกอริทึมของสโนว์บอลเพื่อแยกรูปแบบพื้นฐาน เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.stem.snowball import SnowballStemmer

ตัวอย่างเช่นถ้าเราจะให้คำ ‘writing’ ในฐานะที่เป็นข้อมูลในการทำให้เกิดสิ่งนี้เราจะได้คำนั้น ‘write’ หลังจากหยุดชะงัก

อัลกอริทึมทั้งหมดนี้มีระดับความเข้มงวดที่แตกต่างกัน ถ้าเราเปรียบเทียบสเต็มเมอร์ทั้งสามนี้แล้วพอร์เตอร์สเต็มเมอร์นั้นเข้มงวดน้อยที่สุดและแลงคาสเตอร์เข้มงวดที่สุด สโนว์บอลสเตมเมอร์ใช้งานได้ดีทั้งในด้านความเร็วและความเข้มงวด

Lemmatization

นอกจากนี้เรายังสามารถแยกรูปแบบฐานของคำได้โดยใช้การย่อขนาด โดยพื้นฐานแล้วจะทำงานนี้ด้วยการใช้คำศัพท์และการวิเคราะห์ทางสัณฐานวิทยาของคำโดยปกติมีจุดมุ่งหมายเพื่อลบคำลงท้ายที่ผันแปรเท่านั้น รูปแบบฐานของคำใด ๆ เรียกว่า lemma

ความแตกต่างที่สำคัญระหว่างการสะกดคำและการย่อคือการใช้คำศัพท์และการวิเคราะห์ทางสัณฐานวิทยาของคำ ความแตกต่างอีกประการหนึ่งคือการหยุดคำที่เกี่ยวข้องกันโดยทั่วไปส่วนใหญ่จะเป็นการยุบคำที่เกี่ยวข้องกับรากศัพท์ในขณะที่การย่อขนาดโดยทั่วไปจะยุบเฉพาะรูปแบบการผันคำที่แตกต่างกันของคำศัพท์ ตัวอย่างเช่นหากเราให้คำที่เห็นเป็นคำที่ป้อนการสะกดคำอาจส่งคืนคำว่า "s" แต่การสร้างคำอธิบายจะพยายามส่งคืนคำว่าเห็นหรือเห็นขึ้นอยู่กับว่าการใช้โทเค็นเป็นคำกริยาหรือคำนาม

ในโมดูล Python NLTK เรามีแพ็คเกจต่อไปนี้ที่เกี่ยวข้องกับกระบวนการสร้างคำศัพท์ซึ่งเราสามารถใช้เพื่อรับรูปแบบพื้นฐานของคำ -

แพ็คเกจ WordNetLemmatizer

แพคเกจ Python นี้จะดึงรูปแบบพื้นฐานของคำขึ้นอยู่กับว่าใช้เป็นคำนามหรือเป็นคำกริยา เราสามารถนำเข้าแพ็คเกจนี้ด้วยความช่วยเหลือของรหัส Python ต่อไปนี้ -

from nltk.stem import WordNetLemmatizer

Chunking: แบ่งข้อมูลออกเป็นชิ้น ๆ

เป็นกระบวนการสำคัญอย่างหนึ่งในการประมวลผลภาษาธรรมชาติ งานหลักของการแยกชิ้นส่วนคือการระบุส่วนของคำพูดและวลีสั้น ๆ เช่นวลีคำนาม เราได้ศึกษากระบวนการโทเค็นการสร้างโทเค็นแล้ว Chunking โดยทั่วไปคือการติดฉลากของโทเค็นเหล่านั้น กล่าวอีกนัยหนึ่งการแบ่งส่วนจะแสดงให้เราเห็นโครงสร้างของประโยค

ในส่วนต่อไปนี้เราจะเรียนรู้เกี่ยวกับประเภทต่างๆของ Chunking

ประเภทของก้อน

การทำก้อนมีสองประเภท ประเภทมีดังนี้ -

เป็นก้อนขึ้น

ในกระบวนการของการแยกชิ้นส่วนวัตถุสิ่งของ ฯลฯ จะเคลื่อนไปสู่ความเป็นสากลมากขึ้นและภาษาก็มีความเป็นนามธรรมมากขึ้น โอกาสในการตกลงมีมากขึ้น ในกระบวนการนี้เราย่อ ตัวอย่างเช่นหากเราจะถามคำถามที่ว่า“ รถยนต์เพื่อวัตถุประสงค์อะไร”? เราอาจได้รับคำตอบว่า "ขนส่ง"

ลดจำนวนลง

ในกระบวนการของการแยกชิ้นส่วนวัตถุสิ่งของ ฯลฯ จะเคลื่อนไปสู่ความเฉพาะเจาะจงมากขึ้นและภาษาได้รับการเจาะมากขึ้น โครงสร้างที่ลึกกว่าจะถูกตรวจสอบเป็นชิ้น ๆ ในขั้นตอนนี้เราจะซูมเข้าตัวอย่างเช่นถ้าเราสรุปคำถาม "บอกเฉพาะเกี่ยวกับรถ"? เราจะได้รับข้อมูลชิ้นเล็ก ๆ เกี่ยวกับรถ

Example

ในตัวอย่างนี้เราจะทำ Noun-Phrase chunking ซึ่งเป็นหมวดหมู่ของ chunking ซึ่งจะค้นหาวลีคำนามในประโยคโดยใช้โมดูล NLTK ใน Python -

Follow these steps in python for implementing noun phrase chunking −

Step 1- ในขั้นตอนนี้เราต้องกำหนดไวยากรณ์สำหรับการแยกชิ้นส่วน มันจะประกอบด้วยกฎที่เราต้องปฏิบัติตาม

Step 2- ในขั้นตอนนี้เราต้องสร้างตัวแยกวิเคราะห์แบบก้อน มันจะแยกวิเคราะห์ไวยากรณ์และให้ผลลัพธ์

Step 3 - ในขั้นตอนสุดท้ายนี้ผลลัพธ์จะถูกสร้างในรูปแบบต้นไม้

ให้เรานำเข้าแพ็คเกจ NLTK ที่จำเป็นดังต่อไปนี้ -

import nltk

ตอนนี้เราต้องกำหนดประโยค ในที่นี้ DT หมายถึงดีเทอร์มิแนนต์ VBP หมายถึงคำกริยา JJ หมายถึงคำคุณศัพท์ IN หมายถึงคำบุพบทและ NN หมายถึงคำนาม

sentence=[("a","DT"),("clever","JJ"),("fox","NN"),("was","VBP"),
          ("jumping","VBP"),("over","IN"),("the","DT"),("wall","NN")]

ตอนนี้เราต้องให้ไวยากรณ์ ในที่นี้เราจะให้ไวยากรณ์ในรูปแบบของนิพจน์ทั่วไป

grammar = "NP:{<DT>?<JJ>*<NN>}"

เราจำเป็นต้องกำหนด parser ซึ่งจะแยกวิเคราะห์ไวยากรณ์

parser_chunking = nltk.RegexpParser(grammar)

parser จะแยกวิเคราะห์ประโยคดังนี้ -

parser_chunking.parse(sentence)

ต่อไปเราต้องได้รับผลลัพธ์ ผลลัพธ์ถูกสร้างขึ้นในตัวแปรอย่างง่ายที่เรียกว่าoutput_chunk.

Output_chunk = parser_chunking.parse(sentence)

เมื่อดำเนินการตามรหัสต่อไปนี้เราสามารถวาดผลลัพธ์ของเราในรูปแบบของต้นไม้

output.draw()

Bag of Word (BoW) รุ่น

Bag of Word (BoW) ซึ่งเป็นแบบจำลองในการประมวลผลภาษาธรรมชาติโดยทั่วไปจะใช้เพื่อแยกคุณสมบัติจากข้อความเพื่อให้ข้อความสามารถใช้ในการสร้างแบบจำลองในอัลกอริทึมการเรียนรู้ของเครื่อง

ตอนนี้คำถามเกิดขึ้นว่าทำไมเราต้องดึงคุณสมบัติออกจากข้อความ เป็นเพราะอัลกอริทึมการเรียนรู้ของเครื่องไม่สามารถทำงานกับข้อมูลดิบและต้องการข้อมูลตัวเลขเพื่อให้สามารถดึงข้อมูลที่มีความหมายออกมาได้ การแปลงข้อมูลข้อความเป็นข้อมูลตัวเลขเรียกว่าการแยกคุณลักษณะหรือการเข้ารหัสคุณลักษณะ

มันทำงานอย่างไร

นี่เป็นวิธีที่ง่ายมากสำหรับการแยกคุณสมบัติออกจากข้อความ สมมติว่าเรามีเอกสารข้อความและต้องการแปลงเป็นข้อมูลตัวเลขหรือพูดว่าต้องการดึงคุณลักษณะออกจากนั้นก่อนอื่นแบบจำลองนี้จะดึงคำศัพท์จากคำทั้งหมดในเอกสาร จากนั้นโดยใช้เมทริกซ์คำศัพท์ของเอกสารจะสร้างแบบจำลอง ด้วยวิธีนี้ BoW จึงแสดงเอกสารเป็นถุงคำเท่านั้น ข้อมูลใด ๆ เกี่ยวกับลำดับหรือโครงสร้างของคำในเอกสารจะถูกทิ้ง

แนวคิดของเมทริกซ์ระยะเอกสาร

อัลกอริทึม BoW สร้างแบบจำลองโดยใช้เมทริกซ์คำศัพท์ของเอกสาร ตามชื่อที่แนะนำเมทริกซ์คำศัพท์ของเอกสารคือเมทริกซ์ของจำนวนคำต่างๆที่เกิดขึ้นในเอกสาร ด้วยความช่วยเหลือของเมทริกซ์นี้เอกสารข้อความสามารถแสดงเป็นชุดค่าผสมที่ถ่วงน้ำหนักของคำต่างๆ ด้วยการตั้งค่าขีด จำกัด และเลือกคำที่มีความหมายมากขึ้นเราสามารถสร้างฮิสโตแกรมของคำทั้งหมดในเอกสารที่สามารถใช้เป็นเวกเตอร์คุณลักษณะได้ ต่อไปนี้เป็นตัวอย่างเพื่อทำความเข้าใจแนวคิดของเมทริกซ์ระยะเอกสาร -

Example

สมมติว่าเรามีสองประโยคต่อไปนี้ -

  • Sentence 1 - เรากำลังใช้โมเดล Bag of Words

  • Sentence 2 - แบบจำลอง Bag of Words ใช้สำหรับการแยกคุณสมบัติ

ตอนนี้เมื่อพิจารณาสองประโยคนี้เรามี 13 คำที่แตกต่างกันดังต่อไปนี้ -

  • we
  • are
  • using
  • the
  • bag
  • of
  • words
  • model
  • is
  • used
  • for
  • extracting
  • features

ตอนนี้เราต้องสร้างฮิสโตแกรมสำหรับแต่ละประโยคโดยใช้จำนวนคำในแต่ละประโยค -

  • Sentence 1 - [1,1,1,1,1,1,1,1,0,0,0,0,0,0]

  • Sentence 2 - [0,0,0,1,1,1,1,1,1,1,1,1,1]

ด้วยวิธีนี้เรามีเวกเตอร์คุณลักษณะที่แยกออกมาแล้ว เวกเตอร์คุณลักษณะแต่ละตัวมีขนาด 13 มิติเนื่องจากเรามีคำที่แตกต่างกัน 13 คำ

แนวคิดของสถิติ

แนวคิดของสถิติเรียกว่า TermFrequency-Inverse Document Frequency (tf-idf) ทุกคำมีความสำคัญในเอกสาร สถิติช่วยให้เราเข้าใจความสำคัญของทุกคำ

ระยะความถี่ (tf)

เป็นการวัดความถี่ที่คำแต่ละคำปรากฏในเอกสาร สามารถหาได้โดยการหารจำนวนคำแต่ละคำด้วยจำนวนคำทั้งหมดในเอกสารที่กำหนด

ความถี่เอกสารผกผัน (idf)

เป็นการวัดความแตกต่างของคำในเอกสารนี้ในชุดเอกสารที่กำหนด สำหรับการคำนวณ idf และการสร้างเวกเตอร์คุณลักษณะที่โดดเด่นเราจำเป็นต้องลดน้ำหนักของคำที่เกิดขึ้นบ่อยเช่นและให้น้ำหนักคำที่หายาก

การสร้างแบบจำลองถุงคำใน NLTK

ในส่วนนี้เราจะกำหนดชุดของสตริงโดยใช้ CountVectorizer เพื่อสร้างเวกเตอร์จากประโยคเหล่านี้

ให้เรานำเข้าแพ็คเกจที่จำเป็น -

from sklearn.feature_extraction.text import CountVectorizer

ตอนนี้กำหนดชุดของประโยค

Sentences = ['We are using the Bag of Word model', 'Bag of Word model is
           used for extracting the features.']

vectorizer_count = CountVectorizer()

features_text = vectorizer.fit_transform(Sentences).todense()

print(vectorizer.vocabulary_)

โปรแกรมด้านบนจะสร้างผลลัพธ์ตามที่แสดงด้านล่าง แสดงว่าเรามี 13 คำที่แตกต่างกันในสองประโยคข้างต้น -

{'we': 11, 'are': 0, 'using': 10, 'the': 8, 'bag': 1, 'of': 7,
 'word': 12, 'model': 6, 'is': 5, 'used': 9, 'for': 4, 'extracting': 2, 'features': 3}

นี่คือเวกเตอร์คุณลักษณะ (ข้อความเป็นรูปแบบตัวเลข) ซึ่งสามารถใช้สำหรับการเรียนรู้ของเครื่อง

แก้ไขปัญหา

ในส่วนนี้เราจะแก้ปัญหาที่เกี่ยวข้องเล็กน้อย

การทำนายหมวดหมู่

ในชุดเอกสารไม่เพียง แต่คำ แต่หมวดหมู่ของคำก็มีความสำคัญเช่นกัน ข้อความในหมวดหมู่ใดที่มีคำใดคำหนึ่งตกอยู่ ตัวอย่างเช่นเราต้องการคาดคะเนว่าประโยคใดเป็นของอีเมลหมวดหมู่ข่าวสารกีฬาคอมพิวเตอร์ ฯลฯ ในตัวอย่างต่อไปนี้เราจะใช้ tf-idf เพื่อกำหนดเวกเตอร์คุณลักษณะเพื่อค้นหาหมวดหมู่ของเอกสาร เราจะใช้ข้อมูลจากชุดข้อมูล 20 กลุ่มข่าวของ sklearn

เราจำเป็นต้องนำเข้าแพ็คเกจที่จำเป็น -

from sklearn.datasets import fetch_20newsgroups
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

กำหนดแผนที่หมวดหมู่ เราใช้ห้าหมวดหมู่ที่แตกต่างกันชื่อศาสนารถยนต์กีฬาอิเล็กทรอนิกส์และอวกาศ

category_map = {'talk.religion.misc':'Religion','rec.autos''Autos',
   'rec.sport.hockey':'Hockey','sci.electronics':'Electronics', 'sci.space': 'Space'}

สร้างชุดฝึก -

training_data = fetch_20newsgroups(subset = 'train',
   categories = category_map.keys(), shuffle = True, random_state = 5)

สร้างเวกเตอร์การนับและแยกคำที่นับ -

vectorizer_count = CountVectorizer()
train_tc = vectorizer_count.fit_transform(training_data.data)
print("\nDimensions of training data:", train_tc.shape)

หม้อแปลง tf-idf ถูกสร้างขึ้นดังนี้ -

tfidf = TfidfTransformer()
train_tfidf = tfidf.fit_transform(train_tc)

ตอนนี้กำหนดข้อมูลการทดสอบ -

input_data = [
   'Discovery was a space shuttle',
   'Hindu, Christian, Sikh all are religions',
   'We must have to drive safely',
   'Puck is a disk made of rubber',
   'Television, Microwave, Refrigrated all uses electricity'
]

ข้อมูลข้างต้นจะช่วยให้เราฝึกตัวจำแนก Multinomial Naive Bayes -

classifier = MultinomialNB().fit(train_tfidf, training_data.target)

แปลงข้อมูลอินพุตโดยใช้ตัวนับเวกเตอร์ -

input_tc = vectorizer_count.transform(input_data)

ตอนนี้เราจะแปลงข้อมูลเวกเตอร์โดยใช้หม้อแปลง tfidf -

input_tfidf = tfidf.transform(input_tc)

เราจะทำนายประเภทผลลัพธ์ -

predictions = classifier.predict(input_tfidf)

ผลลัพธ์ถูกสร้างขึ้นดังนี้ -

for sent, category in zip(input_data, predictions):
   print('\nInput Data:', sent, '\n Category:', \
      category_map[training_data.target_names[category]])

ตัวทำนายหมวดหมู่จะสร้างผลลัพธ์ต่อไปนี้ -

Dimensions of training data: (2755, 39297)

Input Data: Discovery was a space shuttle
Category: Space

Input Data: Hindu, Christian, Sikh all are religions
Category: Religion

Input Data: We must have to drive safely
Category: Autos

Input Data: Puck is a disk made of rubber
Category: Hockey

Input Data: Television, Microwave, Refrigrated all uses electricity
Category: Electronics

ตัวค้นหาเพศ

ในคำชี้แจงปัญหานี้ลักษณนามจะได้รับการฝึกฝนเพื่อค้นหาเพศ (ชายหรือหญิง) โดยการระบุชื่อ เราจำเป็นต้องใช้ฮิวริสติกเพื่อสร้างเวกเตอร์คุณลักษณะและฝึกลักษณนาม เราจะใช้ข้อมูลที่มีป้ายกำกับจากแพ็คเกจ scikit-learn ต่อไปนี้เป็นรหัส Python เพื่อสร้างตัวค้นหาเพศ -

ให้เรานำเข้าแพ็คเกจที่จำเป็น -

import random

from nltk import NaiveBayesClassifier
from nltk.classify import accuracy as nltk_accuracy
from nltk.corpus import names

ตอนนี้เราต้องแยกตัวอักษร N สุดท้ายออกจากคำที่ป้อน ตัวอักษรเหล่านี้จะทำหน้าที่เป็นคุณสมบัติ -

def extract_features(word, N = 2):
   last_n_letters = word[-N:]
   return {'feature': last_n_letters.lower()}
	
if __name__=='__main__':

สร้างข้อมูลการฝึกอบรมโดยใช้ชื่อที่มีป้ายกำกับ (ชายและหญิง) ที่มีอยู่ใน NLTK -

male_list = [(name, 'male') for name in names.words('male.txt')]
female_list = [(name, 'female') for name in names.words('female.txt')]
data = (male_list + female_list)

random.seed(5)
random.shuffle(data)

ตอนนี้ข้อมูลการทดสอบจะถูกสร้างขึ้นดังนี้ -

namesInput = ['Rajesh', 'Gaurav', 'Swati', 'Shubha']

กำหนดจำนวนตัวอย่างที่ใช้ในการฝึกและทดสอบด้วยรหัสต่อไปนี้

train_sample = int(0.8 * len(data))

ตอนนี้เราต้องวนซ้ำตามความยาวที่แตกต่างกันเพื่อให้สามารถเปรียบเทียบความแม่นยำได้ -

for i in range(1, 6):
   print('\nNumber of end letters:', i)
   features = [(extract_features(n, i), gender) for (n, gender) in data]
   train_data, test_data = features[:train_sample],
features[train_sample:]
   classifier = NaiveBayesClassifier.train(train_data)

ความถูกต้องของลักษณนามสามารถคำนวณได้ดังนี้ -

accuracy_classifier = round(100 * nltk_accuracy(classifier, test_data), 2)
   print('Accuracy = ' + str(accuracy_classifier) + '%')

ตอนนี้เราสามารถทำนายผลลัพธ์ -

for name in namesInput:
   print(name, '==>', classifier.classify(extract_features(name, i)))

โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้ -

Number of end letters: 1
Accuracy = 74.7%
Rajesh -> female
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 2
Accuracy = 78.79%
Rajesh -> male
Gaurav -> male
Swati -> female
Shubha -> female

Number of end letters: 3
Accuracy = 77.22%
Rajesh -> male
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 4
Accuracy = 69.98%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

Number of end letters: 5
Accuracy = 64.63%
Rajesh -> female
Gaurav -> female
Swati -> female
Shubha -> female

ในผลลัพธ์ด้านบนเราจะเห็นว่าความแม่นยำของตัวอักษรปิดท้ายจำนวนสูงสุดคือสองตัวและจะลดลงเมื่อจำนวนอักษรปิดท้ายเพิ่มขึ้น

การสร้างแบบจำลองหัวข้อ: การระบุรูปแบบในข้อมูลข้อความ

เราทราบดีว่าโดยทั่วไปเอกสารจะถูกจัดกลุ่มเป็นหัวข้อต่างๆ บางครั้งเราจำเป็นต้องระบุรูปแบบในข้อความที่สอดคล้องกับหัวข้อใดหัวข้อหนึ่ง เทคนิคการทำเช่นนี้เรียกว่าการสร้างแบบจำลองหัวข้อ กล่าวอีกนัยหนึ่งเราสามารถพูดได้ว่าการสร้างแบบจำลองหัวข้อเป็นเทคนิคในการเปิดเผยธีมนามธรรมหรือโครงสร้างที่ซ่อนอยู่ในชุดเอกสารที่กำหนด

เราสามารถใช้เทคนิคการสร้างแบบจำลองหัวข้อในสถานการณ์ต่อไปนี้ -

การจัดประเภทข้อความ

ด้วยความช่วยเหลือของการสร้างแบบจำลองหัวข้อสามารถปรับปรุงการจัดประเภทได้เนื่องจากจัดกลุ่มคำที่คล้ายกันเข้าด้วยกันแทนที่จะใช้แต่ละคำแยกกันเป็นคุณลักษณะ

ระบบผู้แนะนำ

ด้วยความช่วยเหลือของการสร้างแบบจำลองหัวข้อเราสามารถสร้างระบบผู้แนะนำโดยใช้มาตรการความคล้ายคลึงกัน

อัลกอริทึมสำหรับการสร้างแบบจำลองหัวข้อ

การสร้างแบบจำลองหัวข้อสามารถทำได้โดยใช้อัลกอริทึม อัลกอริทึมมีดังนี้ -

การจัดสรร Dirichlet แฝง (LDA)

อัลกอริทึมนี้เป็นที่นิยมมากที่สุดสำหรับการสร้างแบบจำลองหัวข้อ ใช้โมเดลกราฟิกที่น่าจะเป็นในการใช้การสร้างแบบจำลองหัวข้อ เราจำเป็นต้องนำเข้าแพ็คเกจ gensim ใน Python เพื่อใช้ LDA sl algorithm

การวิเคราะห์ความหมายแฝง (LDA) หรือการจัดทำดัชนีความหมายแฝง (LSI)

อัลกอริทึมนี้ขึ้นอยู่กับพีชคณิตเชิงเส้น โดยทั่วไปจะใช้แนวคิดของ SVD (Singular Value Decomposition) บนเมทริกซ์คำศัพท์ของเอกสาร

การแยกตัวประกอบเมทริกซ์ที่ไม่ใช่เชิงลบ (NMF)

นอกจากนี้ยังขึ้นอยู่กับพีชคณิตเชิงเส้น

อัลกอริทึมที่กล่าวถึงข้างต้นทั้งหมดสำหรับการสร้างแบบจำลองหัวข้อจะมีไฟล์ number of topics เป็นพารามิเตอร์ Document-Word Matrix เป็นอินพุตและ WTM (Word Topic Matrix) & TDM (Topic Document Matrix) เป็นเอาต์พุต