Gensim - การสร้างถุงคำ (BoW) Corpus

เราเข้าใจวิธีสร้างพจนานุกรมจากรายการเอกสารและจากไฟล์ข้อความ (จากหนึ่งและจากมากกว่าหนึ่งไฟล์) ตอนนี้ในส่วนนี้เราจะสร้างคลังคำศัพท์ (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)