یکسان‌سازی نویسه‌های رشته‌های فارسی

یکی از مشکلات زبان فارسی وجود چند نمونه‌ی مختلف از یک نویسه است، که کار جستجو در متون فارسی را مشکل می‌کند. به منظور اصلاح نویسه‌های فارسی و تبدیل آن‌ها به قالب استاندارد توابعی در کتابخانه‌ی Persian Tools گنجانده شده است.

وابستگی‌ها

SCICT.PersianTools.dll

مثال

برنامه‌ی زیر چگونگی اصلاح نویسه‌های یک رشته را نمایش می‌دهد. رشته‌ی ورودی شامل نویسه‌های اعراب و نویسه‌ی حروف غیر استاندارد است. در خروجی همه‌ی نویسه‌های اعراب به غیر از تنوین نصب حذف می‌شود. نویسه‌های غیر استاندارد با معادل استانداردشان جای‌گزین می‌شوند. علّت حذف نشدن تنوین نصب اینست که حذف کردن آن ممکن است کلمه‌ای با املای نادرست تولید کند. هم‌چنین نویسه‌های نیم‌فاصله که نابجا مورد استفاده قرار گرفته‌اند حذف می‌شوند، مانند نیم‌فاصله بعد از حروف غیرچسبان مثل «ر» و «د».

Refining Persian String
 1
 2
 3
string str = "اَلبتّه کــــامِلاً ي ك";
string result = SCICT.NLP.Utility.StringUtil.RefineAndFilterPersianWord(str);
// result: "البته کاملاً ی ک"

فراخوانی تابع بالا، مانند فراخواندن دو تابع RefinePersianWord و FilterPersianWord به توالی بر روی رشته‌ی ورودی است:

RefinePersianWord and FilterPersianWord
 1
 2
SCICT.NLP.Utility.StringUtil.RefinePersianWord(
    SCICT.NLP.Utility.StringUtil.FilterPersianWord(str));

تابع RefinePersianWord اعراب و نویسه‌های فاصله یا نیم‌فاصله‌ی اضافی را حذف می‌کند، و تابع FilterPersianWord نویسه‌های غیراستاندارد را با نویسه‌های استاندارد جایگزین می‌کند. تابع FilterPersianWord گزینه‌های بیشتری در اختیار برنامه‌نویس قرار می‌دهد. مثلاً برنامه‌نویس می‌تواند یک یا چند رده از اصلاحات را انجام ندهد. مثلاً برنامه‌ی زیر ارقام عربی و حرف کاف غیر استاندارد را اصلاح نمی‌کند:

RefinePersianWord and FilterPersianWord
 1
 2
 3
SCICT.NLP.Utility.StringUtil.RefinePersianWord(
    SCICT.NLP.Utility.StringUtil.FilterPersianWord(str, 
        FilteringCharacterCategory.Kaaf | FilteringCharacterCategory.ArabicDigit));

هم‌چنین می‌توان حروف خاصّی معیّن کرد که زمان اصلاح نادیده گرفته شوند. این حروف را می‌توان داخل یک HashSet به تابع ارسال کرد. برنامه‌ی زیر یک نوع نویسه‌ی «ي» را اصلاح نمی‌کند:

RefinePersianWord and FilterPersianWord
 1
 2
 3
SCICT.NLP.Utility.StringUtil.RefinePersianWord(
    SCICT.NLP.Utility.StringUtil.FilterPersianWord(str, 
        new HashSet<char>() {'ي'}));

هم‌چنین می‌توان از دو حالت استفاده کرد. مثلاً برنامه‌ی زیر همه‌ی انواع نویسه‌ی کاف و تنها یک نوع خاص نویسه‌ی «ي» را اصلاح نمی‌کند:

RefinePersianWord and FilterPersianWord
 1
 2
 3
SCICT.NLP.Utility.StringUtil.RefinePersianWord(
    SCICT.NLP.Utility.StringUtil.FilterPersianWord(str, 
        new HashSet<char>() {'ي'}, FilteringCharacterCategory.Kaaf));