Gensim - คู่มือฉบับย่อ

บทนี้จะช่วยให้คุณเข้าใจประวัติและคุณสมบัติของ Gensim พร้อมกับการใช้งานและข้อดี

Gensim คืออะไร?

Gensim = “Generate Similar”เป็นไลบรารีการประมวลผลภาษาธรรมชาติแบบโอเพนซอร์ส (NLP) ยอดนิยมที่ใช้สำหรับการสร้างแบบจำลองหัวข้อที่ไม่ได้รับการดูแล ใช้แบบจำลองทางวิชาการชั้นนำและการเรียนรู้ของเครื่องจักรทางสถิติที่ทันสมัยเพื่อทำงานที่ซับซ้อนต่างๆเช่น -

  • การสร้างเอกสารหรือเวกเตอร์คำ
  • Corpora
  • ทำการระบุหัวข้อ
  • ทำการเปรียบเทียบเอกสาร (ดึงเอกสารที่มีความหมายคล้ายกัน)
  • การวิเคราะห์เอกสารข้อความธรรมดาสำหรับโครงสร้างความหมาย

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

ประวัติศาสตร์

ในปี 2008 Gensim เริ่มต้นจากการรวบรวมสคริปต์ Python ต่างๆสำหรับคณิตศาสตร์ดิจิทัลของเช็ก ที่นั่นทำหน้าที่สร้างรายการสั้น ๆ ของบทความที่คล้ายกันมากที่สุดกับบทความหนึ่ง ๆ แต่ในปี 2009 RARE Technologies Ltd. ได้เปิดตัวรุ่นแรก จากนั้นต่อมาในเดือนกรกฎาคม 2019 เรามีรุ่นที่เสถียร (3.8.0)

คุณสมบัติต่างๆ

ต่อไปนี้เป็นคุณสมบัติและความสามารถบางส่วนที่ Gensim นำเสนอ -

ความสามารถในการปรับขนาด

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

แข็งแกร่ง

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

ไม่เชื่อเรื่องพระเจ้าของแพลตฟอร์ม

อย่างที่เราทราบกันดีว่า Python เป็นภาษาที่มีความหลากหลายมากเนื่องจาก Python Gensim บริสุทธิ์ทำงานได้บนทุกแพลตฟอร์ม (เช่น Windows, Mac OS, Linux) ที่รองรับ Python และ Numpy

การใช้งานมัลติคอร์ที่มีประสิทธิภาพ

เพื่อเพิ่มความเร็วในการประมวลผลและการดึงข้อมูลบนคลัสเตอร์ของเครื่อง Gensim นำเสนอการใช้งานอัลกอริธึมยอดนิยมหลาย ๆ แบบหลายคอร์ Latent Semantic Analysis (LSA), Latent Dirichlet Allocation (LDA), Random Projections (RP), Hierarchical Dirichlet Process (HDP).

โอเพ่นซอร์สและการสนับสนุนชุมชนมากมาย

Gensim ได้รับอนุญาตภายใต้ใบอนุญาต GNU LGPL ที่ได้รับการรับรองจาก OSI ซึ่งอนุญาตให้ใช้สำหรับการใช้งานส่วนตัวและเชิงพาณิชย์ได้ฟรี การปรับเปลี่ยนใด ๆ ที่เกิดขึ้นใน Gensim นั้นเป็นแบบโอเพนซอร์สและได้รับการสนับสนุนจากชุมชนมากมายเช่นกัน

การใช้ Gensim

Gensim ถูกใช้และอ้างถึงในแอพพลิเคชั่นเชิงพาณิชย์และวิชาการมากกว่าพันรายการ นอกจากนี้ยังมีการอ้างอิงจากเอกสารการวิจัยและวิทยานิพนธ์ของนักเรียนต่างๆ ซึ่งรวมถึงการใช้งานแบบขนานที่สตรีมต่อไปนี้ -

fastText

fastText ใช้เครือข่ายประสาทเทียมสำหรับการฝังคำเป็นห้องสมุดสำหรับการเรียนรู้การฝังคำและการจัดประเภทข้อความ สร้างโดยห้องปฏิบัติการ AI Research (FAIR) ของ Facebook โดยพื้นฐานแล้วแบบจำลองนี้ช่วยให้เราสามารถสร้างอัลกอริทึมภายใต้การดูแลหรือไม่ได้รับการดูแลเพื่อให้ได้การแสดงเวกเตอร์สำหรับคำต่างๆ

Word2vec

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

LSA (การวิเคราะห์ความหมายแฝง)

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

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

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

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

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

ทั้งหมดนี้จะอธิบายโดยละเอียดในหัวข้อถัดไป

ข้อดี

Gensim เป็นแพ็คเกจ NLP ที่ทำแบบจำลองหัวข้อ ข้อดีที่สำคัญของ Gensim มีดังนี้ -

  • เราอาจได้รับสิ่งอำนวยความสะดวกในการสร้างแบบจำลองหัวข้อและการฝังคำในแพ็คเกจอื่น ๆ เช่น ‘scikit-learn’ และ ‘R’แต่สิ่งอำนวยความสะดวกที่ Gensim จัดหาให้สำหรับการสร้างแบบจำลองหัวข้อและการฝังคำนั้นไม่มีใครเทียบได้ นอกจากนี้ยังมีสิ่งอำนวยความสะดวกเพิ่มเติมสำหรับการประมวลผลข้อความ

  • ข้อดีอีกอย่างที่สำคัญที่สุดของ Gensim คือช่วยให้เราจัดการไฟล์ข้อความขนาดใหญ่ได้โดยไม่ต้องโหลดทั้งไฟล์ในหน่วยความจำ

  • Gensim ไม่ต้องการคำอธิบายประกอบที่มีราคาแพงหรือการติดแท็กเอกสารด้วยมือเนื่องจากใช้แบบจำลองที่ไม่ได้รับการดูแล

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

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

ในการติดตั้ง Gensim เราต้องติดตั้ง Python บนคอมพิวเตอร์ของเรา คุณสามารถไปที่ลิงค์www.python.org/downloads/และเลือกเวอร์ชันล่าสุดสำหรับระบบปฏิบัติการของคุณเช่น Windows และ Linux / Unix คุณสามารถอ้างอิงลิงค์www.tutorialspoint.com/python3/index.htmสำหรับบทช่วยสอนพื้นฐานเกี่ยวกับ Python Gensim รองรับ Linux, Windows และ Mac OS X

การอ้างอิงรหัส

Gensim ควรทำงานบนแพลตฟอร์มใดก็ได้ที่รองรับ Python 2.7 or 3.5+ และ NumPy. ขึ้นอยู่กับซอฟต์แวร์ต่อไปนี้ -

Python

Gensim ได้รับการทดสอบกับ Python เวอร์ชัน 2.7, 3.5, 3.6 และ 3.7

Numpy

อย่างที่เราทราบกันดีว่า NumPy เป็นแพ็คเกจสำหรับการคำนวณทางวิทยาศาสตร์ด้วย Python นอกจากนี้ยังสามารถใช้เป็นที่เก็บข้อมูลทั่วไปหลายมิติได้อย่างมีประสิทธิภาพ Gensim ขึ้นอยู่กับแพ็คเกจ NumPy สำหรับการกระทืบจำนวน สำหรับการกวดวิชาพื้นฐานเกี่ยวกับงูหลาม, คุณสามารถดูการเชื่อมโยงwww.tutorialspoint.com/numpy/index.htm

smart_open

smart_open ซึ่งเป็นไลบรารี Python 2 และ Python 3 ใช้สำหรับการสตรีมไฟล์ขนาดใหญ่อย่างมีประสิทธิภาพ รองรับการสตรีมจาก / ไปยังพื้นที่จัดเก็บเช่น S3, HDFS, WebHDFS, HTTP, HTTPS, SFTP หรือระบบไฟล์ในเครื่อง Gensim ขึ้นอยู่กับsmart_open ไลบรารี Python สำหรับเปิดไฟล์อย่างโปร่งใสบนที่เก็บข้อมูลระยะไกลและไฟล์บีบอัด

เวอร์ชันปัจจุบัน

Gensim เวอร์ชันปัจจุบันคือ 3.8.0 ซึ่งเปิดตัวในเดือนกรกฎาคม 2019

การติดตั้งโดยใช้Terminal

วิธีที่ง่ายที่สุดวิธีหนึ่งในการติดตั้ง Gensim คือการรันคำสั่งต่อไปนี้ในเทอร์มินัลของคุณ -

pip install --upgrade gensim

การติดตั้งโดยใช้Conda Environment

อีกวิธีหนึ่งในการดาวน์โหลด Gensim คือการใช้ condaสิ่งแวดล้อม. เรียกใช้คำสั่งต่อไปนี้ในไฟล์conda ขั้ว -

conda install –c conda-forge gensim

การติดตั้งโดยใช้Source Package

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

python setup.py test
python setup.py install

ที่นี่เราจะเรียนรู้เกี่ยวกับแนวคิดหลักของ Gensim โดยเน้นที่เอกสารและคลังข้อมูลเป็นหลัก

แนวคิดหลักของ Gensim

ต่อไปนี้เป็นแนวคิดหลักและคำศัพท์ที่จำเป็นในการทำความเข้าใจและใช้ Gensim -

  • Document - ZIt หมายถึงข้อความบางส่วน

  • Corpus - หมายถึงชุดเอกสาร

  • Vector - การแสดงเอกสารทางคณิตศาสตร์เรียกว่าเวกเตอร์

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

เอกสารคืออะไร?

ตามที่กล่าวไว้นั้นหมายถึงข้อความบางส่วน หากเราดูรายละเอียดบางอย่างมันเป็นวัตถุประเภทลำดับข้อความซึ่งเรียกว่า‘str’ ใน Python 3 ตัวอย่างเช่นใน Gensim เอกสารอาจเป็นอะไรก็ได้เช่น -

  • ทวีตสั้น ๆ 140 ตัวอักษร
  • ย่อหน้าเดียว ได้แก่ บทความหรือบทคัดย่อของงานวิจัย
  • หัวข้อข่าว
  • Book
  • Novel
  • Theses

ลำดับข้อความ

ประเภทลำดับข้อความมักเรียกว่า ‘str’ ใน Python 3 อย่างที่เราทราบกันดีว่าใน Python ข้อมูลที่เป็นข้อความจะถูกจัดการด้วยสตริงหรือมากกว่านั้นโดยเฉพาะ ‘str’วัตถุ สตริงเป็นลำดับที่ไม่เปลี่ยนรูปของจุดรหัส Unicode โดยทั่วไปและสามารถเขียนได้ด้วยวิธีต่อไปนี้ -

  • Single quotes - ตัวอย่างเช่น ‘Hi! How are you?’. ช่วยให้เราสามารถฝังเครื่องหมายคำพูดคู่ได้ด้วย ตัวอย่างเช่น,‘Hi! “How” are you?’

  • Double quotes - ตัวอย่างเช่น "Hi! How are you?". ช่วยให้เราสามารถฝังคำพูดเดี่ยวได้ด้วย ตัวอย่างเช่น,"Hi! 'How' are you?"

  • Triple quotes - สามารถมีได้สามคำพูดเดียวเช่น '''Hi! How are you?'''. หรือสามคำพูดคู่เช่น"""Hi! 'How' are you?"""

ช่องว่างทั้งหมดจะรวมอยู่ในสตริงลิเทอรัล

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างของเอกสารใน Gensim -

Document = “Tutorialspoint.com is the biggest online tutorials library and it’s all free also”

Corpus คืออะไร?

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

บทบาทของ Corpus ใน Gensim

คลังข้อมูลใน Gensim ทำหน้าที่สองบทบาทต่อไปนี้ -

ทำหน้าที่เป็นข้อมูลสำหรับการฝึกอบรมนางแบบ

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

ทำหน้าที่เป็นตัวแยกหัวข้อ

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

ตัวอย่าง

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

การรวบรวม Corpus

ต่อไปนี้เป็นตัวอย่างคลังข้อมูลขนาดเล็กที่มีเอกสาร 5 ชุด ที่นี่เอกสารทุกฉบับเป็นสตริงที่ประกอบด้วยประโยคเดียว

t_corpus = [
   "A survey of user opinion of computer system response time",
   "Relation of user perceived response time to error measurement",
   "The generation of random binary unordered trees",
   "The intersection graph of paths in trees",
   "Graph minors IV Widths of trees and well quasi ordering",
]

การประมวลผลก่อนการรวบรวมคอร์ปัส

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

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

ตัวอย่าง

import pprint
t_corpus = [
   "A survey of user opinion of computer system response time", 
   "Relation of user perceived response time to error measurement", 
   "The generation of random binary unordered trees", 
   "The intersection graph of paths in trees", 
   "Graph minors IV Widths of trees and well quasi ordering",
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [[word for word in document.lower().split() if word not in stoplist]
   for document in t_corpus]
	
pprint.pprint(processed_corpus)
]

เอาต์พุต

[['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
['generation', 'random', 'binary', 'unordered', 'trees'],
['intersection', 'graph', 'paths', 'trees'],
['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering']]

Preprocessing ที่มีประสิทธิภาพ

Gensim ยังมีฟังก์ชันสำหรับการประมวลผลก่อนการประมวลผลของคลังข้อมูลที่มีประสิทธิภาพมากขึ้น ในการประมวลผลล่วงหน้าประเภทนี้เราสามารถแปลงเอกสารเป็นรายการโทเค็นตัวพิมพ์เล็ก นอกจากนี้เรายังสามารถละเว้นโทเค็นที่สั้นหรือยาวเกินไปได้ ฟังก์ชันดังกล่าวคือgensim.utils.simple_preprocess(doc, deacc=False, min_len=2, max_len=15).

gensim.utils.simple_preprocess() fucntion

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

เอกสาร (str)

หมายถึงเอกสารอินพุตที่ควรใช้การประมวลผลล่วงหน้า

deacc (บูลตัวเลือก)

พารามิเตอร์นี้ใช้เพื่อลบเครื่องหมายเน้นเสียงออกจากโทเค็น มันใช้deaccent() เพื่อทำสิ่งนี้.

min_len (int, ไม่บังคับ)

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

max_len (int ทางเลือก)

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

ผลลัพธ์ของฟังก์ชันนี้จะเป็นโทเค็นที่ดึงมาจากเอกสารอินพุต

ที่นี่เราจะเรียนรู้เกี่ยวกับแนวคิดหลักของ Gensim โดยเน้นที่เวกเตอร์และโมเดลเป็นหลัก

Vector คืออะไร?

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

เพื่อให้คุณเป็นตัวอย่างลองแสดงคุณลักษณะเดียวจากคลังข้อมูลที่ใช้ข้างต้นของเราเป็นคู่ QA -

Q - กี่ครั้งคำ Hello ปรากฏในเอกสาร?

A - ศูนย์ (0)

Q - ในเอกสารมีกี่ย่อหน้า?

A - สอง (2)

โดยทั่วไปคำถามจะแสดงด้วยรหัสจำนวนเต็มดังนั้นการแสดงเอกสารนี้จึงเป็นชุดของคู่เช่น (1, 0.0), (2, 2.0) การแทนเวกเตอร์ดังกล่าวเรียกว่า adenseเวกเตอร์. ทำไมdenseเนื่องจากประกอบด้วยคำตอบที่ชัดเจนสำหรับคำถามทั้งหมดที่เขียนไว้ข้างต้น

การแทนค่าสามารถทำได้ง่ายๆเช่น (0, 2) ถ้าเรารู้คำถามทั้งหมดล่วงหน้า ลำดับของคำตอบดังกล่าว (แน่นอนหากทราบคำถามล่วงหน้า) คือvector สำหรับเอกสารของเรา

การเป็นตัวแทนที่ได้รับความนิยมอีกประเภทหนึ่งคือ bag-of-word (BoW)แบบ. ในแนวทางนี้เอกสารแต่ละฉบับจะแสดงด้วยเวกเตอร์ที่มีจำนวนความถี่ของทุกคำในพจนานุกรม

ตัวอย่างเช่นสมมติว่าเรามีพจนานุกรมที่มีคำว่า ['Hello', 'How', 'are', 'you'] เอกสารที่ประกอบด้วยสตริง“ คุณเป็นอย่างไรบ้าง” จะแสดงด้วยเวกเตอร์ [0, 2, 1, 1] ในที่นี้รายการของเวกเตอร์จะเรียงตามลำดับการเกิด“ สวัสดี”“ อย่างไร”“ เป็น” และ“ คุณ”

เวกเตอร์เทียบกับเอกสาร

จากคำอธิบายข้างต้นของเวกเตอร์ความแตกต่างระหว่างเอกสารและเวกเตอร์นั้นแทบจะเข้าใจได้ แต่เพื่อให้ชัดเจนขึ้นdocument คือข้อความและ vectorเป็นการแสดงข้อความที่สะดวกทางคณิตศาสตร์ น่าเสียดายที่บางครั้งหลายคนใช้คำเหล่านี้สลับกัน

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

การแปลงคอร์ปัสเป็นรายการเวกเตอร์

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

ตัวอย่าง

from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

เอาต์พุต

Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)

แสดงให้เห็นว่าในคลังข้อมูลของเรามี 25 โทเค็นที่แตกต่างกันในนี้ gensim.corpora.Dictionary.

ตัวอย่างการใช้งาน

เราสามารถใช้พจนานุกรมเพื่อเปลี่ยนเอกสารโทเค็นให้เป็นเวกเตอร์ 5 มิติดังต่อไปนี้ -

pprint.pprint(dictionary.token2id)

เอาต์พุต

{
   'binary': 11,
   'computer': 0,
   'error': 7,
   'generation': 12,
   'graph': 16,
   'intersection': 17,
   'iv': 19,
   'measurement': 8,
   'minors': 20,
   'opinion': 1,
   'ordering': 21,
   'paths': 18,
   'perceived': 9,
   'quasi': 22,
   'random': 13,
   'relation': 10,
   'response': 2,
   'survey': 3,
   'system': 4,
   'time': 5,
   'trees': 14,
   'unordered': 15,
   'user': 6,
   'well': 23,
   'widths': 24
}

และในทำนองเดียวกันเราสามารถสร้างการแสดงถุงคำสำหรับเอกสารได้ดังนี้ -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

เอาต์พุต

[
   [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
   [(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
   [(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
   [(14, 1), (16, 1), (17, 1), (18, 1)],
   [(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]

Model คืออะไร?

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

ดังที่เราได้กล่าวไปแล้วเอกสารใน Gensim จะแสดงเป็นเวกเตอร์ดังนั้นเราจึงทำได้แม้ว่าแบบจำลองเป็นการแปลงระหว่างช่องว่างเวกเตอร์สองช่อง มีขั้นตอนการฝึกอบรมอยู่เสมอซึ่งแบบจำลองจะเรียนรู้รายละเอียดของการเปลี่ยนแปลงดังกล่าว แบบจำลองจะอ่านคลังข้อมูลการฝึกอบรมในระหว่างขั้นตอนการฝึกอบรม

การเริ่มต้นโมเดล

เริ่มต้นกันเลย tf-idfแบบ. แบบจำลองนี้จะแปลงเวกเตอร์จากการแทน BoW (Bag of Words) ไปเป็นพื้นที่เวกเตอร์อื่นซึ่งการนับความถี่จะถูกถ่วงน้ำหนักตามความหายากสัมพัทธ์ของทุกคำในคลังข้อมูล

ตัวอย่างการใช้งาน

ในตัวอย่างต่อไปนี้เราจะเริ่มต้นไฟล์ tf-idfแบบ. เราจะฝึกมันในคลังข้อมูลของเราแล้วแปลง "กราฟต้นไม้" ของสตริง

ตัวอย่าง

from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])

เอาต์พุต

[(3, 0.4869354917707381), (4, 0.8734379353188121)]

ตอนนี้เมื่อเราสร้างแบบจำลองแล้วเราสามารถแปลงคลังข้อมูลทั้งหมดผ่าน tfidf และจัดทำดัชนีและค้นหาความคล้ายคลึงกันของเอกสารแบบสอบถามของเรา (เรากำลังให้เอกสารแบบสอบถาม 'ระบบต้นไม้') กับเอกสารแต่ละฉบับในคลังข้อมูล -

ตัวอย่าง

from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))

เอาต์พุต

[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]

จากผลลัพธ์ข้างต้นเอกสาร 4 และเอกสาร 5 มีคะแนนความคล้ายคลึงกันประมาณ 49%

นอกจากนี้เรายังสามารถเรียงลำดับผลลัพธ์นี้เพื่อให้อ่านง่ายขึ้นได้ดังนี้ -

ตัวอย่าง

for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
   print(doc_number, score)

เอาต์พุต

2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0

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

พจนานุกรมคืออะไร?

ก่อนที่จะเจาะลึกแนวคิดของพจนานุกรมเรามาทำความเข้าใจกับแนวคิด NLP แบบง่ายๆ -

  • Token - โทเค็นหมายถึง 'คำ'

  • Document - เอกสารหมายถึงประโยคหรือย่อหน้า

  • Corpus - หมายถึงการรวบรวมเอกสารเป็นถุงคำ (BoW)

สำหรับเอกสารทั้งหมดคลังข้อมูลจะมีรหัสโทเค็นของแต่ละคำพร้อมกับจำนวนความถี่ในเอกสารเสมอ

ไปที่แนวคิดของพจนานุกรมใน Gensim สำหรับการทำงานกับเอกสารข้อความ Gensim ยังต้องการคำเช่นโทเค็นเพื่อแปลงเป็นรหัสเฉพาะ เพื่อให้บรรลุสิ่งนี้จะทำให้เรามีสิ่งอำนวยความสะดวกDictionary objectซึ่งจะจับคู่คำแต่ละคำกับ id จำนวนเต็มที่ไม่ซ้ำกัน ทำได้โดยการแปลงข้อความที่ป้อนเป็นรายการคำแล้วส่งต่อไปยังไฟล์corpora.Dictionary() วัตถุ.

ต้องการพจนานุกรม

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

รูปแบบของการป้อนข้อความ

ข้อความป้อนมีสามรูปแบบที่แตกต่างกันซึ่งเราสามารถมอบให้กับ Gensim -

  • ในฐานะที่เป็นประโยคที่เก็บไว้ในออบเจ็กต์รายการเนทีฟของ Python (เรียกว่า str ใน Python 3)

  • เป็นไฟล์ข้อความเดียว (อาจมีขนาดเล็กหรือใหญ่ก็ได้)

  • ไฟล์ข้อความหลายไฟล์

การสร้างพจนานุกรมโดยใช้ Gensim

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

จากรายการประโยค

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

ตัวอย่างการใช้งาน

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

import gensim
from gensim import corpora
from pprint import pprint

จากนั้นสร้างรายการความเข้าใจจากรายการประโยค / เอกสารเพื่อใช้ในการสร้างพจนานุกรม -

doc = [
   "CNTK formerly known as Computational Network Toolkit",
   "is a free easy-to-use open-source commercial-grade toolkit",
   "that enable us to train deep learning algorithms to learn like the human brain."
]

ต่อไปเราต้องแยกประโยคออกเป็นคำ เรียกว่า tokenisation

text_tokens = [[text for text in doc.split()] for doc in doc]

ตอนนี้ด้วยความช่วยเหลือของสคริปต์ต่อไปนี้เราสามารถสร้างพจนานุกรม -

dict_LoS = corpora.Dictionary(text_tokens)

ตอนนี้เรามารับข้อมูลเพิ่มเติมเช่นจำนวนโทเค็นในพจนานุกรม -

print(dict_LoS)

เอาต์พุต

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

นอกจากนี้เรายังสามารถดูคำในการแมปเลขจำนวนเต็มเฉพาะได้ดังนี้ -

print(dict_LoS.token2id)

เอาต์พุต

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 'learning': 20,
   'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
from gensim import corpora
from pprint import pprint
doc = [
   "CNTK formerly known as Computational Network Toolkit",
   "is a free easy-to-use open-source commercial-grade toolkit",
   "that enable us to train deep learning algorithms to learn like the human brain."
]
text_tokens = [[text for text in doc.split()] for doc in doc]
dict_LoS = corpora.Dictionary(text_tokens)
print(dict_LoS.token2id)

จากไฟล์ข้อความเดียว

ในตัวอย่างต่อไปนี้เราจะสร้างพจนานุกรมจากไฟล์ข้อความเดียว ในทำนองเดียวกันเรายังสามารถสร้างพจนานุกรมจากไฟล์ข้อความมากกว่าหนึ่งไฟล์ (เช่นไดเร็กทอรีของไฟล์)

สำหรับสิ่งนี้เราได้บันทึกเอกสารซึ่งใช้ในตัวอย่างก่อนหน้านี้ในไฟล์ข้อความที่ชื่อ doc.txt. Gensim จะอ่านไฟล์ทีละบรรทัดและประมวลผลทีละบรรทัดโดยใช้simple_preprocess. ด้วยวิธีนี้คุณไม่จำเป็นต้องโหลดไฟล์ที่สมบูรณ์ในหน่วยความจำทั้งหมดในครั้งเดียว

ตัวอย่างการใช้งาน

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

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os

โค้ดบรรทัดถัดไปจะสร้างพจนานุกรม gensim โดยใช้ไฟล์ข้อความเดียวชื่อ doc.txt -

dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)

ตอนนี้เรามารับข้อมูลเพิ่มเติมเช่นจำนวนโทเค็นในพจนานุกรม -

print(dict_STF)

เอาต์พุต

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

นอกจากนี้เรายังสามารถดูคำในการแมปเลขจำนวนเต็มเฉพาะได้ดังนี้ -

print(dict_STF.token2id)

เอาต์พุต

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
dict_STF = corpora.Dictionary(
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)
dict_STF = corpora.Dictionary(text_tokens)
print(dict_STF.token2id)

จากไฟล์ข้อความหลายไฟล์

ตอนนี้เรามาสร้างพจนานุกรมจากไฟล์หลายไฟล์เช่นไฟล์ข้อความมากกว่าหนึ่งไฟล์ที่บันทึกไว้ในไดเร็กทอรีเดียวกัน สำหรับตัวอย่างนี้เราได้สร้างไฟล์ข้อความที่แตกต่างกันสามไฟล์คือfirst.txt, second.txt และ third.txtมีสามบรรทัดจากไฟล์ข้อความ (doc.txt) เราใช้สำหรับตัวอย่างก่อนหน้านี้ ไฟล์ข้อความทั้งสามไฟล์นี้ถูกบันทึกภายใต้ไดเร็กทอรีที่ชื่อABC.

ตัวอย่างการใช้งาน

ในการดำเนินการนี้เราจำเป็นต้องกำหนดคลาสด้วยวิธีการที่สามารถวนซ้ำผ่านไฟล์ข้อความทั้งสามไฟล์ (First, Second และ Third.txt) ในไดเร็กทอรี (ABC) และแสดงรายการโทเค็นคำที่ประมวลผล

มากำหนดคลาสที่ชื่อ Read_files มีเมธอดชื่อ __iteration__ () ดังนี้ -

class Read_files(object):
   def __init__(self, directoryname):
      elf.directoryname = directoryname
   def __iter__(self):
      for fname in os.listdir(self.directoryname):
         for line in open(os.path.join(self.directoryname, fname), encoding='latin'):
   yield simple_preprocess(line)

ต่อไปเราต้องระบุเส้นทางของไดเร็กทอรีดังนี้ -

path = "ABC"

#provide the path as per your computer system where you saved the directory.

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

dict_MUL = corpora.Dictionary(Read_files(path))

เอาต์พุต

Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)

ตอนนี้เราสามารถเห็นคำในการแมปเลขจำนวนเต็มเฉพาะได้ดังนี้ -

print(dict_MUL.token2id)

เอาต์พุต

{
   'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4, 
   'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9, 
   'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14, 
   'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 
   'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}

การบันทึกและการโหลดพจนานุกรม Gensim

Gensim สนับสนุนคนพื้นเมืองของตนเอง save() วิธีบันทึกพจนานุกรมลงในดิสก์และ load() วิธีการโหลดพจนานุกรมจากดิสก์

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

Gensim.corpora.dictionary.save(filename)

#provide the path where you want to save the dictionary.

ในทำนองเดียวกันเราสามารถโหลดพจนานุกรมที่บันทึกไว้โดยใช้วิธี load () สคริปต์ต่อไปนี้สามารถทำได้ -

Gensim.corpora.dictionary.load(filename)

#provide the path where you have saved the dictionary.

เราเข้าใจวิธีสร้างพจนานุกรมจากรายการเอกสารและจากไฟล์ข้อความ (จากหนึ่งและจากมากกว่าหนึ่งไฟล์) ตอนนี้ในส่วนนี้เราจะสร้างคลังคำศัพท์ (BoW) ในการทำงานร่วมกับ Gensim มันเป็นหนึ่งในวัตถุที่สำคัญที่สุดที่เราต้องทำความคุ้นเคย โดยทั่วไปเป็นคลังข้อมูลที่มีรหัสคำและความถี่ในแต่ละเอกสาร

การสร้าง BoW Corpus

ตามที่กล่าวไว้ใน Gensim คลังข้อมูลประกอบด้วยรหัสคำและความถี่ในเอกสารทุกฉบับ เราสามารถสร้างคลังข้อมูล BoW จากรายการเอกสารง่ายๆและจากไฟล์ข้อความ สิ่งที่เราต้องทำคือส่งรายการคำที่เป็นโทเค็นไปยังวัตถุที่ตั้งชื่อDictionary.doc2bow(). ก่อนอื่นเรามาเริ่มต้นด้วยการสร้างคลังข้อมูล BoW โดยใช้รายการเอกสารง่ายๆ

จากรายการประโยคง่ายๆ

ในตัวอย่างต่อไปนี้เราจะสร้างคลังข้อมูล BoW จากรายการง่ายๆที่มีสามประโยค

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

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

ตอนนี้ให้รายการที่มีประโยค เรามีสามประโยคในรายการของเรา -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

จากนั้นทำโทเค็นของประโยคดังนี้ -

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

สร้างวัตถุของ corpora.Dictionary() ดังต่อไปนี้ -

dictionary = corpora.Dictionary()

ตอนนี้ส่งประโยคโทเค็นเหล่านี้ไปที่ dictionary.doc2bow() objectดังต่อไปนี้ -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

ในที่สุดเราก็สามารถพิมพ์ Bag of word corpus ได้ -

print(BoW_corpus)

เอาต์พุต

[
   [(0, 1), (1, 1), (2, 1), (3, 1)], 
   [(2, 1), (3, 1), (4, 2)], [(0, 2), (3, 3), (5, 2), (6, 1), (7, 2), (8, 1)]
]

ผลลัพธ์ข้างต้นแสดงให้เห็นว่าคำที่มี id = 0 ปรากฏขึ้นหนึ่งครั้งในเอกสารแรก (เนื่องจากเรามี (0,1) ในผลลัพธ์) และอื่น ๆ

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

id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

เอาต์พุต

[
   [('are', 1), ('hello', 1), ('how', 1), ('you', 1)], 
   [('how', 1), ('you', 1), ('do', 2)], 
   [('are', 2), ('you', 3), ('doing', 2), ('hey', 1), ('what', 2), ('yes', 1)]
]

ตอนนี้ผลลัพธ์ข้างต้นเป็นสิ่งที่มนุษย์สามารถอ่านได้

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)
id_words = [[(dictionary[id], count) for id, count in line] for line in BoW_corpus]
print(id_words)

จากไฟล์ข้อความ

ในตัวอย่างต่อไปนี้เราจะสร้าง BoW corpus จากไฟล์ข้อความ สำหรับสิ่งนี้เราได้บันทึกเอกสารซึ่งใช้ในตัวอย่างก่อนหน้านี้ในไฟล์ข้อความที่ชื่อdoc.txt..

Gensim จะอ่านไฟล์ทีละบรรทัดและประมวลผลทีละบรรทัดโดยใช้ simple_preprocess. ด้วยวิธีนี้คุณไม่จำเป็นต้องโหลดไฟล์ที่สมบูรณ์ในหน่วยความจำทั้งหมดในครั้งเดียว

ตัวอย่างการใช้งาน

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

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os

ถัดไปบรรทัดของรหัสต่อไปนี้จะทำให้อ่านเอกสารจาก doc.txt และโทเค็น -

doc_tokenized = [
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
]
dictionary = corpora.Dictionary()

ตอนนี้เราต้องส่งคำที่เป็นโทเค็นเหล่านี้เข้าไป dictionary.doc2bow() วัตถุ (เช่นเดียวกับในตัวอย่างก่อนหน้านี้)

BoW_corpus = [
   dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized
]
print(BoW_corpus)

เอาต์พุต

[
   [(9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], 
   [
      (15, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1), (21, 1), 
      (22, 1), (23, 1), (24, 1)
   ], 
   [
      (23, 2), (25, 1), (26, 1), (27, 1), (28, 1), (29, 1), 
      (30, 1), (31, 1), (32, 1), (33, 1), (34, 1), (35, 1), (36, 1)
   ], 
   [(3, 1), (18, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1)], 
   [
      (18, 1), (27, 1), (31, 2), (32, 1), (38, 1), (41, 1), (43, 1), 
      (44, 1), (45, 1), (46, 1), (47, 1), (48, 1), (49, 1), (50, 1), (51, 1), (52, 1)
   ]
]

doc.txt ไฟล์มีเนื้อหาดังต่อไปนี้ -

CNTK เดิมเรียกว่า Computational Network Toolkit เป็นชุดเครื่องมือเกรดเชิงพาณิชย์แบบโอเพนซอร์สที่ใช้งานง่ายฟรีซึ่งช่วยให้เราสามารถฝึกอัลกอริทึมการเรียนรู้เชิงลึกเพื่อเรียนรู้เช่นเดียวกับสมองของมนุษย์

คุณสามารถค้นหาบทช่วยสอนฟรีได้ที่ tutorialspoint.com นอกจากนี้ยังมีบทแนะนำทางเทคนิคที่ดีที่สุดเกี่ยวกับเทคโนโลยีเช่น AI deep learning machine learning ได้ฟรี

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
doc_tokenized = [
   simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
print(BoW_corpus)

การบันทึกและการโหลด Gensim Corpus

เราสามารถบันทึกคลังข้อมูลด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

corpora.MmCorpus.serialize(‘/Users/Desktop/BoW_corpus.mm’, bow_corpus)

#provide the path and the name of the corpus. The name of corpus is BoW_corpus and we saved it in Matrix Market format.

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

corpus_load = corpora.MmCorpus(‘/Users/Desktop/BoW_corpus.mm’)
for line in corpus_load:
print(line)

บทนี้จะช่วยคุณในการเรียนรู้เกี่ยวกับการเปลี่ยนแปลงต่างๆใน Gensim ให้เราเริ่มต้นด้วยการทำความเข้าใจเอกสารการเปลี่ยนแปลง

การแปลงเอกสาร

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

  • มันค้นพบความสัมพันธ์ระหว่างคำ

  • มันนำโครงสร้างที่ซ่อนอยู่ในคลังข้อมูลออกมา

  • อธิบายเอกสารในรูปแบบใหม่และมีความหมายมากขึ้น

  • ทำให้การแสดงเอกสารมีขนาดกะทัดรัดมากขึ้น

  • ปรับปรุงประสิทธิภาพเนื่องจากการเป็นตัวแทนใหม่ใช้ทรัพยากรน้อยลง

  • ช่วยเพิ่มประสิทธิภาพเนื่องจากแนวโน้มข้อมูลส่วนขอบในการนำเสนอใหม่จะถูกละเว้น

  • เสียงรบกวนยังลดลงในการแสดงเอกสารใหม่

มาดูขั้นตอนการใช้งานสำหรับการแปลงเอกสารจากการแทนพื้นที่เวกเตอร์หนึ่งไปยังอีก

ขั้นตอนการดำเนินการ

ในการแปลงเอกสารเราต้องทำตามขั้นตอนต่อไปนี้ -

ขั้นตอนที่ 1: การสร้าง Corpus

ขั้นตอนแรกและขั้นพื้นฐานคือการสร้างคลังข้อมูลจากเอกสาร เราได้สร้างคลังข้อมูลในตัวอย่างก่อนหน้านี้แล้ว มาสร้างใหม่ด้วยการปรับปรุงบางอย่าง (ลบคำทั่วไปและคำที่ปรากฏเพียงครั้งเดียว) -

import gensim
import pprint
from collections import defaultdict
from gensim import corpora

ตอนนี้จัดเตรียมเอกสารสำหรับสร้างคลังข้อมูล -

t_corpus = ["CNTK เดิมเรียกว่า Computational Network Toolkit", "เป็นชุดเครื่องมือเกรดเชิงพาณิชย์แบบโอเพนซอร์สที่ใช้งานง่ายฟรี", "ที่ช่วยให้เราสามารถฝึกอัลกอริทึมการเรียนรู้เชิงลึกเพื่อเรียนรู้เช่นเดียวกับสมองของมนุษย์", " คุณสามารถดูบทแนะนำได้ฟรีที่ tutorialspoint.com "," Tutorialspoint.com ยังมีบทแนะนำทางเทคนิคที่ดีที่สุดเกี่ยวกับเทคโนโลยีเช่น AI deep learning machine learning ได้ฟรี "]

ต่อไปเราต้องทำโทเค็นและเราจะลบคำทั่วไปออกไปด้วย -

stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [
      word for word in document.lower().split() if word not in stoplist
   ]
	for document in t_corpus
]

สคริปต์ต่อไปนี้จะลบคำที่ปรากฏเท่านั้น -

frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)

เอาต์พุต

[
   ['toolkit'],
   ['free', 'toolkit'],
   ['deep', 'learning', 'like'],
   ['free', 'on', 'tutorialspoint.com'],
   ['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]

ตอนนี้ส่งไปยังไฟล์ corpora.dictionary() วัตถุที่จะได้รับวัตถุที่ไม่ซ้ำกันในคลังข้อมูลของเรา -

dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

เอาต์พุต

Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)

จากนั้นโค้ดบรรทัดต่อไปนี้จะสร้างแบบจำลอง Bag of Word สำหรับคลังข้อมูลของเรา -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

เอาต์พุต

[
   [(0, 1)],
   [(0, 1), (1, 1)],
   [(2, 1), (3, 1), (4, 1)],
   [(1, 1), (5, 1), (6, 1)],
   [(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]

ขั้นตอนที่ 2: การสร้างการเปลี่ยนแปลง

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

ก่อนอื่นเราต้องนำเข้าแพ็คเกจโมเดลจาก gensim

from gensim import models

ตอนนี้เราต้องเริ่มต้นโมเดลดังนี้ -

tfidf = models.TfidfModel(BoW_corpus)

ขั้นตอนที่ 3: การเปลี่ยนเวกเตอร์

ตอนนี้ในขั้นตอนสุดท้ายนี้เวกเตอร์จะถูกแปลงจากการแสดงแบบเก่าไปเป็นการแสดงใหม่ ในขณะที่เราได้เริ่มต้นโมเดล tfidf ในขั้นตอนข้างต้นตอนนี้ tfidf จะถือว่าเป็นอ็อบเจ็กต์แบบอ่านอย่างเดียว ที่นี่โดยใช้วัตถุ tfidf นี้เราจะแปลงเวกเตอร์ของเราจากถุงแทนคำ (การแทนค่าแบบเก่า) เป็นน้ำหนักมูลค่าจริงของ Tfidf (การแทนค่าใหม่)

doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]

เอาต์พุต

[(1, 0.4869354917707381), (3, 0.8734379353188121)]

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

corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
   print(doc)

เอาต์พุต

[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
   (1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543), 
   (4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
   "CNTK formerly known as Computational Network Toolkit", 
   "is a free easy-to-use open-source commercial-grade toolkit", 
   "that enable us to train deep learning algorithms to learn like the human brain.", 
   "You can find its free tutorial on tutorialspoint.com", 
   "Tutorialspoint.com also provide best technical tutorials on 
   technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
   [word for word in document.lower().split() if word not in stoplist]
   for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
   for token in text:
      frequency[token] += 1
   processed_corpus = [
      [token for token in text if frequency[token] > 1] 
      for text in processed_corpus
   ]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
   from gensim import models
   tfidf = models.TfidfModel(BoW_corpus)
   doc_BoW = [(1,1),(3,1)]
   print(tfidf[doc_BoW])
   corpus_tfidf = tfidf[BoW_corpus]
   for doc in corpus_tfidf:
print(doc)

การเปลี่ยนแปลงต่างๆใน Gensim

การใช้ Gensim ทำให้เราสามารถใช้การแปลงที่เป็นที่นิยมได้เช่นอัลกอริทึม Vector Space Model บางส่วนมีดังนี้ -

Tf-Idf (ความถี่ของข้อความ - ความถี่เอกสารผกผัน)

ในระหว่างการเริ่มต้นอัลกอริทึมแบบจำลอง tf-idf นี้คาดว่าคลังข้อมูลการฝึกอบรมจะมีค่าจำนวนเต็ม (เช่นแบบจำลอง Bag-of-Words) หลังจากนั้นในช่วงเวลาของการเปลี่ยนแปลงจะใช้การแทนค่าเวกเตอร์และส่งกลับการแสดงเวกเตอร์อื่น

เวกเตอร์เอาต์พุตจะมีขนาดเท่ากัน แต่ค่าของคุณสมบัติที่หายาก (ในขณะฝึกอบรม) จะเพิ่มขึ้น โดยทั่วไปแล้วมันจะแปลงเวกเตอร์ที่มีมูลค่าจำนวนเต็มเป็นเวกเตอร์ที่มีมูลค่าจริง ต่อไปนี้เป็นไวยากรณ์ของการแปลง Tf-idf -

Model=models.TfidfModel(corpus, normalize=True)

LSI (การสร้างดัชนีความหมายแฝง)

อัลกอริทึมแบบจำลอง LSI สามารถแปลงเอกสารจากแบบจำลองเวกเตอร์ที่มีมูลค่าจำนวนเต็ม (เช่นแบบจำลองถุงคำ) หรือพื้นที่ถ่วงน้ำหนัก Tf-Idf ให้เป็นช่องว่างแฝง เวกเตอร์เอาต์พุตจะมีขนาดต่ำกว่า ต่อไปนี้เป็นไวยากรณ์ของการแปลง LSI -

Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)

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

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

Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)

การคาดการณ์แบบสุ่ม (RP)

RP ซึ่งเป็นแนวทางที่มีประสิทธิภาพมากมีจุดมุ่งหมายเพื่อลดขนาดของพื้นที่เวกเตอร์ โดยพื้นฐานแล้ววิธีนี้เป็นการประมาณระยะ Tf-Idf ระหว่างเอกสาร ทำได้โดยการสุ่มตัวอย่างเล็กน้อย

Model=models.RpModel(tfidf_corpus, num_topics=500)

กระบวนการ Dirichlet ตามลำดับชั้น (HDP)

HDP เป็นวิธีการแบบ Bayesian ที่ไม่ใช่พาราเมตริกซึ่งเป็นส่วนเสริมใหม่ของ Gensim เราควรต้องดูแลขณะใช้งาน

Model=models.HdpModel(corpus, id2word=dictionary

ที่นี่เราจะเรียนรู้เกี่ยวกับการสร้างเมทริกซ์ความถี่ - ผกผันความถี่เอกสาร (TF-IDF) ด้วยความช่วยเหลือของ Gensim

TF-IDF คืออะไร?

เป็นรุ่น Term Frequency-Inverse Document Frequency ซึ่งเป็นรุ่น bag-of-word มันแตกต่างจากคลังข้อมูลทั่วไปเพราะมันให้น้ำหนักโทเค็นเช่นคำที่ปรากฏในเอกสารบ่อยๆ ในระหว่างการเริ่มต้นอัลกอริทึมแบบจำลอง tf-idf นี้คาดว่าคลังข้อมูลการฝึกอบรมจะมีค่าจำนวนเต็ม (เช่นแบบจำลอง Bag-of-Words)

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

มันคำนวณอย่างไร?

โมเดล TF-IDF คำนวณ tfidf ด้วยความช่วยเหลือของสองขั้นตอนง่ายๆดังต่อไปนี้ -

ขั้นตอนที่ 1: การคูณองค์ประกอบภายในและส่วนกลาง

ในขั้นตอนแรกนี้แบบจำลองจะคูณส่วนประกอบท้องถิ่นเช่น TF (Term Frequency) ด้วยส่วนประกอบส่วนกลางเช่น IDF (Inverse Document Frequency)

ขั้นตอนที่ 2: ทำให้ผลลัพธ์เป็นปกติ

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

จากผลของสองขั้นตอนข้างต้นนี้คำที่เกิดขึ้นบ่อยครั้งในเอกสารจะทำให้น้ำหนักลดลง

วิธีการรับน้ำหนัก TF-IDF

ในที่นี้เราจะนำตัวอย่างไปใช้เพื่อดูว่าเราจะรับน้ำหนัก TF-IDF ได้อย่างไร โดยพื้นฐานแล้วในการรับน้ำหนัก TF-IDF อันดับแรกเราต้องฝึกคอร์ปัสจากนั้นจึงใช้คอร์ปัสนั้นภายในแบบจำลอง tfidf

ฝึก Corpus

ดังที่กล่าวไว้ข้างต้นเพื่อให้ได้ TF-IDF เราต้องฝึกคลังข้อมูลของเราก่อน ขั้นแรกเราต้องนำเข้าแพ็คเกจที่จำเป็นทั้งหมดดังนี้ -

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess

ตอนนี้ให้รายการที่มีประโยค เรามีสามประโยคในรายการของเรา -

doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]

จากนั้นทำโทเค็นของประโยคดังนี้ -

doc_tokenized = [simple_preprocess(doc) for doc in doc_list]

สร้างวัตถุของ corpora.Dictionary() ดังต่อไปนี้ -

dictionary = corpora.Dictionary()

ตอนนี้ส่งประโยคโทเค็นเหล่านี้ไปที่ dictionary.doc2bow() วัตถุดังต่อไปนี้ -

BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]

ต่อไปเราจะได้รับรหัสคำและความถี่ในเอกสารของเรา

for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])

เอาต์พุต

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

ด้วยวิธีนี้เราได้ฝึกฝนคลังข้อมูลของเรา (คลังข้อมูลกระเป๋าของ Word)

ต่อไปเราต้องใช้คลังข้อมูลที่ได้รับการฝึกฝนนี้ภายในแบบจำลอง tfidf models.TfidfModel().

นำเข้าแพ็คเกจ numpay ก่อน -

import numpy as np

ตอนนี้ใช้คลังข้อมูลที่ได้รับการฝึกฝนของเรา (BoW_corpus) ภายในวงเล็บเหลี่ยมของ models.TfidfModel()

tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')

ต่อไปเราจะได้รับรหัสคำและความถี่ในคลังข้อมูลแบบจำลอง tfidf ของเรา -

for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

เอาต์พุต

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

[['are', 1], ['hello', 1], ['how', 1], ['you', 1]]
[['how', 1], ['you', 1], ['do', 2]]
[['are', 2], ['you', 3], ['doing', 2], ['hey', 1], ['what', 2], ['yes', 1]]

[['are', 0.33], ['hello', 0.89], ['how', 0.33]]
[['how', 0.18], ['do', 0.98]]
[['are', 0.23], ['doing', 0.62], ['hey', 0.31], ['what', 0.62], ['yes', 0.31]]

จากผลลัพธ์ข้างต้นเราจะเห็นความแตกต่างของความถี่ของคำในเอกสารของเรา

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
import pprint
from gensim import corpora
from gensim.utils import simple_preprocess
doc_list = [
   "Hello, how are you?", "How do you do?", 
   "Hey what are you doing? yes you What are you doing?"
]
doc_tokenized = [simple_preprocess(doc) for doc in doc_list]
dictionary = corpora.Dictionary()
BoW_corpus = [dictionary.doc2bow(doc, allow_update=True) for doc in doc_tokenized]
for doc in BoW_corpus:
   print([[dictionary[id], freq] for id, freq in doc])
import numpy as np
tfidf = models.TfidfModel(BoW_corpus, smartirs='ntc')
for doc in tfidf[BoW_corpus]:
   print([[dictionary[id], np.around(freq,decomal=2)] for id, freq in doc])

น้ำหนักของคำต่างกัน

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

บทนี้เกี่ยวข้องกับการสร้างแบบจำลองหัวข้อเกี่ยวกับ Gensim

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

  • เราจะทราบได้หรือไม่ว่าคำประเภทใดปรากฏบ่อยกว่าคำอื่น ๆ ในคลังข้อมูลของเรา?

  • เราสามารถจัดกลุ่มข้อมูลของเราได้หรือไม่?

  • เราสามารถใช้ธีมพื้นฐานในข้อมูลของเราได้หรือไม่?

เราจะสามารถบรรลุสิ่งเหล่านี้ได้ด้วยความช่วยเหลือของการสร้างแบบจำลองหัวข้อ มาเจาะลึกแนวคิดของแบบจำลองหัวข้อ

หัวข้อโมเดลคืออะไร?

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

ประการแรก what exactly a topic is?

หัวข้อตามความหมายของชื่อเป็นแนวคิดพื้นฐานหรือธีมที่แสดงในข้อความของเรา เพื่อให้คุณเป็นตัวอย่างคลังข้อมูลที่มีnewspaper articles จะมีหัวข้อที่เกี่ยวข้องกับ finance, weather, politics, sports, various states news และอื่น ๆ

ประการที่สอง what is the importance of topic models in text processing?

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

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

เป้าหมายของรูปแบบหัวข้อ

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

  • สามารถใช้โมเดลหัวข้อสำหรับการสรุปข้อความ

  • สามารถใช้เพื่อจัดระเบียบเอกสาร ตัวอย่างเช่นเราสามารถใช้การสร้างแบบจำลองหัวข้อเพื่อจัดกลุ่มบทความข่าวเข้าด้วยกันเป็นส่วนที่มีการจัดระเบียบ / เชื่อมโยงกันเช่นการจัดระเบียบบทความข่าวทั้งหมดที่เกี่ยวข้องกับcricket.

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

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

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

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

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

การจัดสรร Dirichlet แฝง (LDA) เป็นเทคนิคที่ใช้กันทั่วไปและเป็นที่นิยมในปัจจุบันสำหรับการสร้างแบบจำลองหัวข้อ เป็นเอกสารที่นักวิจัยของ Facebook ใช้ในงานวิจัยของพวกเขาที่ตีพิมพ์ในปี 2013 โดยเสนอครั้งแรกโดย David Blei, Andrew Ng และ Michael Jordan ในปี 2003 พวกเขาเสนอ LDA ในเอกสารที่มีสิทธิLatent Dirichlet allocation.

ลักษณะของ LDA

มาเรียนรู้เพิ่มเติมเกี่ยวกับเทคนิคที่ยอดเยี่ยมนี้ผ่านลักษณะของมัน -

Probabilistic topic modeling technique

LDA เป็นเทคนิคการสร้างแบบจำลองหัวข้อที่น่าจะเป็น ดังที่เราได้กล่าวไว้ข้างต้นในการสร้างแบบจำลองหัวข้อเราถือว่าในชุดเอกสารที่เกี่ยวข้องกัน (อาจเป็นเอกสารทางวิชาการบทความในหนังสือพิมพ์โพสต์บน Facebook ทวีตอีเมลและอื่น ๆ ) มีบางหัวข้อรวมอยู่ในเอกสารแต่ละฉบับ .

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

  • Topics

  • การกระจายหัวข้อทางสถิติระหว่างเอกสาร

  • คำในเอกสารที่ประกอบด้วยหัวข้อ

Work in an unsupervised way

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

Very easy to create it in Gensim

ใน Gensim การสร้างแบบจำลอง LDA นั้นง่ายมาก เราต้องระบุคลังข้อมูลการทำแผนที่พจนานุกรมและจำนวนหัวข้อที่เราต้องการใช้ในแบบจำลองของเรา

Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)

May face computationally intractable problem

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

การสร้างดัชนีความหมายแฝง (LSI)

อัลกอริทึมการสร้างแบบจำลองหัวข้อที่ใช้ครั้งแรกใน Gensim ด้วย Latent Dirichlet Allocation (LDA) คือ Latent Semantic Indexing (LSI). เรียกอีกอย่างว่าLatent Semantic Analysis (LSA).

ได้รับการจดสิทธิบัตรในปี 1988 โดย Scott Deerwester, Susan Dumais, George Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum และ Lynn Streeter ในส่วนนี้เราจะตั้งค่าโมเดล LSI ของเรา สามารถทำได้ในลักษณะเดียวกับการตั้งค่าโมเดล LDA เราต้องนำเข้าโมเดล LSI จากgensim.models.

บทบาทของ LSI

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

เมื่อสร้างแล้วเพื่อลดจำนวนแถวแบบจำลอง LSI ใช้เทคนิคทางคณิตศาสตร์ที่เรียกว่าการสลายตัวของค่าเอกพจน์ (SVD) นอกจากการลดจำนวนแถวแล้วยังรักษาโครงสร้างความคล้ายคลึงกันระหว่างคอลัมน์ด้วย ในเมทริกซ์แถวจะแสดงถึงคำที่ไม่ซ้ำกันและคอลัมน์แสดงถึงเอกสารแต่ละรายการ มันทำงานโดยอาศัยสมมติฐานการแจกแจงกล่าวคือสมมติว่าคำที่มีความหมายใกล้เคียงจะเกิดขึ้นในข้อความประเภทเดียวกัน

Model=models.LsiModel(corpus, id2word=dictionary, num_topics=100)

กระบวนการ Dirichlet ตามลำดับชั้น (HDP)

แบบจำลองหัวข้อเช่น LDA และ LSI ช่วยในการสรุปและจัดระเบียบคลังข้อความขนาดใหญ่ที่ไม่สามารถวิเคราะห์ด้วยมือได้ นอกเหนือจาก LDA และ LSI แล้วโมเดลหัวข้อที่มีประสิทธิภาพอีกอย่างใน Gensim คือ HDP (Hierarchical Dirichlet Process) โดยพื้นฐานแล้วเป็นรูปแบบการเป็นสมาชิกแบบผสมผสานสำหรับการวิเคราะห์ข้อมูลที่จัดกลุ่มโดยไม่ได้รับการดูแล ซึ่งแตกต่างจาก LDA (คู่ที่ จำกัด ของมัน) HDP อนุมานจำนวนหัวข้อจากข้อมูล

Model=models.HdpModel(corpus, id2word=dictionary

บทนี้จะช่วยให้คุณเรียนรู้วิธีสร้างแบบจำลองหัวข้อการจัดสรร Latent Dirichlet (LDA) ใน Gensim

ดึงข้อมูลเกี่ยวกับหัวข้อจากข้อความจำนวนมากโดยอัตโนมัติในหนึ่งในแอปพลิเคชันหลักของ NLP (การประมวลผลภาษาธรรมชาติ) ข้อความจำนวนมากอาจเป็นฟีดจากบทวิจารณ์ของโรงแรมทวีตโพสต์ Facebook ฟีดจากช่องทางโซเชียลมีเดียอื่น ๆ บทวิจารณ์ภาพยนตร์เรื่องราวข่าวการตอบกลับของผู้ใช้อีเมล ฯลฯ

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

ไม่มันไม่ใช่. ต้องใช้อัลกอริทึมอัตโนมัติที่สามารถอ่านเอกสารข้อความจำนวนมากเหล่านี้และดึงข้อมูล / หัวข้อที่ต้องการโดยอัตโนมัติ

บทบาทของ LDA

แนวทางของ LDA ในการสร้างแบบจำลองหัวข้อคือการจัดประเภทข้อความในเอกสารเป็นหัวข้อเฉพาะ สร้างแบบจำลองเป็นการแจกแจง Dirichlet, LDA สร้าง -

  • หัวข้อต่อรุ่นเอกสารและ
  • รูปแบบคำต่อหัวข้อ

หลังจากจัดเตรียมอัลกอริทึมแบบจำลองหัวข้อ LDA เพื่อให้ได้องค์ประกอบที่ดีของการกระจายหัวข้อ - คำหลักจึงจัดเรียงใหม่ -

  • การกระจายหัวข้อภายในเอกสารและ
  • การกระจายคำหลักภายในหัวข้อ

ในขณะที่ประมวลผลสมมติฐานบางประการของ LDA คือ -

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

การใช้งานกับ Gensim

ที่นี่เราจะใช้ LDA (การจัดสรร Dirichlet แฝง) เพื่อแยกหัวข้อที่กล่าวถึงตามธรรมชาติออกจากชุดข้อมูล

กำลังโหลดชุดข้อมูล

ชุดข้อมูลที่เราจะใช้คือชุดข้อมูลของ ’20 Newsgroups’มีบทความข่าวหลายพันบทความจากส่วนต่างๆของรายงานข่าว สามารถใช้ได้ภายใต้Sklearnชุดข้อมูล เราสามารถดาวน์โหลดได้อย่างง่ายดายโดยทำตามสคริปต์ Python -

from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')

ลองดูตัวอย่างข่าวด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

newsgroups_train.data[:4]
["From: [email protected] (where's my thing)\nSubject: 
WHAT car is this!?\nNntp-Posting-Host: rac3.wam.umd.edu\nOrganization: 
University of Maryland, College Park\nLines: 
15\n\n I was wondering if anyone out there could enlighten me on this car 
I saw\nthe other day. It was a 2-door sports car, looked to be from the 
late 60s/\nearly 70s. It was called a Bricklin. The doors were really small. 
In addition,\nthe front bumper was separate from the rest of the body. 
This is \nall I know. If anyone can tellme a model name, 
engine specs, years\nof production, where this car is made, history, or 
whatever info you\nhave on this funky looking car, please e-mail.\n\nThanks,
\n- IL\n ---- brought to you by your neighborhood Lerxst ----\n\n\n\n\n",

"From: [email protected] (Guy Kuo)\nSubject: SI Clock Poll - Final 
Call\nSummary: Final call for SI clock reports\nKeywords: 
SI,acceleration,clock,upgrade\nArticle-I.D.: shelley.1qvfo9INNc3s\nOrganization: 
University of Washington\nLines: 11\nNNTP-Posting-Host: carson.u.washington.edu\n\nA 
fair number of brave souls who upgraded their SI clock oscillator have\nshared their 
experiences for this poll. Please send a brief message detailing\nyour experiences with 
the procedure. Top speed attained, CPU rated speed,\nadd on cards and adapters, heat 
sinks, hour of usage per day, floppy disk\nfunctionality with 800 and 1.4 m floppies 
are especially requested.\n\nI will be summarizing in the next two days, so please add 
to the network\nknowledge base if you have done the clock upgrade and haven't answered 
this\npoll. Thanks.\n\nGuy Kuo <;[email protected]>\n",

'From: [email protected] (Thomas E Willis)\nSubject: 
PB questions...\nOrganization: Purdue University Engineering 
Computer Network\nDistribution: usa\nLines: 36\n\nwell folks, 
my mac plus finally gave up the ghost this weekend after\nstarting 
life as a 512k way back in 1985. sooo, i\'m in the market for 
a\nnew machine a bit sooner than i intended to be...\n\ni\'m looking 
into picking up a powerbook 160 or maybe 180 and have a bunch\nof 
questions that (hopefully) somebody can answer:\n\n* does anybody 
know any dirt on when the next round of powerbook\nintroductions 
are expected? i\'d heard the 185c was supposed to make an\nappearence 
"this summer" but haven\'t heard anymore on it - and since i\ndon\'t 
have access to macleak, i was wondering if anybody out there had\nmore 
info...\n\n* has anybody heard rumors about price drops to the powerbook 
line like the\nones the duo\'s just went through recently?\n\n* what\'s 
the impression of the display on the 180? i could probably swing\na 180 
if i got the 80Mb disk rather than the 120, but i don\'t really have\na 
feel for how much "better" the display is (yea, it looks great in the\nstore, 
but is that all "wow" or is it really that good?). could i solicit\nsome 
opinions of people who use the 160 and 180 day-to-day on if its
worth\ntaking the disk size and money hit to get the active display? 
(i realize\nthis is a real subjective question, but i\'ve only played around 
with the\nmachines in a computer store breifly and figured the opinions 
of somebody\nwho actually uses the machine daily might prove helpful).\n\n* 
how well does hellcats perform? ;)\n\nthanks a bunch in advance for any info - 
if you could email, i\'ll post a\nsummary (news reading time is at a premium 
with finals just around the\ncorner... :
( )\n--\nTom Willis \\ [email protected] \\ Purdue Electrical 
Engineering\n---------------------------------------------------------------------------\
n"Convictions are more dangerous enemies of truth than lies." - F. W.\nNietzsche\n',

'From: jgreen@amber (Joe Green)\nSubject: Re: Weitek P9000 ?\nOrganization: 
Harris Computer Systems Division\nLines: 14\nDistribution: world\nNNTP-Posting-Host: 
amber.ssd.csd.harris.com\nX-Newsreader: TIN [version 1.1 PL9]\n\nRobert 
J.C. Kyanko ([email protected]) wrote:\n >[email protected] writes in article 
<[email protected] >:\n> > Anyone know about the 
Weitek P9000 graphics chip?\n > As far as the low-level stuff goes, it looks 
pretty nice. It\'s got this\n> quadrilateral fill command that requires just 
the four points.\n\nDo you have Weitek\'s address/phone number? I\'d like to get 
some information\nabout this chip.\n\n--\nJoe Green\t\t\t\tHarris 
Corporation\[email protected]\t\t\tComputer Systems Division\n"The only 
thing that really scares me is a person with no sense of humor.
"\n\t\t\t\t\t\t-- Jonathan Winters\n']

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

เราต้องการคำหยุดจาก NLTK และโมเดลภาษาอังกฤษจาก Scapy ทั้งสองสามารถดาวน์โหลดได้ดังนี้ -

import nltk;
nltk.download('stopwords')
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])

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

ในการสร้างโมเดล LDA เราต้องนำเข้าแพ็คเกจที่จำเป็นต่อไปนี้ -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import pyLDAvis
import pyLDAvis.gensim
import matplotlib.pyplot as plt

กำลังเตรียมคำหยุด

ตอนนี้เราต้องนำเข้าคำหยุดและใช้งาน -

from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])

ล้างข้อความ

ตอนนี้ด้วยความช่วยเหลือของ Gensim's simple_preprocess()เราต้องโทเค็นแต่ละประโยคลงในรายการคำ เราควรลบเครื่องหมายวรรคตอนและอักขระที่ไม่จำเป็นออกด้วย ในการดำเนินการนี้เราจะสร้างฟังก์ชันชื่อsent_to_words() -

def sent_to_words(sentences):
   for sentence in sentences:
      yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))
data_words = list(sent_to_words(data))

การสร้างโมเดล Bigram และ Trigram

อย่างที่เราทราบกันดีว่า bigrams เป็นคำสองคำที่มักเกิดขึ้นพร้อมกันในเอกสารและตรีโกณคือสามคำที่มักเกิดขึ้นพร้อมกันในเอกสาร ด้วยความช่วยเหลือของ Gensim'sPhrases โมเดลเราทำได้ -

bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)

กรองคำหยุด

ต่อไปเราต้องกรองคำหยุดออก นอกจากนั้นเรายังจะสร้างฟังก์ชั่นเพื่อสร้าง bigrams, trigrams และสำหรับ lemmatisation -

def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc))
if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
     doc = nlp(" ".join(sent))
     texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out

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

ตอนนี้เราต้องสร้างพจนานุกรมและคลังข้อมูล เราทำในตัวอย่างก่อนหน้านี้เช่นกัน -

id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]

การสร้างแบบจำลองหัวข้อ LDA

เราได้ดำเนินการทุกอย่างที่จำเป็นในการฝึกโมเดล LDA แล้ว ตอนนี้ถึงเวลาสร้างแบบจำลองหัวข้อ LDA สำหรับตัวอย่างการใช้งานของเราสามารถทำได้โดยใช้รหัสบรรทัดต่อไปนี้ -

lda_model = gensim.models.ldamodel.LdaModel(
   corpus=corpus, id2word=id2word, num_topics=20, random_state=100, 
   update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True
)

ตัวอย่างการใช้งาน

มาดูตัวอย่างการใช้งานที่สมบูรณ์เพื่อสร้างแบบจำลองหัวข้อ LDA -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import pyLDAvis
import pyLDAvis.gensim
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])
from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')
data = newsgroups_train.data
data = [re.sub('\S*@\S*\s?', '', sent) for sent in data]
data = [re.sub('\s+', ' ', sent) for sent in data]
data = [re.sub("\'", "", sent) for sent in data]
print(data_words[:4]) #it will print the data after prepared for stopwords
bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)
def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out
data_words_nostops = remove_stopwords(data_words)
data_words_bigrams = make_bigrams(data_words_nostops)
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])
data_lemmatized = lemmatization(data_words_bigrams, allowed_postags=[
   'NOUN', 'ADJ', 'VERB', 'ADV'
])
print(data_lemmatized[:4]) #it will print the lemmatized data.
id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]
print(corpus[:4]) #it will print the corpus we created above.
[[(id2word[id], freq) for id, freq in cp] for cp in corpus[:4]] 
#it will print the words with their frequencies.
lda_model = gensim.models.ldamodel.LdaModel(
   corpus=corpus, id2word=id2word, num_topics=20, random_state=100, 
   update_every=1, chunksize=100, passes=10, alpha='auto', per_word_topics=True
)

ตอนนี้เราสามารถใช้โมเดล LDA ที่สร้างขึ้นด้านบนเพื่อรับหัวข้อเพื่อคำนวณ Model Perplexity

ในบทนี้เราจะเข้าใจวิธีการใช้โมเดลหัวข้อ Latent Dirichlet Allocation (LDA)

การดูหัวข้อในแบบจำลอง LDA

โมเดล LDA (lda_model) ที่เราสร้างไว้ข้างต้นสามารถใช้เพื่อดูหัวข้อจากเอกสาร สามารถทำได้ด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

pprint(lda_model.print_topics())
doc_lda = lda_model[corpus]

เอาต์พุต

[
   (0, 
   '0.036*"go" + 0.027*"get" + 0.021*"time" + 0.017*"back" + 0.015*"good" + '
   '0.014*"much" + 0.014*"be" + 0.013*"car" + 0.013*"well" + 0.013*"year"'),
   (1,
   '0.078*"screen" + 0.067*"video" + 0.052*"character" + 0.046*"normal" + '
   '0.045*"mouse" + 0.034*"manager" + 0.034*"disease" + 0.031*"processor" + '
   '0.028*"excuse" + 0.028*"choice"'),
   (2,
   '0.776*"ax" + 0.079*"_" + 0.011*"boy" + 0.008*"ticket" + 0.006*"red" + '
   '0.004*"conservative" + 0.004*"cult" + 0.004*"amazing" + 0.003*"runner" + '
   '0.003*"roughly"'),
   (3,
   '0.086*"season" + 0.078*"fan" + 0.072*"reality" + 0.065*"trade" + '
   '0.045*"concept" + 0.040*"pen" + 0.028*"blow" + 0.025*"improve" + '
   '0.025*"cap" + 0.021*"penguin"'),
   (4,
   '0.027*"group" + 0.023*"issue" + 0.016*"case" + 0.016*"cause" + '
   '0.014*"state" + 0.012*"whole" + 0.012*"support" + 0.011*"government" + '
   '0.010*"year" + 0.010*"rate"'),
   (5,
   '0.133*"evidence" + 0.047*"believe" + 0.044*"religion" + 0.042*"belief" + '
   '0.041*"sense" + 0.041*"discussion" + 0.034*"atheist" + 0.030*"conclusion" +
   '
   '0.029*"explain" + 0.029*"claim"'),
   (6,
   '0.083*"space" + 0.059*"science" + 0.031*"launch" + 0.030*"earth" + '
   '0.026*"route" + 0.024*"orbit" + 0.024*"scientific" + 0.021*"mission" + '
   '0.018*"plane" + 0.017*"satellite"'),
   (7,
   '0.065*"file" + 0.064*"program" + 0.048*"card" + 0.041*"window" + '
   '0.038*"driver" + 0.037*"software" + 0.034*"run" + 0.029*"machine" + '
   '0.029*"entry" + 0.028*"version"'),
   (8,
   '0.078*"publish" + 0.059*"mount" + 0.050*"turkish" + 0.043*"armenian" + '
   '0.027*"western" + 0.026*"russian" + 0.025*"locate" + 0.024*"proceed" + '
   '0.024*"electrical" + 0.022*"terrorism"'),
   (9,
   '0.023*"people" + 0.023*"child" + 0.021*"kill" + 0.020*"man" + 0.019*"death" '
   '+ 0.015*"die" + 0.015*"live" + 0.014*"attack" + 0.013*"age" + '
   '0.011*"church"'),
   (10,
   '0.092*"cpu" + 0.085*"black" + 0.071*"controller" + 0.039*"white" + '
   '0.028*"water" + 0.027*"cold" + 0.025*"solid" + 0.024*"cool" + 0.024*"heat" '
   '+ 0.023*"nuclear"'),
   (11,
   '0.071*"monitor" + 0.044*"box" + 0.042*"option" + 0.041*"generate" + '
   '0.038*"vote" + 0.032*"battery" + 0.029*"wave" + 0.026*"tradition" + '
   '0.026*"fairly" + 0.025*"task"'),
   (12,
   '0.048*"send" + 0.045*"mail" + 0.036*"list" + 0.033*"include" + '
   '0.032*"price" + 0.031*"address" + 0.027*"email" + 0.026*"receive" + '
   '0.024*"book" + 0.024*"sell"'),
   (13,
   '0.515*"drive" + 0.052*"laboratory" + 0.042*"blind" + 0.020*"investment" + '
   '0.011*"creature" + 0.010*"loop" + 0.005*"dialog" + 0.000*"slave" + '
   '0.000*"jumper" + 0.000*"sector"'),
   (14,
   '0.153*"patient" + 0.066*"treatment" + 0.062*"printer" + 0.059*"doctor" + '

   '0.036*"medical" + 0.031*"energy" + 0.029*"study" + 0.029*"probe" + '
   '0.024*"mph" + 0.020*"physician"'),
   (15,
   '0.068*"law" + 0.055*"gun" + 0.039*"government" + 0.036*"right" + '
   '0.029*"state" + 0.026*"drug" + 0.022*"crime" + 0.019*"person" + '
   '0.019*"citizen" + 0.019*"weapon"'),
   (16,
   '0.107*"team" + 0.102*"game" + 0.078*"play" + 0.055*"win" + 0.052*"player" + '
   '0.051*"year" + 0.030*"score" + 0.025*"goal" + 0.023*"wing" + 0.023*"run"'),
   (17,
   '0.031*"say" + 0.026*"think" + 0.022*"people" + 0.020*"make" + 0.017*"see" + '
   '0.016*"know" + 0.013*"come" + 0.013*"even" + 0.013*"thing" + 0.013*"give"'),
   (18,
   '0.039*"system" + 0.034*"use" + 0.023*"key" + 0.016*"bit" + 0.016*"also" + '
   '0.015*"information" + 0.014*"source" + 0.013*"chip" + 0.013*"available" + '
   '0.010*"provide"'),
   (19,
   '0.085*"line" + 0.073*"write" + 0.053*"article" + 0.046*"organization" + '
   '0.034*"host" + 0.023*"be" + 0.023*"know" + 0.017*"thank" + 0.016*"want" + '
   '0.014*"help"')
]

ความซับซ้อนของโมเดลคอมพิวเตอร์

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

print('\nPerplexity: ', lda_model.log_perplexity(corpus))

เอาต์พุต

Perplexity: -12.338664984332151

คะแนนการเชื่อมโยงกันของคอมพิวเตอร์

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

coherence_model_lda = CoherenceModel(
   model=lda_model, texts=data_lemmatized, dictionary=id2word, coherence='c_v'
)
coherence_lda = coherence_model_lda.get_coherence()
print('\nCoherence Score: ', coherence_lda)

เอาต์พุต

Coherence Score: 0.510264381411751

การแสดงหัวข้อ - คำสำคัญ

แบบจำลอง LDA (lda_model)ที่เราสร้างไว้ข้างต้นสามารถใช้เพื่อตรวจสอบหัวข้อที่ผลิตและคำหลักที่เกี่ยวข้อง สามารถมองเห็นได้โดยใช้pyLDAvisแพคเกจดังนี้ -

pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(lda_model, corpus, id2word)
vis

เอาต์พุต

จากผลลัพธ์ด้านบนฟองอากาศทางด้านซ้ายแสดงถึงหัวข้อและฟองอากาศมีขนาดใหญ่ขึ้นยิ่งหัวข้อนั้นแพร่หลายมากขึ้น โมเดลหัวข้อจะดีถ้าโมเดลหัวข้อมีฟองอากาศขนาดใหญ่ที่ไม่ทับซ้อนกันกระจายอยู่ทั่วทั้งแผนภูมิ

บทนี้จะอธิบายว่าอะไรคือ Latent Dirichlet Allocation (LDA) Mallet Model และวิธีสร้างแบบเดียวกันใน Gensim

ในส่วนก่อนหน้านี้เราได้ใช้โมเดล LDA และรับหัวข้อจากเอกสารของชุดข้อมูล 20Newsgroup นั่นคืออัลกอริทึม LDA ในเวอร์ชันที่สร้างขึ้นของ Gensim นอกจากนี้ยังมี Gensim เวอร์ชัน Mallet ซึ่งให้คุณภาพของหัวข้อที่ดีกว่า ที่นี่เราจะนำ LDA ของ Mallet ไปใช้กับตัวอย่างก่อนหน้านี้ที่เราได้ดำเนินการไปแล้ว

LDA Mallet Model คืออะไร?

Mallet ซึ่งเป็นชุดเครื่องมือโอเพนซอร์สเขียนโดย Andrew McCullum โดยพื้นฐานแล้วเป็นแพคเกจที่ใช้ Java ซึ่งใช้สำหรับ NLP การจำแนกเอกสารการทำคลัสเตอร์การสร้างแบบจำลองหัวข้อและแอปพลิเคชันการเรียนรู้ของเครื่องอื่น ๆ เป็นข้อความ เครื่องมือนี้มีชุดเครื่องมือ Mallet Topic Modeling ซึ่งมีการใช้งาน LDA ตามลำดับตัวอย่างที่มีประสิทธิภาพและ LDA ตามลำดับชั้น

Mallet2.0 เป็นรีลีสปัจจุบันจาก MALLET ซึ่งเป็นชุดเครื่องมือการสร้างแบบจำลองหัวข้อ java ก่อนที่เราจะเริ่มใช้กับ Gensim สำหรับ LDA เราต้องดาวน์โหลดแพ็คเกจ mallet-2.0.8.zip ในระบบของเราและคลายซิป เมื่อติดตั้งและคลายซิปแล้วให้ตั้งค่าตัวแปรสภาพแวดล้อม% MALLET_HOME% ให้ชี้ไปที่ไดเร็กทอรี MALLET ด้วยตนเองหรือตามรหัสที่เราจะให้ในขณะที่ใช้ LDA กับ Mallet ต่อไป

Gensim Wrapper

Python ให้ Gensim wrapper สำหรับ Latent Dirichlet Allocation (LDA) ไวยากรณ์ของ Wrapper นั้นคือgensim.models.wrappers.LdaMallet. โมดูลนี้การสุ่มตัวอย่าง gibbs แบบยุบจาก MALLET ช่วยให้สามารถประเมินแบบจำลอง LDA จากคลังข้อมูลการฝึกอบรมและการอนุมานของการกระจายหัวข้อในเอกสารใหม่ที่มองไม่เห็นได้เช่นกัน

ตัวอย่างการใช้งาน

เราจะใช้ LDA Mallet กับโมเดล LDA ที่สร้างขึ้นก่อนหน้านี้และจะตรวจสอบความแตกต่างของประสิทธิภาพโดยการคำนวณคะแนน Coherence

การจัดเตรียมเส้นทางไปยังไฟล์ Mallet

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

import os
from gensim.models.wrappers import LdaMallet
os.environ.update({'MALLET_HOME':r'C:/mallet-2.0.8/'}) 
#You should update this path as per the path of Mallet directory on your system.
mallet_path = r'C:/mallet-2.0.8/bin/mallet' 
#You should update this path as per the path of Mallet directory on your system.

เมื่อเราระบุเส้นทางไปยังไฟล์ Mallet แล้วตอนนี้เราสามารถใช้งานได้ในคลังข้อมูล สามารถทำได้ด้วยความช่วยเหลือของldamallet.show_topics() ฟังก์ชันดังต่อไปนี้ -

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

เอาต์พุต

[
   (4,
   [('gun', 0.024546225966016102),
   ('law', 0.02181426826996709),
   ('state', 0.017633545129043606),
   ('people', 0.017612848479831116),
   ('case', 0.011341763768445888),
   ('crime', 0.010596684396796159),
   ('weapon', 0.00985160502514643),
   ('person', 0.008671896020034356),
   ('firearm', 0.00838214293105946),
   ('police', 0.008257963035784506)]),
   (9,
   [('make', 0.02147966482730431),
   ('people', 0.021377478029838543),
   ('work', 0.018557122419783363),
   ('money', 0.016676885346413244),
   ('year', 0.015982015123646026),
   ('job', 0.012221540976905783),
   ('pay', 0.010239117106069897),
   ('time', 0.008910688739014919),
   ('school', 0.0079092581238504),
   ('support', 0.007357449417535254)]),
   (14,
   [('power', 0.018428398507941996),
   ('line', 0.013784244460364121),
   ('high', 0.01183271164249895),
   ('work', 0.011560979224821522),
   ('ground', 0.010770484918850819),
   ('current', 0.010745781971789235),
   ('wire', 0.008399002000938712),
   ('low', 0.008053160742076529),
   ('water', 0.006966231071366814),
   ('run', 0.006892122230182061)]),
   (0,
   [('people', 0.025218349201353372),
   ('kill', 0.01500904870564167),
   ('child', 0.013612400660948935),
   ('armenian', 0.010307655991816822),
   ('woman', 0.010287984892595798),
   ('start', 0.01003226060272248),
   ('day', 0.00967818081674404),
   ('happen', 0.009383114328428673),
   ('leave', 0.009383114328428673),
   ('fire', 0.009009363443229208)]),
   (1,
   [('file', 0.030686386604212003),
   ('program', 0.02227713642901929),
   ('window', 0.01945561169918489),
   ('set', 0.015914874783314277),
   ('line', 0.013831003577619592),
   ('display', 0.013794120901412606),
   ('application', 0.012576992586582082),
   ('entry', 0.009275993066056873),
   ('change', 0.00872275292295209),
   ('color', 0.008612104894331132)]),
   (12,
   [('line', 0.07153810971508515),
   ('buy', 0.02975597944523662),
   ('organization', 0.026877236406682988),
   ('host', 0.025451316957679788),
   ('price', 0.025182275552207485),
   ('sell', 0.02461728860071565),
   ('mail', 0.02192687454599263),
   ('good', 0.018967419085797303),
   ('sale', 0.017998870026097017),
   ('send', 0.013694207538540181)]),
   (11,
   [('thing', 0.04901329901329901),
   ('good', 0.0376018876018876),
   ('make', 0.03393393393393394),
   ('time', 0.03326898326898327),
   ('bad', 0.02664092664092664),
   ('happen', 0.017696267696267698),
   ('hear', 0.015615615615615615),
   ('problem', 0.015465465465465466),
   ('back', 0.015143715143715144),
   ('lot', 0.01495066495066495)]),
   (18,
   [('space', 0.020626317374284855),
   ('launch', 0.00965716006366413),
   ('system', 0.008560244332602057),
   ('project', 0.008173097603991913),
   ('time', 0.008108573149223556),
   ('cost', 0.007764442723792318),
   ('year', 0.0076784101174345075),
   ('earth', 0.007484836753129436),
   ('base', 0.0067535595990880545),
   ('large', 0.006689035144319697)]),
   (5,
   [('government', 0.01918437232469453),
   ('people', 0.01461203206475212),
   ('state', 0.011207097828624796),
   ('country', 0.010214802708381975),
   ('israeli', 0.010039691804809714),
   ('war', 0.009436532025838587),
   ('force', 0.00858043427504086),
   ('attack', 0.008424780138532182),
   ('land', 0.0076659662230523775),
   ('world', 0.0075103120865437)]),
   (2,
   [('car', 0.041091194044470564),
   ('bike', 0.015598981291017729),
   ('ride', 0.011019688510138114),
   ('drive', 0.010627877363110981),
   ('engine', 0.009403467528651191),
   ('speed', 0.008081104907434616),
   ('turn', 0.007738270153785875),
   ('back', 0.007738270153785875),
   ('front', 0.007468899990204721),
   ('big', 0.007370947203447938)])
]

การประเมินประสิทธิภาพ

ตอนนี้เราสามารถประเมินประสิทธิภาพของมันได้โดยการคำนวณคะแนนการเชื่อมโยงดังต่อไปนี้ -

ldamallet = gensim.models.wrappers.LdaMallet(
   mallet_path, corpus=corpus, num_topics=20, id2word=id2word
)
pprint(ldamallet.show_topics(formatted=False))

เอาต์พุต

Coherence Score: 0.5842762900901401

บทนี้จะกล่าวถึงเอกสารและแบบจำลอง LDA ใน Gensim

การค้นหาจำนวนหัวข้อที่เหมาะสมที่สุดสำหรับ LDA

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

ฟังก์ชั่นต่อไปนี้ชื่อ coherence_values_computation()จะฝึก LDA หลายรุ่น นอกจากนี้ยังจะให้แบบจำลองและคะแนนการเชื่อมโยงที่สอดคล้องกัน -

def coherence_values_computation(dictionary, corpus, texts, limit, start=2, step=3):
   coherence_values = []
   model_list = []
   for num_topics in range(start, limit, step):
      model = gensim.models.wrappers.LdaMallet(
         mallet_path, corpus=corpus, num_topics=num_topics, id2word=id2word
      )
      model_list.append(model)
   coherencemodel = CoherenceModel(
      model=model, texts=texts, dictionary=dictionary, coherence='c_v'
   )
   coherence_values.append(coherencemodel.get_coherence())
return model_list, coherence_values

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

model_list, coherence_values = coherence_values_computation (
   dictionary=id2word, corpus=corpus, texts=data_lemmatized, 
   start=1, limit=50, step=8
)
limit=50; start=1; step=8;
x = range(start, limit, step)
plt.plot(x, coherence_values)
plt.xlabel("Num Topics")
plt.ylabel("Coherence score")
plt.legend(("coherence_values"), loc='best')
plt.show()

เอาต์พุต

จากนั้นเรายังสามารถพิมพ์ค่าการเชื่อมโยงสำหรับหัวข้อต่างๆได้ดังนี้ -

for m, cv in zip(x, coherence_values):
   print("Num Topics =", m, " is having Coherence Value of", round(cv, 4))

เอาต์พุต

Num Topics = 1 is having Coherence Value of 0.4866
Num Topics = 9 is having Coherence Value of 0.5083
Num Topics = 17 is having Coherence Value of 0.5584
Num Topics = 25 is having Coherence Value of 0.5793
Num Topics = 33 is having Coherence Value of 0.587
Num Topics = 41 is having Coherence Value of 0.5842
Num Topics = 49 is having Coherence Value of 0.5735

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

optimal_model = model_list[3]
model_topics = optimal_model.show_topics(formatted=False)
pprint(optimal_model.print_topics(num_words=10))

[
   (0,
   '0.018*"power" + 0.011*"high" + 0.010*"ground" + 0.009*"current" + '
   '0.008*"low" + 0.008*"wire" + 0.007*"water" + 0.007*"work" + 0.007*"design" '
   '+ 0.007*"light"'),
   (1,
   '0.036*"game" + 0.029*"team" + 0.029*"year" + 0.028*"play" + 0.020*"player" '
   '+ 0.019*"win" + 0.018*"good" + 0.013*"season" + 0.012*"run" + 0.011*"hit"'),
   (2,
   '0.020*"image" + 0.019*"information" + 0.017*"include" + 0.017*"mail" + '
   '0.016*"send" + 0.015*"list" + 0.013*"post" + 0.012*"address" + '
   '0.012*"internet" + 0.012*"system"'),
   (3,
   '0.986*"ax" + 0.002*"_" + 0.001*"tm" + 0.000*"part" + 0.000*"biz" + '
   '0.000*"mb" + 0.000*"mbs" + 0.000*"pne" + 0.000*"end" + 0.000*"di"'),
   (4,
   '0.020*"make" + 0.014*"work" + 0.013*"money" + 0.013*"year" + 0.012*"people" '
   '+ 0.011*"job" + 0.010*"group" + 0.009*"government" + 0.008*"support" + '
   '0.008*"question"'),
   (5,
   '0.011*"study" + 0.011*"drug" + 0.009*"science" + 0.008*"food" + '
   '0.008*"problem" + 0.008*"result" + 0.008*"effect" + 0.007*"doctor" + '
   '0.007*"research" + 0.007*"patient"'),
   (6,
   '0.024*"gun" + 0.024*"law" + 0.019*"state" + 0.015*"case" + 0.013*"people" + '
   '0.010*"crime" + 0.010*"weapon" + 0.010*"person" + 0.008*"firearm" + '
   '0.008*"police"'),
   (7,
   '0.012*"word" + 0.011*"question" + 0.011*"exist" + 0.011*"true" + '
   '0.010*"religion" + 0.010*"claim" + 0.008*"argument" + 0.008*"truth" + '
   '0.008*"life" + 0.008*"faith"'),
   (8,
   '0.077*"time" + 0.029*"day" + 0.029*"call" + 0.025*"back" + 0.021*"work" + '
   '0.019*"long" + 0.015*"end" + 0.015*"give" + 0.014*"year" + 0.014*"week"'),
   (9,
   '0.048*"thing" + 0.041*"make" + 0.038*"good" + 0.037*"people" + '
   '0.028*"write" + 0.019*"bad" + 0.019*"point" + 0.018*"read" + 0.018*"post" + '
   '0.016*"idea"'),
   (10,
   '0.022*"book" + 0.020*"_" + 0.013*"man" + 0.012*"people" + 0.011*"write" + '
   '0.011*"find" + 0.010*"history" + 0.010*"armenian" + 0.009*"turkish" + '
   '0.009*"number"'),
   (11,
   '0.064*"line" + 0.030*"buy" + 0.028*"organization" + 0.025*"price" + '
   '0.025*"sell" + 0.023*"good" + 0.021*"host" + 0.018*"sale" + 0.017*"mail" + '
   '0.016*"cost"'),
   (12,
   '0.041*"car" + 0.015*"bike" + 0.011*"ride" + 0.010*"engine" + 0.009*"drive" '
   '+ 0.008*"side" + 0.008*"article" + 0.007*"turn" + 0.007*"front" + '
   '0.007*"speed"'),
   (13,
   '0.018*"people" + 0.011*"attack" + 0.011*"state" + 0.011*"israeli" + '
   '0.010*"war" + 0.010*"country" + 0.010*"government" + 0.009*"live" + '
   '0.009*"give" + 0.009*"land"'),
   (14,
   '0.037*"file" + 0.026*"line" + 0.021*"read" + 0.019*"follow" + '
   '0.018*"number" + 0.015*"program" + 0.014*"write" + 0.012*"entry" + '
   '0.012*"give" + 0.011*"check"'),
   (15,
   '0.196*"write" + 0.172*"line" + 0.165*"article" + 0.117*"organization" + '
   '0.086*"host" + 0.030*"reply" + 0.010*"university" + 0.008*"hear" + '
   '0.007*"post" + 0.007*"news"'),
   (16,
   '0.021*"people" + 0.014*"happen" + 0.014*"child" + 0.012*"kill" + '
   '0.011*"start" + 0.011*"live" + 0.010*"fire" + 0.010*"leave" + 0.009*"hear" '
   '+ 0.009*"home"'),
   (17,
   '0.038*"key" + 0.018*"system" + 0.015*"space" + 0.015*"technology" + '
   '0.014*"encryption" + 0.010*"chip" + 0.010*"bit" + 0.009*"launch" + '
   '0.009*"public" + 0.009*"government"'),
   (18,
   '0.035*"drive" + 0.031*"system" + 0.027*"problem" + 0.027*"card" + '
   '0.020*"driver" + 0.017*"bit" + 0.017*"work" + 0.016*"disk" + '
   '0.014*"monitor" + 0.014*"machine"'),
   (19,
   '0.031*"window" + 0.020*"run" + 0.018*"color" + 0.018*"program" + '
   '0.017*"application" + 0.016*"display" + 0.015*"set" + 0.015*"version" + '
   '0.012*"screen" + 0.012*"problem"')
]

การค้นหาหัวข้อที่โดดเด่นในประโยค

การค้นหาหัวข้อที่โดดเด่นในประโยคเป็นหนึ่งในการประยุกต์ใช้การสร้างแบบจำลองหัวข้อที่เป็นประโยชน์มากที่สุด เป็นตัวกำหนดว่าเอกสารนั้นเกี่ยวกับหัวข้อใด ที่นี่เราจะพบหมายเลขหัวข้อที่มีเปอร์เซ็นต์การสนับสนุนสูงสุดในเอกสารนั้น ๆ ในการรวบรวมข้อมูลในตารางเราจะสร้างฟังก์ชันชื่อdominant_topics() -

def dominant_topics(ldamodel=lda_model, corpus=corpus, texts=data):
   sent_topics_df = pd.DataFrame()

ต่อไปเราจะได้รับหัวข้อหลักในทุกเอกสาร -

for i, row in enumerate(ldamodel[corpus]):
   row = sorted(row, key=lambda x: (x[1]), reverse=True)

ต่อไปเราจะได้รับหัวข้อ Dominant, Perc Contribution และ Keywords สำหรับทุกเอกสาร -

for j, (topic_num, prop_topic) in enumerate(row):
   if j == 0: # => dominant topic
      wp = ldamodel.show_topic(topic_num)
      topic_keywords = ", ".join([word for word, prop in wp])
sent_topics_df = sent_topics_df.append(
   pd.Series([int(topic_num), round(prop_topic,4), topic_keywords]), ignore_index=True
)
   else:
      break
sent_topics_df.columns = ['Dominant_Topic', 'Perc_Contribution', 'Topic_Keywords']

ด้วยความช่วยเหลือของรหัสต่อไปนี้เราจะเพิ่มข้อความต้นฉบับที่ส่วนท้ายของผลลัพธ์ -

contents = pd.Series(texts)
   sent_topics_df = pd.concat([sent_topics_df, contents], axis=1)
   return(sent_topics_df)
df_topic_sents_keywords = dominant_topics(
   ldamodel=optimal_model, corpus=corpus, texts=data
)

ตอนนี้ทำการจัดรูปแบบของหัวข้อในประโยคดังนี้ -

df_dominant_topic = df_topic_sents_keywords.reset_index()
df_dominant_topic.columns = [
   'Document_No', 'Dominant_Topic', 'Topic_Perc_Contrib', 'Keywords', 'Text'
]

สุดท้ายเราสามารถแสดงหัวข้อที่โดดเด่นได้ดังนี้ -

df_dominant_topic.head(15)

การค้นหาเอกสารที่เป็นตัวแทนส่วนใหญ่

เพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับหัวข้อนี้เรายังสามารถค้นหาเอกสารได้หัวข้อหนึ่ง ๆ มีส่วนทำให้เกิดมากที่สุด เราสามารถสรุปหัวข้อนั้นได้โดยการอ่านเอกสารนั้น ๆ

sent_topics_sorteddf_mallet = pd.DataFrame()
sent_topics_outdf_grpd = df_topic_sents_keywords.groupby('Dominant_Topic')
for i, grp in sent_topics_outdf_grpd:
   sent_topics_sorteddf_mallet = pd.concat([sent_topics_sorteddf_mallet,
grp.sort_values(['Perc_Contribution'], ascending=[0]).head(1)], axis=0)
sent_topics_sorteddf_mallet.reset_index(drop=True, inplace=True)
sent_topics_sorteddf_mallet.columns = [
   'Topic_Number', "Contribution_Perc", "Keywords", "Text"
]
sent_topics_sorteddf_mallet.head()

เอาต์พุต

ปริมาณและการกระจายหัวข้อ

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

ขั้นแรกให้คำนวณจำนวนเอกสารสำหรับทุกหัวข้อดังนี้ -

topic_counts = df_topic_sents_keywords['Dominant_Topic'].value_counts()

จากนั้นคำนวณเปอร์เซ็นต์ของเอกสารสำหรับทุกหัวข้อดังนี้ -;

topic_contribution = round(topic_counts/topic_counts.sum(), 4)

ตอนนี้ค้นหาหัวข้อ Number และ Keywords ดังนี้ -

topic_num_keywords = df_topic_sents_keywords[['Dominant_Topic', 'Topic_Keywords']]

ตอนนี้เชื่อมต่อแล้วคอลัมน์ที่ชาญฉลาดดังนี้ -

df_dominant_topics = pd.concat(
   [topic_num_keywords, topic_counts, topic_contribution], axis=1
)

ต่อไปเราจะเปลี่ยนชื่อคอลัมน์ดังนี้ -

df_dominant_topics.columns = [
   'Dominant-Topic', 'Topic-Keywords', 'Num_Documents', 'Perc_Documents'
]
df_dominant_topics

เอาต์พุต

บทนี้เกี่ยวข้องกับการสร้างแบบจำลองหัวข้อ Latent Semantic Indexing (LSI) และ Hierarchical Dirichlet Process (HDP) ที่เกี่ยวข้องกับ Gensim

อัลกอริทึมการสร้างแบบจำลองหัวข้อที่นำมาใช้ครั้งแรกใน Gensim ด้วย Latent Dirichlet Allocation (LDA) คือ Latent Semantic Indexing (LSI). เรียกอีกอย่างว่าLatent Semantic Analysis (LSA). ได้รับการจดสิทธิบัตรในปี 1988 โดย Scott Deerwester, Susan Dumais, George Furnas, Richard Harshman, Thomas Landaur, Karen Lochbaum และ Lynn Streeter

ในส่วนนี้เราจะตั้งค่าโมเดล LSI ของเรา สามารถทำได้ในลักษณะเดียวกับการตั้งค่าโมเดล LDA เราจำเป็นต้องนำเข้าโมเดล LSI จากgensim.models.

บทบาทของ LSI

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

เมื่อสร้างแล้วเพื่อลดจำนวนแถวแบบจำลอง LSI ใช้เทคนิคทางคณิตศาสตร์ที่เรียกว่าการสลายตัวของค่าเอกพจน์ (SVD) นอกจากการลดจำนวนแถวแล้วยังรักษาโครงสร้างความคล้ายคลึงกันระหว่างคอลัมน์ด้วย

ในเมทริกซ์แถวจะแสดงถึงคำที่ไม่ซ้ำกันและคอลัมน์แสดงถึงเอกสารแต่ละรายการ มันทำงานโดยอาศัยสมมติฐานการกระจายกล่าวคือถือว่าคำที่มีความหมายใกล้เคียงจะเกิดขึ้นในข้อความประเภทเดียวกัน

การใช้งานกับ Gensim

ที่นี่เราจะใช้ LSI (Latent Semantic Indexing) เพื่อแยกหัวข้อที่กล่าวถึงตามธรรมชาติออกจากชุดข้อมูล

กำลังโหลดชุดข้อมูล

ชุดข้อมูลที่เราจะใช้คือชุดข้อมูลของ ’20 Newsgroups’มีบทความข่าวหลายพันบทความจากส่วนต่างๆของรายงานข่าว สามารถใช้ได้ภายใต้Sklearnชุดข้อมูล เราสามารถดาวน์โหลดได้อย่างง่ายดายโดยทำตามสคริปต์ Python -

from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')

ลองดูตัวอย่างข่าวด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

newsgroups_train.data[:4]
["From: [email protected] (where's my thing)\nSubject: 
WHAT car is this!?\nNntp-Posting-Host: rac3.wam.umd.edu\nOrganization: 
University of Maryland, College Park\nLines: 15\n\n 
I was wondering if anyone out there could enlighten me on this car 
I saw\nthe other day. It was a 2-door sports car,
looked to be from the late 60s/\nearly 70s. It was called a Bricklin. 
The doors were really small. In addition,\nthe front bumper was separate from 
the rest of the body. This is \nall I know. If anyone can tellme a model name, 
engine specs, years\nof production, where this car is made, history, or 
whatever info you\nhave on this funky looking car, 
please e-mail.\n\nThanks,\n- IL\n ---- brought to you by your neighborhood 
Lerxst ----\n\n\n\n\n",

"From: [email protected] (Guy Kuo)\nSubject: 
SI Clock Poll - Final Call\nSummary: Final call for SI clock reports\nKeywords: 
SI,acceleration,clock,upgrade\nArticle-I.D.: shelley.1qvfo9INNc3s\nOrganization: 
University of Washington\nLines: 11\nNNTP-Posting-Host: carson.u.washington.edu\n\nA 
fair number of brave souls who upgraded their SI clock oscillator have\nshared their 
experiences for this poll. Please send a brief message detailing\nyour experiences with 
the procedure. Top speed attained, CPU rated speed,\nadd on cards and adapters, heat 
sinks, hour of usage per day, floppy disk\nfunctionality with 800 and 1.4 m floppies 
are especially requested.\n\nI will be summarizing in the next two days, so please add 
to the network\nknowledge base if you have done the clock upgrade and haven't answered 
this\npoll. Thanks.\n\nGuy Kuo <[email protected]>\n",

'From: [email protected] (Thomas E Willis)\nSubject: 
PB questions...\nOrganization: Purdue University Engineering Computer 
Network\nDistribution: usa\nLines: 36\n\nwell folks, my mac plus finally gave up the 
ghost this weekend after\nstarting life as a 512k way back in 1985. sooo, i\'m in the 
market for a\nnew machine a bit sooner than i intended to be...\n\ni\'m looking into 
picking up a powerbook 160 or maybe 180 and have a bunch\nof questions that (hopefully) 
somebody can answer:\n\n* does anybody know any dirt on when the next round of 
powerbook\nintroductions are expected? i\'d heard the 185c was supposed to make 
an\nappearence "this summer" but haven\'t heard anymore on it - and since i\ndon\'t 
have access to macleak, i was wondering if anybody out there had\nmore info...\n\n* has 
anybody heard rumors about price drops to the powerbook line like the\nones the duo\'s 
just went through recently?\n\n* what\'s the impression of the display on the 180? i 
could probably swing\na 180 if i got the 80Mb disk rather than the 120, but i don\'t 
really have\na feel for how much "better" the display is (yea, it looks great in 
the\nstore, but is that all "wow" or is it really that good?). could i solicit\nsome 
opinions of people who use the 160 and 180 day-to-day on if its worth\ntaking the disk 
size and money hit to get the active display? (i realize\nthis is a real subjective 
question, but i\'ve only played around with the\nmachines in a computer store breifly 
and figured the opinions of somebody\nwho actually uses the machine daily might prove 
helpful).\n\n* how well does hellcats perform? ;)\n\nthanks a bunch in advance for any 
info - if you could email, i\'ll post a\nsummary (news reading time is at a premium 
with finals just around the\ncorner... :( )\n--\nTom Willis \\ [email protected] 
\\ Purdue Electrical 
Engineering\n---------------------------------------------------------------------------\
n"Convictions are more dangerous enemies of truth than lies." - F. W.\nNietzsche\n',

'From: jgreen@amber (Joe Green)\nSubject: Re: Weitek P9000 ?\nOrganization: Harris 
Computer Systems Division\nLines: 14\nDistribution: world\nNNTP-Posting-Host: 
amber.ssd.csd.harris.com\nX-Newsreader: TIN [version 1.1 PL9]\n\nRobert J.C. Kyanko 
([email protected]) wrote:\n > [email protected] writes in article <
[email protected]>:\n> > Anyone know about the Weitek P9000 
graphics chip?\n > As far as the low-level stuff goes, it looks pretty nice. It\'s 
got this\n > quadrilateral fill command that requires just the four
points.\n\nDo you have Weitek\'s address/phone number? I\'d like to get some 
information\nabout this chip.\n\n--\nJoe Green\t\t\t\tHarris 
Corporation\[email protected]\t\t\tComputer Systems Division\n"The only thing that 
really scares me is a person with no sense of humor."\n\t\t\t\t\t\t-- Jonathan 
Winters\n']

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

เราต้องการคำหยุดจาก NLTK และโมเดลภาษาอังกฤษจาก Scapy ทั้งสองสามารถดาวน์โหลดได้ดังนี้ -

import nltk;
nltk.download('stopwords')
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])

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

ในการสร้างโมเดล LSI เราต้องนำเข้าแพ็คเกจที่จำเป็นต่อไปนี้ -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import matplotlib.pyplot as plt

กำลังเตรียมคำหยุด

ตอนนี้เราต้องนำเข้าคำหยุดและใช้งาน -

from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])

ล้างข้อความ

ตอนนี้ด้วยความช่วยเหลือของ Gensim's simple_preprocess()เราต้องโทเค็นแต่ละประโยคลงในรายการคำ เราควรลบเครื่องหมายวรรคตอนและอักขระที่ไม่จำเป็นออกด้วย ในการดำเนินการนี้เราจะสร้างฟังก์ชันชื่อsent_to_words() -

def sent_to_words(sentences):
   for sentence in sentences:
      yield(gensim.utils.simple_preprocess(str(sentence), deacc=True))
data_words = list(sent_to_words(data))

การสร้างโมเดล Bigram และ Trigram

อย่างที่เราทราบกันดีว่า bigrams เป็นคำสองคำที่มักเกิดขึ้นพร้อมกันในเอกสารและตรีโกณคือสามคำที่มักเกิดขึ้นพร้อมกันในเอกสาร ด้วยความช่วยเหลือของ Gensim's Phrases model เราสามารถทำได้ -

bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)

กรองคำหยุด

ต่อไปเราต้องกรองคำหยุดออก นอกจากนั้นเรายังจะสร้างฟังก์ชั่นเพื่อสร้าง bigrams, trigrams และสำหรับ lemmatisation -

def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
   return texts_out

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

ตอนนี้เราต้องสร้างพจนานุกรมและคลังข้อมูล เราทำในตัวอย่างก่อนหน้านี้เช่นกัน -

id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]

การสร้างโมเดลหัวข้อ LSI

เราได้ดำเนินการทุกอย่างที่จำเป็นในการฝึกโมเดล LSI แล้ว ตอนนี้ถึงเวลาสร้างแบบจำลองหัวข้อ LSI สำหรับตัวอย่างการใช้งานของเราสามารถทำได้โดยใช้รหัสบรรทัดต่อไปนี้ -

lsi_model = gensim.models.lsimodel.LsiModel(
   corpus=corpus, id2word=id2word, num_topics=20,chunksize=100
)

ตัวอย่างการใช้งาน

มาดูตัวอย่างการใช้งานที่สมบูรณ์เพื่อสร้างแบบจำลองหัวข้อ LDA -

import re
import numpy as np
import pandas as pd
from pprint import pprint
import gensim
import gensim.corpora as corpora
from gensim.utils import simple_preprocess
from gensim.models import CoherenceModel
import spacy
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
stop_words = stopwords.words('english')
stop_words.extend(['from', 'subject', 're', 'edu', 'use'])
from sklearn.datasets import fetch_20newsgroups
newsgroups_train = fetch_20newsgroups(subset='train')
data = newsgroups_train.data
data = [re.sub('\S*@\S*\s?', '', sent) for sent in data]
data = [re.sub('\s+', ' ', sent) for sent in data]
data = [re.sub("\'", "", sent) for sent in data]
print(data_words[:4]) #it will print the data after prepared for stopwords
bigram = gensim.models.Phrases(data_words, min_count=5, threshold=100)
trigram = gensim.models.Phrases(bigram[data_words], threshold=100)
bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)
def remove_stopwords(texts):
   return [[word for word in simple_preprocess(str(doc)) 
   if word not in stop_words] for doc in texts]
def make_bigrams(texts):
   return [bigram_mod[doc] for doc in texts]
def make_trigrams(texts):
   return [trigram_mod[bigram_mod[doc]] for doc in texts]
def lemmatization(texts, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']):
   texts_out = []
   for sent in texts:
      doc = nlp(" ".join(sent))
      texts_out.append([token.lemma_ for token in doc if token.pos_ in allowed_postags])
return texts_out
data_words_nostops = remove_stopwords(data_words)
data_words_bigrams = make_bigrams(data_words_nostops)
nlp = spacy.load('en_core_web_md', disable=['parser', 'ner'])
data_lemmatized = lemmatization(
   data_words_bigrams, allowed_postags=['NOUN', 'ADJ', 'VERB', 'ADV']
)
print(data_lemmatized[:4]) #it will print the lemmatized data.
id2word = corpora.Dictionary(data_lemmatized)
texts = data_lemmatized
corpus = [id2word.doc2bow(text) for text in texts]
print(corpus[:4]) #it will print the corpus we created above.
[[(id2word[id], freq) for id, freq in cp] for cp in corpus[:4]] 
#it will print the words with their frequencies.
lsi_model = gensim.models.lsimodel.LsiModel(
   corpus=corpus, id2word=id2word, num_topics=20,chunksize=100
)

ตอนนี้เราสามารถใช้โมเดล LSI ที่สร้างขึ้นด้านบนเพื่อรับหัวข้อต่างๆ

การดูหัวข้อใน LSI Model

รุ่น LSI (lsi_model)เราได้สร้างไว้ด้านบนสามารถใช้เพื่อดูหัวข้อจากเอกสาร สามารถทำได้ด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

pprint(lsi_model.print_topics())
doc_lsi = lsi_model[corpus]

เอาต์พุต

[
   (0,
   '1.000*"ax" + 0.001*"_" + 0.000*"tm" + 0.000*"part" +    0.000*"pne" + '
   '0.000*"biz" + 0.000*"mbs" + 0.000*"end" + 0.000*"fax" + 0.000*"mb"'),
   (1,
   '0.239*"say" + 0.222*"file" + 0.189*"go" + 0.171*"know" + 0.169*"people" + '
   '0.147*"make" + 0.140*"use" + 0.135*"also" + 0.133*"see" + 0.123*"think"')
]

กระบวนการ Dirichlet ตามลำดับชั้น (HPD)

โมเดลหัวข้อเช่น LDA และ LSI ช่วยในการสรุปและจัดระเบียบที่เก็บถาวรของข้อความขนาดใหญ่ที่ไม่สามารถวิเคราะห์ด้วยมือได้ นอกเหนือจาก LDA และ LSI แล้วโมเดลหัวข้อที่มีประสิทธิภาพอีกอย่างใน Gensim คือ HDP (Hierarchical Dirichlet Process) โดยพื้นฐานแล้วเป็นรูปแบบการเป็นสมาชิกแบบผสมผสานสำหรับการวิเคราะห์ข้อมูลที่จัดกลุ่มโดยไม่ได้รับการดูแล ซึ่งแตกต่างจาก LDA (คู่ที่ จำกัด ของมัน) HDP อนุมานจำนวนหัวข้อจากข้อมูล

การใช้งานกับ Gensim

สำหรับการนำ HDP ไปใช้ใน Gensim เราจำเป็นต้องฝึกคลังข้อมูลและพจนานุกรม (ดังตัวอย่างข้างต้นในขณะที่ใช้โมเดลหัวข้อ LDA และ LSI) โมเดลหัวข้อ HDP ที่เราสามารถนำเข้าจาก gensim.models.HdpModel นอกจากนี้เราจะใช้โมเดลหัวข้อ HDP กับข้อมูล 20Newsgroup และขั้นตอนก็เหมือนกัน

สำหรับคลังข้อมูลและพจนานุกรมของเรา (สร้างขึ้นในตัวอย่างด้านบนสำหรับโมเดล LSI และ LDA) เราสามารถนำเข้า HdpModel ได้ดังนี้ -

Hdp_model = gensim.models.hdpmodel.HdpModel(corpus=corpus, id2word=id2word)

การดูหัวข้อใน LSI Model

รุ่น HDP (Hdp_model)สามารถใช้เพื่อดูหัวข้อจากเอกสาร สามารถทำได้ด้วยความช่วยเหลือของสคริปต์ต่อไปนี้ -

pprint(Hdp_model.print_topics())

เอาต์พุต

[
   (0,
   '0.009*line + 0.009*write + 0.006*say + 0.006*article + 0.006*know + '
   '0.006*people + 0.005*make + 0.005*go + 0.005*think + 0.005*be'),
   (1,
   '0.016*line + 0.011*write + 0.008*article + 0.008*organization + 0.006*know '
   '+ 0.006*host + 0.006*be + 0.005*get + 0.005*use + 0.005*say'),
   (2,
   '0.810*ax + 0.001*_ + 0.000*tm + 0.000*part + 0.000*mb + 0.000*pne + '
   '0.000*biz + 0.000*end + 0.000*wwiz + 0.000*fax'),
   (3,
   '0.015*line + 0.008*write + 0.007*organization + 0.006*host + 0.006*know + '
   '0.006*article + 0.005*use + 0.005*thank + 0.004*get + 0.004*problem'),
   (4,
   '0.004*line + 0.003*write + 0.002*believe + 0.002*think + 0.002*article + '
   '0.002*belief + 0.002*say + 0.002*see + 0.002*look + 0.002*organization'),
   (5,
   '0.005*line + 0.003*write + 0.003*organization + 0.002*article + 0.002*time '
   '+ 0.002*host + 0.002*get + 0.002*look + 0.002*say + 0.001*number'),
   (6,
   '0.003*line + 0.002*say + 0.002*write + 0.002*go + 0.002*gun + 0.002*get + '
   '0.002*organization + 0.002*bill + 0.002*article + 0.002*state'),
   (7,
   '0.003*line + 0.002*write + 0.002*article + 0.002*organization + 0.001*none '
   '+ 0.001*know + 0.001*say + 0.001*people + 0.001*host + 0.001*new'),
   (8,
   '0.004*line + 0.002*write + 0.002*get + 0.002*team + 0.002*organization + '
   '0.002*go + 0.002*think + 0.002*know + 0.002*article + 0.001*well'),
   (9,
   '0.004*line + 0.002*organization + 0.002*write + 0.001*be + 0.001*host + '
   '0.001*article + 0.001*thank + 0.001*use + 0.001*work + 0.001*run'),
   (10,
   '0.002*line + 0.001*game + 0.001*write + 0.001*get + 0.001*know + '
   '0.001*thing + 0.001*think + 0.001*article + 0.001*help + 0.001*turn'),
   (11,
   '0.002*line + 0.001*write + 0.001*game + 0.001*organization + 0.001*say + '
   '0.001*host + 0.001*give + 0.001*run + 0.001*article + 0.001*get'),
   (12,
   '0.002*line + 0.001*write + 0.001*know + 0.001*time + 0.001*article + '
   '0.001*get + 0.001*think + 0.001*organization + 0.001*scope + 0.001*make'),
   (13,
   '0.002*line + 0.002*write + 0.001*article + 0.001*organization + 0.001*make '
   '+ 0.001*know + 0.001*see + 0.001*get + 0.001*host + 0.001*really'),
   (14,
   '0.002*write + 0.002*line + 0.002*know + 0.001*think + 0.001*say + '
   '0.001*article + 0.001*argument + 0.001*even + 0.001*card + 0.001*be'),
   (15,
   '0.001*article + 0.001*line + 0.001*make + 0.001*write + 0.001*know + '
   '0.001*say + 0.001*exist + 0.001*get + 0.001*purpose + 0.001*organization'),
   (16,
   '0.002*line + 0.001*write + 0.001*article + 0.001*insurance + 0.001*go + '
   '0.001*be + 0.001*host + 0.001*say + 0.001*organization + 0.001*part'),
   (17,
   '0.001*line + 0.001*get + 0.001*hit + 0.001*go + 0.001*write + 0.001*say + '
   '0.001*know + 0.001*drug + 0.001*see + 0.001*need'),
   (18,
   '0.002*option + 0.001*line + 0.001*flight + 0.001*power + 0.001*software + '
   '0.001*write + 0.001*add + 0.001*people + 0.001*organization + 0.001*module'),
   (19,
   '0.001*shuttle + 0.001*line + 0.001*roll + 0.001*attitude + 0.001*maneuver + '
   '0.001*mission + 0.001*also + 0.001*orbit + 0.001*produce + 0.001*frequency')
]

บทนี้จะช่วยให้เราเข้าใจพัฒนาการของการฝังคำใน Gensim

การฝังคำวิธีการแทนคำและเอกสารคือการแทนเวกเตอร์ที่หนาแน่นสำหรับข้อความที่คำที่มีความหมายเหมือนกันมีการแทนค่าที่คล้ายกัน ต่อไปนี้เป็นลักษณะบางประการของการฝังคำ -

  • เป็นคลาสของเทคนิคที่แสดงถึงคำแต่ละคำเป็นเวกเตอร์ที่มีมูลค่าจริงในปริภูมิเวกเตอร์ที่กำหนดไว้ล่วงหน้า

  • เทคนิคนี้มักจะรวมอยู่ในฟิลด์ของ DL (การเรียนรู้เชิงลึก) เนื่องจากทุกคำถูกจับคู่กับเวกเตอร์หนึ่งตัวและค่าเวกเตอร์จะได้รับการเรียนรู้ในลักษณะเดียวกับที่ NN (Neural Networks) ทำ

  • แนวทางสำคัญของเทคนิคการฝังคำคือการแสดงแบบกระจายหนาแน่นสำหรับทุกคำ

วิธีการฝังคำ / อัลกอริทึมที่แตกต่างกัน

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

Word2Vec โดย Google

Word2Vec พัฒนาโดย Tomas Mikolov และอื่น ๆ อัล ที่ Google ในปี 2013 เป็นวิธีการทางสถิติในการเรียนรู้การฝังคำจากคลังข้อความอย่างมีประสิทธิภาพ มันถูกพัฒนาขึ้นเพื่อตอบสนองเพื่อให้การฝึกอบรมการฝังคำโดยใช้ NN มีประสิทธิภาพมากขึ้น ได้กลายเป็นมาตรฐานสำหรับการฝังคำโดยพฤตินัย

การฝังคำโดย Word2Vec เกี่ยวข้องกับการวิเคราะห์เวกเตอร์ที่เรียนรู้เช่นเดียวกับการสำรวจคณิตศาสตร์เวกเตอร์เกี่ยวกับการแทนคำ ต่อไปนี้เป็นวิธีการเรียนรู้สองวิธีที่แตกต่างกันซึ่งสามารถใช้เป็นส่วนหนึ่งของวิธี Word2Vec -

  • รุ่น CBoW (กระเป๋าคำต่อเนื่อง)
  • แบบจำลองข้ามกรัมต่อเนื่อง

GloVe โดย Standford

GloVe (เวกเตอร์สากลสำหรับการเป็นตัวแทนของคำ) เป็นส่วนขยายของเมธอด Word2Vec ได้รับการพัฒนาโดย Pennington et al ที่สแตนฟอร์ด อัลกอริทึม GloVe เป็นการผสมผสานของทั้งสองอย่าง -

  • สถิติทั่วโลกของเทคนิคการแยกตัวประกอบเมทริกซ์เช่น LSA (Latent Semantic Analysis)
  • การเรียนรู้ตามบริบทท้องถิ่นใน Word2Vec

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

การพัฒนาการฝัง Word2Vec

ที่นี่เราจะพัฒนาการฝัง Word2Vec โดยใช้ Gensim ในการทำงานกับโมเดล Word2Vec Gensim จะจัดเตรียมให้เราWord2Vec คลาสที่สามารถนำเข้าจาก models.word2vec. สำหรับการนำไปใช้งาน word2vec ต้องการข้อความจำนวนมากเช่นคลังบทวิจารณ์ของ Amazon ทั้งหมด แต่ที่นี่เราจะใช้หลักการนี้กับข้อความหน่วยความจำขนาดเล็ก

ตัวอย่างการใช้งาน

ก่อนอื่นเราต้องนำเข้าคลาส Word2Vec จาก gensim.models ดังนี้ -

from gensim.models import Word2Vec

ต่อไปเราต้องกำหนดข้อมูลการฝึกอบรม แทนที่จะใช้ไฟล์ข้อความขนาดใหญ่เรากำลังใช้บางประโยคเพื่อใช้หลักการนี้

sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]

เมื่อได้ข้อมูลการฝึกอบรมแล้วเราจำเป็นต้องฝึกโมเดล สามารถทำได้ดังนี้ -

model = Word2Vec(sentences, min_count=1)

เราสามารถสรุปโมเดลได้ดังนี้ -;

print(model)

เราสามารถสรุปคำศัพท์ได้ดังนี้ -

words = list(model.wv.vocab)
print(words)

ต่อไปมาเข้าถึงเวกเตอร์คำเดียว เรากำลังทำเพื่อคำว่า 'กวดวิชา'

print(model['tutorial'])

ต่อไปเราต้องบันทึกโมเดล -

model.save('model.bin')

ต่อไปเราต้องโหลดแบบจำลอง -

new_model = Word2Vec.load('model.bin')

สุดท้ายพิมพ์โมเดลที่บันทึกไว้ดังนี้ -

print(new_model)

ตัวอย่างการใช้งานที่สมบูรณ์

from gensim.models import Word2Vec
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)

เอาต์พุต

Word2Vec(vocab=20, size=100, alpha=0.025)
[
   'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint', 
   'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are', 
   'implementing', 'word2vec', 'learn', 'full'
]
[
   -2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
   -1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
   -1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
   3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
   -2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
   -4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
   9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
   4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
   1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
   4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
   4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
   6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
   -2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
   7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
   4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
   -3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
   3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
   -3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
   -3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
   2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
   -3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
   1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
   3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
   3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
   -1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)

การแสดงภาพการฝังคำ

นอกจากนี้เรายังสำรวจคำที่ฝังด้วยการแสดงภาพได้อีกด้วย สามารถทำได้โดยใช้วิธีการฉายภาพแบบคลาสสิก (เช่น PCA) เพื่อลดเวกเตอร์คำที่มีมิติสูงเป็นพล็อต 2 มิติ เมื่อลดแล้วเราสามารถพล็อตบนกราฟได้

การพล็อต Word Vectors โดยใช้ PCA

อันดับแรกเราต้องดึงเวกเตอร์ทั้งหมดจากแบบจำลองที่ผ่านการฝึกอบรมดังนี้ -

Z = model[model.wv.vocab]

ต่อไปเราต้องสร้างแบบจำลอง 2-D PCA ของเวกเตอร์คำโดยใช้คลาส PCA ดังนี้ -

pca = PCA(n_components=2)
result = pca.fit_transform(Z)

ตอนนี้เราสามารถพล็อตการฉายภาพโดยใช้ matplotlib ดังต่อไปนี้ -

Pyplot.scatter(result[:,0],result[:,1])

นอกจากนี้เรายังสามารถใส่คำอธิบายประกอบจุดบนกราฟด้วยคำนั้น ๆ พล็อตการฉายภาพโดยใช้ matplotlib ดังนี้ -

words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))

ตัวอย่างการใช้งานที่สมบูรณ์

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
	['this', 'is', 'the', 'tutorials' 'point', 'website'],
	['you', 'can', 'read', 'technical','tutorials', 'for','free'],
	['we', 'are', 'implementing','word2vec'],
	['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

เอาต์พุต

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

การสร้างเอกสารเวกเตอร์โดยใช้ Doc2Vec

ในการสร้างเวกเตอร์เอกสารโดยใช้ Doc2Vec เราจะใช้ชุดข้อมูล text8 ซึ่งสามารถดาวน์โหลดได้จาก gensim.downloader.

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

เราสามารถดาวน์โหลดชุดข้อมูล text8 โดยใช้คำสั่งต่อไปนี้ -

import gensim
import gensim.downloader as api
dataset = api.load("text8")
data = [d for d in dataset]

จะใช้เวลาสักครู่ในการดาวน์โหลดชุดข้อมูล text8

ฝึก Doc2Vec

ในการฝึกโมเดลเราต้องใช้เอกสารที่ติดแท็กซึ่งสามารถสร้างได้โดยใช้ models.doc2vec.TaggedDcument() ดังต่อไปนี้ -

def tagged_document(list_of_list_of_words):
   for i, list_of_words in enumerate(list_of_list_of_words):
      yield gensim.models.doc2vec.TaggedDocument(list_of_words, [i])
data_for_training = list(tagged_document(data))

เราสามารถพิมพ์ชุดข้อมูลที่ผ่านการฝึกอบรมได้ดังนี้ -

print(data_for_training [:1])

เอาต์พุต

[TaggedDocument(words=['anarchism', 'originated', 'as', 'a', 'term', 'of',
'abuse', 'first', 'used', 'against', 'early', 'working', 'class', 'radicals',
'including', 'the', 'diggers', 'of', 'the', 'english', 'revolution', 
'and', 'the', 'sans', 'culottes', 'of', 'the', 'french', 'revolution',
'whilst', 'the', 'term', 'is', 'still', 'used', 'in', 'a', 'pejorative',
'way', 'to', 'describe', 'any', 'act', 'that', 'used', 'violent', 
'means', 'to', 'destroy',
'the', 'organization', 'of', 'society', 'it', 'has', 'also', 'been'
, 'taken', 'up', 'as', 'a', 'positive', 'label', 'by', 'self', 'defined',
'anarchists', 'the', 'word', 'anarchism', 'is', 'derived', 'from', 'the',
'greek', 'without', 'archons', 'ruler', 'chief', 'king', 'anarchism', 
'as', 'a', 'political', 'philosophy', 'is', 'the', 'belief', 'that', 
'rulers', 'are', 'unnecessary', 'and', 'should', 'be', 'abolished',
'although', 'there', 'are', 'differing', 'interpretations', 'of', 
'what', 'this', 'means', 'anarchism', 'also', 'refers', 'to', 
'related', 'social', 'movements', 'that', 'advocate', 'the', 
'elimination', 'of', 'authoritarian', 'institutions', 'particularly',
'the', 'state', 'the', 'word', 'anarchy', 'as', 'most', 'anarchists', 
'use', 'it', 'does', 'not', 'imply', 'chaos', 'nihilism', 'or', 'anomie',
'but', 'rather', 'a', 'harmonious', 'anti', 'authoritarian', 'society', 
'in', 'place', 'of', 'what', 'are', 'regarded', 'as', 'authoritarian',
'political', 'structures', 'and', 'coercive', 'economic', 'institutions', 
'anarchists', 'advocate', 'social', 'relations', 'based', 'upon', 'voluntary',
'association', 'of', 'autonomous', 'individuals', 'mutual', 'aid', 'and', 
'self', 'governance', 'while', 'anarchism', 'is', 'most', 'easily', 'defined',
'by', 'what', 'it', 'is', 'against', 'anarchists', 'also', 'offer', 
'positive', 'visions', 'of', 'what', 'they', 'believe', 'to', 'be', 'a',
'truly', 'free', 'society', 'however', 'ideas', 'about', 'how', 'an', 'anarchist',
'society', 'might', 'work', 'vary', 'considerably', 'especially', 'with',
'respect', 'to', 'economics', 'there', 'is', 'also', 'disagreement', 'about', 
'how', 'a', 'free', 'society', 'might', 'be', 'brought', 'about', 'origins', 
'and', 'predecessors', 'kropotkin', 'and', 'others', 'argue', 'that', 'before',
'recorded', 'history', 'human', 'society', 'was', 'organized', 'on', 'anarchist', 
'principles', 'most', 'anthropologists', 'follow', 'kropotkin', 'and', 'engels', 
'in', 'believing', 'that', 'hunter', 'gatherer', 'bands', 'were', 'egalitarian',
'and', 'lacked', 'division', 'of', 'labour', 'accumulated', 'wealth', 'or', 'decreed',
'law', 'and', 'had', 'equal', 'access', 'to', 'resources', 'william', 'godwin', 
'anarchists', 'including', 'the', 'the', 'anarchy', 'organisation', 'and', 'rothbard',
'find', 'anarchist', 'attitudes', 'in', 'taoism', 'from', 'ancient', 'china', 
'kropotkin', 'found', 'similar', 'ideas', 'in', 'stoic', 'zeno', 'of', 'citium', 
'according', 'to', 'kropotkin', 'zeno', 'repudiated', 'the', 'omnipotence', 'of',
'the', 'state', 'its', 'intervention', 'and', 'regimentation', 'and', 'proclaimed',
'the', 'sovereignty', 'of', 'the', 'moral', 'law', 'of', 'the', 'individual', 'the',
'anabaptists', 'of', 'one', 'six', 'th', 'century', 'europe', 'are', 'sometimes',
'considered', 'to', 'be', 'religious', 'forerunners', 'of', 'modern', 'anarchism',
'bertrand', 'russell', 'in', 'his', 'history', 'of', 'western', 'philosophy', 
'writes', 'that', 'the', 'anabaptists', 'repudiated', 'all', 'law', 'since', 
'they', 'held', 'that', 'the', 'good', 'man', 'will', 'be', 'guided', 'at', 
'every', 'moment', 'by', 'the', 'holy', 'spirit', 'from', 'this', 'premise',
'they', 'arrive', 'at', 'communism', 'the', 'diggers', 'or', 'true', 'levellers', 
'were', 'an', 'early', 'communistic', 'movement',
(truncated…)

เริ่มต้นโมเดล

เมื่อได้รับการฝึกฝนแล้วตอนนี้เราจำเป็นต้องเริ่มต้นโมเดล สามารถทำได้ดังนี้ -

model = gensim.models.doc2vec.Doc2Vec(vector_size=40, min_count=2, epochs=30)

ตอนนี้สร้างคำศัพท์ดังนี้ -

model.build_vocab(data_for_training)

ตอนนี้เรามาฝึกโมเดล Doc2Vec ดังนี้ -

model.train(data_for_training, total_examples=model.corpus_count, epochs=model.epochs)

การวิเคราะห์ผลลัพธ์

สุดท้ายเราสามารถวิเคราะห์ผลลัพธ์โดยใช้ model.infer_vector () ดังต่อไปนี้ -

print(model.infer_vector(['violent', 'means', 'to', 'destroy', 'the','organization']))

ตัวอย่างการใช้งานที่สมบูรณ์

import gensim
import gensim.downloader as api
dataset = api.load("text8")
data = [d for d in dataset]
def tagged_document(list_of_list_of_words):
   for i, list_of_words in enumerate(list_of_list_of_words):
      yield gensim.models.doc2vec.TaggedDocument(list_of_words, [i])
data_for_training = list(tagged_document(data))
print(data_for_training[:1])
model = gensim.models.doc2vec.Doc2Vec(vector_size=40, min_count=2, epochs=30)
model.build_vocab(data_training)
model.train(data_training, total_examples=model.corpus_count, epochs=model.epochs)
print(model.infer_vector(['violent', 'means', 'to', 'destroy', 'the','organization']))

เอาต์พุต

[
   -0.2556166 0.4829361 0.17081228 0.10879577 0.12525807 0.10077011
   -0.21383236 0.19294572 0.11864349 -0.03227958 -0.02207291 -0.7108424
   0.07165232 0.24221905 -0.2924459 -0.03543589 0.21840079 -0.1274817
   0.05455418 -0.28968817 -0.29146606 0.32885507 0.14689675 -0.06913587
   -0.35173815 0.09340707 -0.3803535 -0.04030455 -0.10004586 0.22192696
   0.2384828 -0.29779273 0.19236489 -0.25727913 0.09140676 0.01265439
   0.08077634 -0.06902497 -0.07175519 -0.22583418 -0.21653089 0.00347822
   -0.34096122 -0.06176808 0.22885063 -0.37295452 -0.08222228 -0.03148199
   -0.06487323 0.11387568
]