فهرست مستندات پروژه
یکسانسازی، توکنسازی و برجستهسازی
مسیر پردازش متن را دنبال کنید و محتوای اصلی را برای نمایش نگه دارید.
برای عبارتهای جستجو از analyze() و برای توکنهای یکسانشده همراه با محدوده متن اصلی از tokens() استفاده کنید. برای برجستهسازی، دنبال رشته بن واژه در متن اصلی نگردید.
import { normalize, createAnalyzer } from "fa-search-kit";
console.log(JSON.stringify(normalize("كتاب ۳۰ ٣٠ iPhone").text)); // => "کتاب 30 30 iphone"
console.log(JSON.stringify(normalize("آب رئیس").text)); // => "آب رئیس"
console.log(JSON.stringify(normalize("آب رئیس", { hamzaYeh: true }).text)); // => "آب رییس"
const original = "كتابهاي جديد، مي روم";
const tokens = createAnalyzer().tokens(original);
console.log(JSON.stringify(tokens.map(t => [t.text, original.slice(t.start, t.end)]))); // => [["کتابهای","كتابهاي"],["جدید","جديد"],["میروم","مي روم"]]
یکسانسازی چه چیزهایی را تغییر میدهد؟
ی عربی و الف مقصوره به ی فارسی و شکلهای پشتیبانیشده کاف عربی به ک تبدیل میشوند. چند شکل ه به ه فارسی تبدیل میشود. الف همزهدار و الف وصله به ا و واو همزهدار به و تبدیل میشوند. رقمهای فارسی و عربی هر دو به رقم ASCII تبدیل میشوند. حروف بزرگ رایج لاتین نیز کوچک میشوند.
شکلهای نمایشی حروف عربی با NFKC و به صورت نویسهبهنویسه باز میشوند. نشانههای اعراب، کشیده، ZWJ، برخی کنترلهای جهت متن و BOM حذف میشوند. تکرار سهتایی یا بیشتر یک حرف در خط عربی به یک حرف کاهش مییابد؛ تکرار دوتایی باقی میماند. این کار ممکن است تفاوت املایی عمدی را هم از بین ببرد.
چند نیمفاصله پیاپی میان حروف به یک نیمفاصله تبدیل میشوند و نیمفاصله ابتدای یا انتهای واژه حذف میشود. فاصله نامرئی و ¬ میان حروف نیز نیمفاصله در نظر گرفته میشوند؛ بیرون از حروف، ¬ باقی میماند. فاصلههای معمولی و نشانهگذاری در کل متن یکسانشده حذف یا فشرده نمیشوند.
تابع مستقل normalize() حرف ئ را نگه میدارد، مگر اینکه hamzaYeh: true بدهید. مقدار پیشفرض این گزینه در createAnalyzer() برابر true است. یکسانسازی آ را حفظ میکند؛ تحلیلگر با گزینه alefMadda میتواند شکل بدون کلاه را جداگانه به نمایه اضافه کند.
توکنها و اتصال بخشها
توکنها از حروف یونیکد، رقمها، نشانههای ترکیبی و نیمفاصله داخلی ساخته میشوند. نشانهگذاری توکنها را جدا میکند. با rejoin: true، پیشوندها و پسوندهای شناختهشده مانند «می روم» و «کتاب ها» به هم میپیوندند. برخی پایانها فقط پس از حرف مصوت میچسبند؛ «نامه ای» متصل میشود اما «ای خدا» جدا میماند. اتصال از نشانهگذاری یا پایان خط عبور نمیکند و هر نوع جدانویسی را اصلاح نمیکند.
خروجی tokens() متن یکسانشده و بدون بنیابی است. analyze() پروفایل انتخابشده را اعمال میکند و نیمفاصله را از عبارت نهایی برمیدارد. خروجی ممکن است عبارت تکراری یا شکلهای مخصوص نمایه داشته باشد؛ نمایهسازی را ببینید.
برجستهسازی متن اصلی
قرار است Token.start و Token.end موقعیت UTF-16 در ورودی باشند و end اولین موقعیت بیرون محدوده باشد. برش را روی متن اصلی انجام دهید. محدوده توکن متصلشده، فاصلههای اصلی را هم شامل میشود. باز شدن یک شکل نمایشی ممکن است چند توکن با محدوده یکسان بسازد؛ در نمایشگر سفارشی محدودههای همپوشان را ادغام کنید.
تابع کمکی Pagefind چکیده HTML را با متن escapeشده و عنصر mark میسازد:
import { faPagefind } from "fa-search-kit/pagefind";
console.log(JSON.stringify(faPagefind().excerpt("كتابهاي قديمي", "کتاب"))); // => "<mark>كتابهاي</mark> قديمي"
خروجی این تابع را از مسیر مناسب نمایش محتوای مورد اعتماد وارد کنید؛ پیامهای حاوی عبارت کاربر را با گره متنی نمایش دهید. تابع از تطبیق پیشوند با شکل ظاهری توکن و عبارتهای نمایه استفاده میکند و بازسازی دقیق رتبهبندی یا منطق تطبیق همه موتورها نیست.
اشکال شناختهشده موقعیتها
نگاشت فعلی، نویسههای خارج از محدوده پایه یونیکد مانند ایموجی را متفاوت از موقعیتهای عبارت منظم جاوااسکریپت میشمارد. برای "😀 کتاب"، تابع tokens() اکنون start توکن فارسی را 4 و end را undefined میدهد، در حالی که مقدار درست 3 و 7 است. در این نمونه متن توکن و عبارت پردازششده درست است، اما برجستهسازی متن اصلی قابل اتکا نیست. روش بازتولید و مسیر جایگزین را ببینید. تا رفع این اشکال، برجستهسازی درست برای همه متنهای یونیکد را تضمین نکنید.