DeepMorphy คือเครื่องวิเคราะห์ทางสัณฐานวิทยาที่ใช้โครงข่ายประสาทเทียมสำหรับภาษารัสเซีย
DeepMorphy เป็นตัววิเคราะห์ทางสัณฐานวิทยาสำหรับภาษารัสเซีย พร้อมใช้งานในรูปแบบไลบรารี .Net Standard 2.0 สามารถ:
คำศัพท์เฉพาะทางใน DeepMorphy ยืมมาจากเครื่องวิเคราะห์ทางสัณฐานวิทยาของ pymorphy2
Grammeme (ไวยากรณ์ภาษาอังกฤษ) - ความหมายของหนึ่งในหมวดหมู่ไวยากรณ์ของคำ (เช่น อดีตกาล เอกพจน์ ผู้ชาย)
หมวดหมู่ไวยากรณ์ คือชุดของไวยากรณ์ที่ไม่เกิดร่วมกันซึ่งแสดงคุณลักษณะบางอย่างที่เหมือนกัน (เช่น เพศ กาล กรณี ฯลฯ) รายการหมวดหมู่และไวยากรณ์ทั้งหมดที่รองรับใน DeepMorphy อยู่ที่นี่
แท็ก (แท็กภาษาอังกฤษ) - ชุดของไวยากรณ์ที่แสดงลักษณะของคำที่กำหนด (เช่นแท็กสำหรับคำว่าเม่น - คำนาม, เอกพจน์, กรณีนาม, เพศชาย)
เล็มมา (บทแทรกภาษาอังกฤษ) เป็นรูปแบบปกติของคำ
การย่อคำ (อังกฤษ การย่อคำ) - นำคำมาสู่รูปแบบปกติ
ศัพท์ คือชุดของคำเดียวทุกรูปแบบ
องค์ประกอบหลักของ DeepMorphy คือโครงข่ายประสาทเทียม สำหรับคำส่วนใหญ่ การวิเคราะห์ทางสัณฐานวิทยาและการย่อคำจะดำเนินการโดยเครือข่าย คำบางประเภทได้รับการประมวลผลโดยผู้ประมวลผลล่วงหน้า
มีโปรเซสเซอร์ล่วงหน้า 3 ตัว:
เครือข่ายถูกสร้างขึ้นและฝึกอบรมเกี่ยวกับเฟรมเวิร์กเทนเซอร์โฟลว์ พจนานุกรม Opencorpora ทำหน้าที่เป็นชุดข้อมูล รวมเข้ากับ .Net ผ่าน TensorFlowSharp
กราฟการคำนวณสำหรับการแยกคำใน DeepMorphy ประกอบด้วย 11 “ซับเน็ต”:
ปัญหาการเปลี่ยนรูปแบบของคำได้รับการแก้ไขโดยเครือข่าย 1 seq2seq
การฝึกอบรมจะดำเนินการตามลำดับ อันดับแรกเครือข่ายจะได้รับการฝึกอบรมตามหมวดหมู่ (ลำดับไม่สำคัญ) ถัดไปมีการฝึกอบรมการจำแนกประเภทหลักตามแท็กการย่อและเครือข่ายสำหรับการเปลี่ยนรูปแบบของคำ การฝึกอบรมดำเนินการกับ Titan X GPU 3 ตัว คุณสามารถดูเมตริกประสิทธิภาพเครือข่ายในชุดข้อมูลทดสอบสำหรับรุ่นล่าสุดได้ที่นี่
DeepMorphy สำหรับ .NET คือไลบรารี .Net Standard 2.0 การขึ้นต่อกันเพียงอย่างเดียวคือไลบรารี TensorflowSharp (โครงข่ายประสาทเทียมถูกเปิดใช้งานผ่านมัน)
ไลบรารีนี้เผยแพร่ใน Nuget ดังนั้นจึงง่ายที่สุดในการติดตั้งผ่านไลบรารี
หากมีตัวจัดการแพ็คเกจ:
Install-Package DeepMorphy
หากโครงการรองรับ PackageReference:
<PackageReference Include="DeepMorphy"/>
หากใครต้องการสร้างจากแหล่งที่มา แหล่งที่มา C# ก็อยู่ที่นี่ Rider ใช้สำหรับการพัฒนา (ทุกอย่างควรประกอบในสตูดิโอโดยไม่มีปัญหาใดๆ)
การดำเนินการทั้งหมดดำเนินการผ่านอ็อบเจ็กต์คลาส MorphAnalyzer:
var morph = new MorphAnalyzer ( ) ;
ตามหลักการแล้ว ควรใช้เป็นซิงเกิลตันเมื่อสร้างออบเจ็กต์ จะใช้เวลาสักครู่ในการโหลดพจนานุกรมและเครือข่าย ด้ายปลอดภัย เมื่อสร้าง คุณสามารถส่งพารามิเตอร์ต่อไปนี้ไปยังตัวสร้าง:
สำหรับการแยกวิเคราะห์ จะใช้วิธีแยกวิเคราะห์ (ใช้ IEnumerable พร้อมคำสำหรับการวิเคราะห์เป็นอินพุต ส่งคืน IEnumerable พร้อมผลลัพธ์ของการวิเคราะห์)
var results = morph . Parse ( new string [ ]
{
"королёвские" ,
"тысячу" ,
"миллионных" ,
"красотка" ,
"1-ый"
} ) . ToArray ( ) ;
var morphInfo = results [ 0 ] ;
รายการหมวดหมู่ไวยากรณ์ ไวยากรณ์ และคีย์ที่รองรับอยู่ที่นี่ หากคุณต้องการค้นหาชุดค่าผสมของไวยากรณ์ (แท็ก) ที่น่าจะเป็นไปได้มากที่สุด คุณจะต้องใช้คุณสมบัติ BestTag ของออบเจ็กต์ MorphInfo
// выводим лучшую комбинацию граммем для слова
Console . WriteLine ( morphInfo . BestTag ) ;
จากคำนั้นเอง ไม่สามารถระบุความหมายของหมวดหมู่ไวยากรณ์ได้อย่างชัดเจนเสมอไป (ดูคำพ้องความหมาย) ดังนั้น DeepMorphy จึงช่วยให้คุณดูแท็กยอดนิยมของคำที่กำหนดได้ (คุณสมบัติแท็ก)
// выводим все теги для слова + их вероятность
foreach ( var tag in morphInfo . Tags )
Console . WriteLine ( $ " { tag } : { tag . Power } " ) ;
มีการผสมผสานของไวยากรณ์ในแท็กใดๆ หรือไม่:
// есть ли в каком-нибудь из тегов прилагательные единственного числа
morphInfo . HasCombination ( "прил" , "ед" ) ;
มีส่วนผสมของกรัมในแท็กที่มีแนวโน้มมากที่สุดหรือไม่:
// ясляется ли лучший тег прилагательным единственного числа
morphInfo . BestTag . Has ( "прил" , "ед" ) ;
การดึงหมวดหมู่ไวยากรณ์เฉพาะจากแท็กที่ดีที่สุด:
// выводит часть речи лучшего тега и число
Console . WriteLine ( morphInfo . BestTag [ "чр" ] ) ;
Console . WriteLine ( morphInfo . BestTag [ "число" ] ) ;
แท็กจะใช้เมื่อคุณต้องการข้อมูลเกี่ยวกับหมวดหมู่ไวยากรณ์หลายประเภทพร้อมกัน (เช่น ส่วนของคำพูดและตัวเลข) หากคุณสนใจเพียงหมวดหมู่เดียว คุณสามารถใช้อินเทอร์เฟซความน่าจะเป็นของหมวดหมู่ไวยากรณ์ออบเจ็กต์ MorphInfo ได้
// выводит самую вероятную часть речи
Console . WriteLine ( morphInfo [ "чр" ] . BestGramKey ) ;
คุณยังสามารถรับการแจกแจงความน่าจะเป็นตามหมวดหมู่ไวยากรณ์ได้:
// выводит распределение вероятностей для падежа
foreach ( var gram in morphInfo [ "падеж" ] . Grams )
{
Console . WriteLine ( $ " { gram . Key } : { gram . Power } " ) ;
}
หากคุณจำเป็นต้องได้รับบทแทรกของคำร่วมกับการวิเคราะห์ทางสัณฐานวิทยา คุณจะต้องสร้างตัววิเคราะห์ดังนี้:
var morph = new MorphAnalyzer ( withLemmatization : true ) ;
บทแทรกสามารถหาได้จากแท็กคำ:
Console . WriteLine ( morphInfo . BestTag . Lemma ) ;
ตรวจสอบว่าคำที่กำหนดมีบทแทรกหรือไม่:
morphInfo . HasLemma ( "королевский" ) ;
เมธอด CanBeSameLexeme สามารถใช้ค้นหาคำของคำศัพท์เดียว:
// выводим все слова, которые могут быть формой слова королевский
var words = new string [ ]
{
"королевский" ,
"королевские" ,
"корабли" ,
"пересказывают" ,
"королевского"
} ;
var results = morph . Parse ( words ) . ToArray ( ) ;
var mainWord = results [ 0 ] ;
foreach ( var morphInfo in results )
{
if ( mainWord . CanBeSameLexeme ( morphInfo ) )
Console . WriteLine ( morphInfo . Text ) ;
}
หากคุณต้องการเพียงการย่อคำโดยไม่มีการแยกวิเคราะห์ทางสัณฐานวิทยา คุณจำเป็นต้องใช้วิธี Lemmatize:
var tasks = new [ ]
{
new LemTask ( "синяя" , morph . TagHelper . CreateTag ( "прил" , gndr : "жен" , nmbr : "ед" , @case : "им" ) ) ,
new LemTask ( "гуляя" , morph . TagHelper . CreateTag ( "деепр" , tens : "наст" ) )
} ;
var lemmas = morph . Lemmatize ( tasks ) . ToArray ( ) ;
foreach ( var lemma in lemmas )
Console . WriteLine ( lemma ) ;
DeepMorphy สามารถเปลี่ยนรูปแบบของคำภายในคำศัพท์ได้ รายการคำผันที่รองรับอยู่ที่นี่ คำในพจนานุกรมสามารถเปลี่ยนแปลงได้เฉพาะในรูปแบบที่มีอยู่ในพจนานุกรมเท่านั้น ในการเปลี่ยนรูปแบบของคำ จะใช้วิธี Inflect โดยจะใช้เป็นอินพุตในการแจงนับของออบเจ็กต์ InflectTask (ประกอบด้วยคำต้นฉบับ แท็กของคำต้นฉบับ และแท็กที่ควรวางคำนั้น) ผลลัพธ์เป็นการแจงนับที่มีแบบฟอร์มที่ต้องการ (หากไม่สามารถประมวลผลแบบฟอร์มได้ ก็จะเป็นโมฆะ)
var tasks = new [ ]
{
new InflectTask ( "синяя" ,
morph . TagHelper . CreateTag ( "прил" , gndr : "жен" , nmbr : "ед" , @case : "им" ) ,
morph . TagHelper . CreateTag ( "прил" , gndr : "муж" , nmbr : "ед" , @case : "им" ) ) ,
new InflectTask ( "гулять" ,
morph . TagHelper . CreateTag ( "инф_гл" ) ,
morph . TagHelper . CreateTag ( "деепр" , tens : "наст" ) )
} ;
var results = morph . Inflect ( tasks ) ;
foreach ( var result in results )
Console . WriteLine ( result ) ;
นอกจากนี้ยังสามารถรับรูปแบบทั้งหมดของคำโดยใช้วิธี Lexeme ได้ (สำหรับคำในพจนานุกรมจะส่งกลับทุกอย่างจากพจนานุกรม สำหรับรูปแบบอื่นๆ ทั้งหมดจากการผันคำที่รองรับ)
var word = "лемматизировать" ;
var tag = m . TagHelper . CreateTag ( "инф_гл" ) ;
var results = m . Lexeme ( word , tag ) . ToArray ( ) ;
คุณลักษณะอย่างหนึ่งของอัลกอริทึมคือเมื่อเปลี่ยนรูปแบบหรือสร้างคำศัพท์ เครือข่ายสามารถ "ประดิษฐ์" รูปแบบของคำที่ไม่มีอยู่จริง (เชิงสมมุติ) ซึ่งเป็นรูปแบบที่ไม่ได้ใช้ในภาษา ตัวอย่างเช่น ด้านล่างคุณจะพบคำว่า "ฉันจะวิ่ง" แม้ว่าในปัจจุบันจะไม่ค่อยมีการใช้ในภาษานี้โดยเฉพาะก็ตาม
var tasks = new [ ]
{
new InflectTask ( "победить" ,
m . TagHelper . CreateTag ( "инф_гл" ) ,
m . TagHelper . CreateTag ( "гл" , nmbr : "ед" , tens : "буд" , pers : "1л" , mood : "изъяв" ) )
} ;
Console . WriteLine ( m . Inflect ( tasks ) . First ( ) ) ;