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.