เกณฑ์มาตรฐานการทดลองนี้เปรียบเทียบวิธีที่แตกต่างกันในการแสดงคำในงานที่ง่ายขึ้นในการสร้างแบบจำลองภาษาที่เรียกว่า
แบบจำลองภาษาเป็นวิธีการคำนวณความน่าจะเป็นของส่วนที่กำหนดของข้อความ (ห่วงโซ่คำ) NLP ก่อนหน้านี้เคยใช้ตัวเลือกต่าง ๆ อย่างกว้างขวางสำหรับการสร้าง LM ตามการนับ N-GRAMS และการปรับให้เรียบ (เรียบ) เพื่อชดเชยการปลดปล่อยสำหรับ N-GRAMS ของซุ้มโค้งขนาดใหญ่ ตัวอย่างเช่น NLTK มีการใช้วิธี Kneser-Ney นอกจากนี้ยังมีการใช้งานที่แตกต่างกันจำนวนมากที่แตกต่างกันในรายละเอียดทางเทคนิคเกี่ยวกับการจัดเก็บข้อมูลจำนวนมากของข้อมูล N-Gramer และความเร็วในการประมวลผลข้อความเช่น https://github.com/kpu/kenlm
ในช่วงสองสามปีที่ผ่านมาตัวเลือกที่แตกต่างกันสำหรับแบบจำลองภาษาประสาท (NLMS) ได้รับการใช้อย่างแพร่หลายซึ่งใช้สถาปัตยกรรม neurosoteal ต่างๆรวมถึงการเกิดซ้ำและประกาย NLM สามารถแบ่งออกเป็นสองกลุ่ม: การทำงานในระดับของคำ (NLM ที่ตระหนักถึงคำศัพท์) และในระดับของตัวละคร (NLM ที่ตระหนักถึงตัวละคร) ตัวเลือกที่สองน่าสนใจเป็นพิเศษในการที่มันช่วยให้แบบจำลองทำงานกับ morphemes นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับภาษาที่มีสัณฐานวิทยาที่หลากหลาย สำหรับคำบางคำรูปแบบไวยากรณ์หลายร้อยรูปแบบอาจมีอยู่เช่นเดียวกับในกรณีของคำคุณศัพท์ในภาษารัสเซีย แม้แต่เคสข้อความที่มีขนาดใหญ่มากก็ไม่รับประกันว่ารูปแบบคำทั้งหมดจะรวมอยู่ในคำศัพท์สำหรับ NLM ที่ตระหนักถึงคำ ในทางกลับกันโครงสร้าง morphemic มักจะปฏิบัติตามกฎปกติดังนั้นความรู้เกี่ยวกับพื้นฐานหรือรูปแบบพื้นฐานของคำช่วยให้คุณสามารถสร้างตัวเลือกไวยากรณ์และความหมายของมัน: ตัวหนา, ตัวหนา, กัด, ตัวหนา, ฯลฯ รวมทั้งกำหนดการเชื่อมต่อความหมายระหว่างคำที่ไม่เป็นที่รู้จักกัน คำพูดสุดท้ายกลายเป็นสิ่งสำคัญมากสำหรับสาขาของ NLP ด้วยการสร้างคำแบบไดนามิกก่อนอื่นมันเป็นโซเชียลมีเดียทุกประเภท
ภายในกรอบของเกณฑ์มาตรฐานรหัสที่จำเป็นทั้งหมดได้ถูกเตรียมไว้เพื่อศึกษาและเปรียบเทียบตัวเลือก NLM ทั้งสองพร้อมกับวิธีอื่น ๆ ในการสร้าง LM-Characte-Aware และ Word-Aware
เราจะทำให้โมเดล Langage ของเราง่ายขึ้นเล็กน้อยการตั้งค่างานในรูปแบบนี้ มี N-GRAM ที่มีความยาวที่เลือกไว้ล่วงหน้า (ดูค่าคงที่ NGRAM_ORDER ในโมดูล DataSetVectorizers) หากได้มาจากเคสข้อความ (เส้นทางไปยังไฟล์ utf-8 ที่ติดอยู่ใน _get_corpus_path คลาส basevectorizer) จากนั้นเราเชื่อว่านี่เป็นการรวมกันของคำและค่าเป้าหมาย y = 1 ถ้า n-gram ได้รับการทดแทนแบบสุ่ม
N-Grams ที่ยอมรับไม่ได้ถูกสร้างขึ้นในระหว่างการวิเคราะห์กรณีในจำนวนเดียวกันกับที่ถูกต้อง ปรากฎว่าชุดข้อมูลที่สมดุลซึ่งอำนวยความสะดวกในการทำงาน และการขาดความจำเป็นในการทำเครื่องหมายด้วยตนเองช่วยให้คุณสามารถ "เล่น" ได้อย่างง่ายดายด้วยพารามิเตอร์ดังกล่าวเป็นจำนวนระเบียนในชุดข้อมูลการฝึกอบรม
ดังนั้นปัญหาการจำแนกประเภทไบนารีได้รับการแก้ไข ตัวจําแนกจะเป็นการดำเนินการของการไล่ระดับสีที่เพิ่ม XGBOOST และเครือข่ายประสาทซึ่งนำไปใช้กับ KERAS รวมถึงตัวเลือกอื่น ๆ อีกมากมายในภาษาการเขียนโปรแกรมที่แตกต่างกันและเฟรมเวิร์ก DL
วัตถุประสงค์ของการศึกษาคืออิทธิพลของวิธีการแสดงคำในเมทริกซ์อินพุต x ต่อความแม่นยำของการจำแนกประเภท
การวิเคราะห์โดยละเอียดเกี่ยวกับวิธีการต่าง ๆ ของ NLP รวมถึงงานที่คล้ายกันสามารถพบได้ในบทความ: ไพรเมอร์บนโมเดลเครือข่ายประสาทสำหรับการประมวลผลภาษาธรรมชาติ
มีการตรวจสอบตัวเลือกต่อไปนี้สำหรับ XGBOOST:
W2V - เราใช้ Core ที่ได้รับการฝึกฝน Word2vec โดยใช้คำพูดของคำเป็นเวกเตอร์ยาวหนึ่งอัน
W2V_TAGS - การขยายตัวของการเป็นตัวแทน W2V, หมวดหมู่เพิ่มเติมของเวกเตอร์สุดท้ายได้มาจากแท็กสัณฐานวิทยาของคำ ปรากฎว่าบางสิ่งบางอย่างเช่นโมเดลภาษาแบบแยกส่วน
SDR - คำที่เป็นตัวแทนกระจายแบบกระจายที่ได้จากการแยกตัวประกอบของโมเดล Word2Vector
Random_bitVector - แต่ละคำมีสาเหตุมาจากเวกเตอร์แบบสุ่มคงที่ - ความยาวด้วยสัดส่วนที่กำหนด 0/1
BC - เวกเตอร์ที่สร้างขึ้นจากการทำงานของการจัดกลุ่มสีน้ำตาล (ดูคำอธิบาย https://en.wikipedia.org/wiki/bron_clustering และการใช้งาน https://github.com/percyliang/brunki)
Chars - แต่ละคำถูกเข้ารหัสเป็นห่วงโซ่ของ 1 -hot การแทนสัญลักษณ์
Hashing_trick - ใช้เคล็ดลับการแฮชเพื่อเข้ารหัสคำที่มีจำนวน จำกัด ของดัชนีจำนวน จำกัด (ดูคำอธิบาย https://en.wikipedia.org/wiki/feature_hashing และการใช้งาน https://radimrehurek.com/gensim/corpora/hashdictionary.html)
AE - คำของคำนั้นได้รับการเปิดใช้งานบนชั้นด้านในของ AutoEncoder การฝึกอบรมใน AutoEncoder และการได้รับคำพูดของเวกเตอร์จะดำเนินการโดยสคริปต์ Word_autoencoder3.py ในโฟลเดอร์ Pymodels/Wordautoencoders
มีวิธีการนำเสนอเพิ่มเติมสองวิธีสำหรับเครือข่ายประสาทซึ่งจะถูกแปลงเป็นตัวแทนเวกเตอร์บางอย่างโดยใช้เลเยอร์ฝัง (หรือคล้ายกับไลบรารีที่ใช้แล้ว
Word_indeces - คำศัพท์ถูกรวบรวมแต่ละคำจะถูกกำหนดดัชนีจำนวนเต็มที่ไม่ซ้ำกัน ดังนั้น 3 เกรดดูเหมือนจะเป็นจำนวนเต็มสามเท่า
Char_indeces - ตัวอักษรถูกรวบรวมแต่ละสัญลักษณ์จะถูกกำหนดดัชนีจำนวนเต็มที่ไม่ซ้ำกัน นอกจากนี้โซ่ของดัชนีสัญลักษณ์จะเสริมด้วยดัชนีตัวอย่างให้มีความยาวเท่ากัน (ความยาวสูงสุดของคำ) และห่วงโซ่ที่ได้ของดัชนีสัญลักษณ์จะถูกส่งกลับเป็นการนำเสนอของ N-Gram การใช้เลเยอร์ของการฝัง (ฝังใน keras หรือคล้ายกัน) สัญลักษณ์จะถูกแปลงเป็นรูปแบบเวกเตอร์หนาแน่นซึ่งส่วนที่เหลือของเครือข่ายประสาททำงาน ปรากฎว่ารุ่นของรูปแบบภาษาประสาทที่รู้ตัวเป็นตัวละคร
ในการแก้ปัญหามีการใช้ห้องสมุดต่าง ๆ ของการเรียนรู้ของเครื่อง, เครือข่ายประสาทและห้องสมุดสำหรับการคำนวณเมทริกซ์รวมถึง:
Keras (พร้อมแบ็กเอนด์ Theano)
Lasagne (Theano)
Nolearn (Theano)
เทนเซอร์โฟลว์
Python Solutions:
pymodels/wr_xgboost.py - Resolver บนพื้นฐานของ xgboost
Pymodels/WR_CATBOOST.PY - CATBOOST RONDERVER เกี่ยวกับดัชนีคำโดยใช้ความสามารถในการระบุดัชนีของคุณสมบัติหมวดหมู่ในชุดข้อมูลเพื่อให้ Booster เรียนรู้ได้อย่างอิสระในระหว่างการฝึกอบรม
pymodels/wr_keras.py - ตัวแก้ไขบนพื้นฐานของ neurosettes ไปข้างหน้าฟีดที่ใช้กับ keras
Pymodels/WR_KERAS_SDR2.py - โซลูชันแยกต่างหากสำหรับการตรวจสอบการกระจายแบบกระจายของมิติขนาดใหญ่ (จาก 1024) ด้วยการสร้างเมทริกซ์แบบแยกส่วนสำหรับการเรียนรู้และการตรวจสอบความถูกต้องบน Keras Pymodels/WR_LASAGNE.PY - ตัวแก้ไขบนพื้นฐานของ Neurosettes Feed Forward ที่ใช้กับ Lasagne (Theano)
pymodels/wr_nolearn.py - ตัวแก้ไขตาม neurosettes feed forward ที่นำไปใช้กับ Nolearn+Lasagne (Theano)
pymodels/wr_tensorflow.py - ตัวแก้ปัญหาตาม neurosettes ไปข้างหน้าของเฟดที่ใช้กับ tensorflow
วิธีแก้ปัญหาเกี่ยวกับ C#:
csharpmodels/withaccordnet/program.cs - ตัวแก้ไขตาม Feed Forward Grids Accord.net (C#, โครงการสำหรับ VS 2015)
CSHARPMODELS/MYBASELINE/PROGRAM.CS - โซลูชันตามการใช้งานของฉัน Vanilla MLP (C#, โครงการสำหรับ VS 2015)
โซลูชันเกี่ยวกับ C ++:
cxxmodels/tinydnn_model/tinydn_model.cpp - ความละเอียด MLP ดำเนินการโดย Tiny -DNN Library (C ++, โครงการสำหรับ VS 2015)
CXXMODELS/SINGA_MODEL/ALEXNET.CC - ตัวแก้ไขบนพื้นฐานของเครือข่ายประสาทที่ใช้โดย Apache.singa (C ++, โครงการสำหรับ VS 2015)
CXXMODELS/OPENNN_MODEL/MAIN.CPP - ตัวแก้ไขที่ใช้ Neuroset ดำเนินการโดย OpenNN (C ++, โครงการสำหรับ VS 2015)
โซลูชั่นเกี่ยวกับ Java Javamodels/With4J/Src/Main/Java/WordRepresentationstest.java - MLP Resolver ดำเนินการโดย DeepleArning4J Library
ชั้นเรียนและเครื่องมือภายใน:
pymodels/corpusreaders.py - คลาสสำหรับการอ่านบรรทัดจากอาคารข้อความของรูปแบบที่แตกต่างกัน (ซิป | txt ธรรมดา) pymodels/dataSetVectorizers.py - ชุดข้อมูล vectorizers และโรงงานสำหรับตัวเลือกที่สะดวกสบาย
pymodels/store_dataset_file.py - การสร้างชุดข้อมูลและการเก็บรักษาสำหรับรุ่น C# และ C ++
สำหรับเครือข่ายประสาทมีสถาปนิก 2 คนถูกนำไปใช้บนพื้นฐานของ Keras MLP เป็นฟีดที่เรียบง่ายไปข้างหน้า Nefete ที่มีเลเยอร์เต็มรูปแบบ Convnet เป็นตาข่ายที่ใช้เลเยอร์มัด
การสลับสถาปัตยกรรมดำเนินการโดย Net_Arch ในพารามิเตอร์ Net_ARCH ในไฟล์ wr_keras.py
สามารถสังเกตได้ว่าตัวเลือก Bristly มักจะให้วิธีการแก้ปัญหาที่แม่นยำยิ่งขึ้น แต่รุ่นที่สอดคล้องกันมีตัวแปรที่ใหญ่กว่าเพียงแค่ใส่ - ความแม่นยำสุดท้ายกระโดดอย่างมากสำหรับหลายรุ่นที่มีพารามิเตอร์เดียวกัน
คำอธิบายโดยละเอียดเกี่ยวกับสถาปัตยกรรมและผลลัพธ์เชิงตัวเลขของการทดลองสามารถพบได้ที่นี่: https://kelijah.livejournal.com/224925.html
ตัวเลือกมาตรฐานทั้งหมดใช้ไฟล์ข้อความในการเข้ารหัส UTF-8 เพื่อรับรายการ N-Gram สันนิษฐานว่าการแบ่งข้อความเป็นคำพูดและนำไปสู่การลงทะเบียนที่ต่ำกว่าจะทำล่วงหน้าด้วยรหัสที่สาม ดังนั้นสคริปต์อ่านบรรทัดจากไฟล์นี้แบ่งออกเป็นคำตามช่องว่าง
เพื่อความสะดวกในการเล่นการทดลองฉันได้ทำการเปิดรับการบีบอัดของเคสขนาดใหญ่ที่มีขนาด 100,000 บรรทัดในโฟลเดอร์ข้อมูล นี่ก็เพียงพอที่จะทำซ้ำการวัดทั้งหมด เพื่อไม่ให้โอเวอร์โหลดที่เก็บด้วยไฟล์ขนาดใหญ่มันถูกสับ เมธอด basevectorizer._load_ngrams เองก็แกะเนื้อหาของมันออกมาทันทีดังนั้นคุณไม่จำเป็นต้องทำการจัดการด้วยตนเองใด ๆ
ในตัวแปรของ vectorization ของ w2v_tags คุณสมบัติทางสัณฐานวิทยาจะถูกเพิ่มเข้าไปในหลอดเลือดดำ W2V สัญญาณเหล่านี้สำหรับแต่ละคำนั้นนำมาจากไฟล์ Word2Tags_bin.zip ในข้อมูลย่อยข้อมูลซึ่งได้มาจากการแปลงพจนานุกรมไวยากรณ์ของฉัน (http://solarix.ru/sql-dictionary-sdk.shtml) ผลลัพธ์ของการแปลงถูกดึงไปที่ 165 MB ซึ่งค่อนข้างมากเกินไปสำหรับที่เก็บ GIT ดังนั้นฉันจึงตะโกนไฟล์ผลลัพธ์ของพจนานุกรมไวยากรณ์และคลาสที่สอดคล้องกันของการทำให้เป็นเวกเตอร์ของชุดข้อมูลที่เปิดออกทันทีในระหว่างการดำเนินการ
โปรดทราบว่าเนื่องจากรูปแบบไวยากรณ์ homonymy คำหลายคำมีแท็กมากกว่าหนึ่งชุด ตัวอย่างเช่นคำว่า 'Bears' อาจเป็นรูปแบบของพหูพจน์เดียวหรือพหูพจน์ตามลำดับในกรณีสัมพันธการกหรือการเสนอชื่อ เมื่อสร้างแท็กสำหรับคำศัพท์ฉันรวมแท็ก homonyms
ใช้กระบวนการสองขั้นตอน ก่อนอื่นเราจะได้รับเวกเตอร์ W2V สคริปต์ขนาดเล็กบน Python จะยกเลิกการโหลดเวกเตอร์ลงในไฟล์ข้อความในรูปแบบ CSV
จากนั้นใช้ยูทิลิตี้ https://github.com/mfaruqui/sparse-coding คำสั่งจะดำเนินการ:
./nonneg.o input_vectors.txt 16 0.2 1e-5 4 out_vecs.txt
ไฟล์ out_vecs.txt ที่มีคำ SDR ที่มีพารามิเตอร์ที่ระบุถูกสร้างขึ้น: size = 16*เวกเตอร์ W2V, การเติม = 0.2 ไฟล์นี้โหลดด้วยคลาส SDR_Vectorizer
https://habrahabr.ru/post/335838/
http://kelijah.livejournal.com/217608.html
เพื่อตรวจสอบเราใช้การท่องจำของ N-GRAMs จากชุดการฝึกอบรมและการค้นหาระหว่าง N-GRAM ที่จำได้สำหรับชุดทดสอบ ขนาดเล็กของชุดการฝึกอบรมนำไปสู่ความจริงที่ว่าในชุดทดสอบโมเดลนั้นทำงานได้อย่างง่ายดายในฐานะผู้คาดเดาแบบสุ่มให้ความแม่นยำ 0.50
ตารางหลักของผลลัพธ์มีอยู่ในลิงค์ ส่วนที่เหลือของผลลัพธ์ต่อไปนี้ได้รับชุด 1.000,000 3 กรัม
สำหรับตัวแก้ไขบนพื้นฐานของ XGBOOST (WR_XGBOOST.PY) ได้รับผลลัพธ์ต่อไปนี้
สำหรับชุดข้อมูลที่มี 1.000,000 trigrams: w2v_tags (Word2Vector + morph tags) ==> 0.81
W2V (Word2Vector dim = 32) ==> 0.80
SDR (การกระจายแบบเบาบาง, ความยาว 512, 20% หน่วย) ==> 0.78 BC (การจัดกลุ่มสีน้ำตาล) ==> 0.70
Chars (Char one-hot encoding) ==> 0.71
Random_bitVector (เวกเตอร์บิตสุ่ม, ส่วนแบ่งของหน่วย 16%) ==> 0.696
Hashing_trick (เคล็ดลับการแฮชด้วย 32,000 สล็อต) ==> 0.64
สำหรับนักแก้ปัญหาตาม Lasagne MLP:
ความแม่นยำ = 0.71
สำหรับตัวแก้ปัญหาตาม Nolearn+Lasagne MLP:
ความแม่นยำ = 0.64
สำหรับตัวแก้ไขตาม Tiny-DNN MLP:
ความแม่นยำ = 0.58
สำหรับตัวแก้ปัญหาตาม Accord.net Feed Forward Neural Net:
Word2Vector ==> 0.68
สำหรับความละเอียด catboost เกี่ยวกับลักษณะหมวดหมู่ของ "ดัชนีคำ":
ความแม่นยำ = 0.50
สำหรับตัวแก้ปัญหาตาม Apache.singa MLP:
ความแม่นยำ = 0.74
โซลูชันพื้นฐาน - การจดจำ n -grams จากชุดข้อมูลการฝึกอบรม
ความแม่นยำ = 0.50