DeepMorphy هو محلل مورفولوجي يعتمد على الشبكة العصبية للغة الروسية.
DeepMorphy هو محلل صرفي للغة الروسية. متوفر كمكتبة .Net Standard 2.0. يستطيع:
المصطلحات في DeepMorphy مستعارة جزئيًا من المحلل المورفولوجي pymorphy2.
Grammeme (قواعد اللغة الإنجليزية) - معنى إحدى الفئات النحوية للكلمة (على سبيل المثال، الزمن الماضي، المفرد، المذكر).
الفئة النحوية عبارة عن مجموعة من القواعد النحوية المتعارضة التي تميز بعض السمات المشتركة (على سبيل المثال، الجنس، والزمن، والحالة، وما إلى ذلك). توجد هنا قائمة بجميع الفئات والقواعد المدعومة في DeepMorphy.
علامة (علامة إنجليزية) - مجموعة من القواعد النحوية التي تميز كلمة معينة (على سبيل المثال، علامة لكلمة القنفذ - اسم، مفرد، حالة اسمية، مذكر).
Lemma (الإنجليزية lemma) هو الشكل الطبيعي للكلمة.
Lemmatization (eng. lemmatization) - إعادة الكلمة إلى شكلها الطبيعي.
المعجم هو مجموعة من جميع أشكال كلمة واحدة.
العنصر الأساسي في DeepMorphy هو الشبكة العصبية. بالنسبة لمعظم الكلمات، يتم إجراء التحليل الصرفي والترجمة بواسطة الشبكة. تتم معالجة بعض أنواع الكلمات بواسطة المعالجات المسبقة.
هناك 3 معالجات مسبقة:
تم بناء الشبكة وتدريبها على إطار عمل Tensorflow. يعمل قاموس Opencorpora كمجموعة بيانات. مدمج في .Net عبر TensorFlowSharp.
يتكون الرسم البياني الحسابي لتحليل الكلمات في DeepMorphy من 11 "شبكة فرعية":
تم حل مشكلة تغيير شكل الكلمات عن طريق شبكة 1seq2seq.
يتم التدريب بالتسلسل، أولاً يتم تدريب الشبكات حسب الفئة (لا يهم الترتيب). بعد ذلك، يتم تدريب التصنيف الرئيسي حسب العلامات والترجمة وشبكة لتغيير شكل الكلمات. تم إجراء التدريب على 3 وحدات معالجة رسوميات Titan X ويمكن الاطلاع هنا على مجموعة بيانات الاختبار.
DeepMorphy for .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 ) ;
يمكن الحصول على Lemmas من علامات الكلمات:
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 ) ;
}
إذا كنت تحتاج فقط إلى lemmatization دون التحليل الصرفي، فأنت بحاجة إلى استخدام طريقة 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 ( ) ) ;