Gensim - การสร้างพจนานุกรม

ในบทสุดท้ายที่เราพูดถึงเวกเตอร์และแบบจำลองคุณมีความคิดเกี่ยวกับพจนานุกรม ที่นี่เราจะกล่าวถึง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.