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