Gensim - เวกเตอร์และโมเดล

ที่นี่เราจะเรียนรู้เกี่ยวกับแนวคิดหลักของ 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