Back to blog
چت‌بات و پردازش زبان

چرا چت‌بات فارسی شما جواب اشتباه می‌دهد

نیم‌فاصله، ی عربی و ارقام فارسی یک واژه را به چند رشتهٔ متفاوت تبدیل می‌کنند و چت‌بات را کر می‌کنند. مکانیزم دقیق این خطا و ترتیب درست یکدست‌سازی متن فارسی.

تیم قطره۱۴ شهریور ۱۴۰۵6 min read
چرا چت‌بات فارسی شما جواب اشتباه می‌دهد

وقتی چت‌بات فارسی یک شرکت به نیمی از پرسش‌ها «متوجه نشدم» می‌گوید، اولین فرضیهٔ همه این است که دانشش کم است. معمولاً نیست. مشکل جای دیگری است: برنامه یک کلمه را چند رشتهٔ متفاوت می‌بیند.

پاسخ کوتاه

در فارسی، یک واژه می‌تواند به چند شکل نوشته شود که برای خواننده یکسان‌اند و برای رایانه کاملاً متفاوت. «چت‌بات» با نیم‌فاصله و «چت بات» با فاصلهٔ معمولی دو رشتهٔ بی‌ربط‌اند. تا وقتی متن پیش از مقایسه یکدست نشود، هر سامانهٔ جست‌وجو یا پاسخ‌گویی فارسی بخش بزرگی از پرسش‌ها را از دست می‌دهد — بدون آنکه خطایی ثبت شود.

یک واژه، چند املا

این تفاوت‌ها در استاندارد یونیکد ثبت شده‌اند و هیچ‌کدام غلط املایی نیستند؛ هر دو شکل در متن‌های رسمی فارسی به کار می‌روند:

  • نیم‌فاصله (U+200C) — نویسه‌ای است با عرض صفر که دیده نمی‌شود ولی در رشته وجود دارد. «می‌رود» و «می رود» و «میرود» سه رشتهٔ متمایزند.
  • ی فارسی (U+06CC) در برابر ي عربی (U+064A) — روی صفحه‌کلیدهای مختلف هر دو تایپ می‌شوند و شکل نهایی‌شان در بسیاری از قلم‌ها یکسان است.
  • ک فارسی (U+06A9) در برابر ك عربی (U+0643) — همان داستان.
  • ه در برابر ة — کاربری که با صفحه‌کلید عربی می‌نویسد «شرکة» تایپ می‌کند.
  • ارقام — «۱۴۰۵» با ارقام فارسی (U+06F0 تا U+06F9)، «١٤٠٥» با ارقام عربی‌هندی (U+0660 تا U+0669) و «1405» با ارقام لاتین سه رشتهٔ جدا هستند.
  • اعراب و کشیده — فتحه و ضمه و کشیدهٔ تزئینی، اگر در متن ورودی بمانند، تطبیق را می‌شکنند.

یعنی برای واژه‌ای مثل «چت‌بات»، دست‌کم چهار نوشتار رایج وجود دارد که همه درست‌اند. اگر سامانه فقط یکی را بشناسد، سه‌چهارم کاربران پاسخ نمی‌گیرند.

چرا خطایی ثبت نمی‌شود

این بدترین بخش ماجراست. وقتی تطبیق شکست می‌خورد، برنامه خراب نمی‌شود؛ فقط به پاسخ پیش‌فرض می‌رسد. لاگ سرور کد ۲۰۰ ثبت می‌کند، سرویس سالم گزارش می‌شود و هیچ نموداری قرمز نمی‌شود.

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

تلهٔ دوم: تطبیق زیررشته

فرض کنید سامانه برای تشخیص موضوع، دنبال کلیدواژه‌ها داخل متن پرسش می‌گردد. این ساده‌ترین روش است و یک عیب جدی دارد: فارسی زبانی است با پیوند فراوان پیشوند و پسوند.

نمونهٔ واقعی از سامانهٔ خودمان: کلیدواژهٔ «زمان» برای تشخیص پرسش‌های مربوط به زمان‌بندی پروژه تعریف شده بود. پرسش کاربر این بود: «آموزش سازمانی برای شرکت ما دارید؟» — و واژهٔ «زمان» به‌عنوان زیررشته داخل «سازمانی» پیدا شد. پاسخ داده‌شده، جدول زمانی پروژه بود.

راه‌حل، مقایسه در سطح واژهٔ کامل است، نه زیررشته؛ و اجازهٔ تطبیق پیشوندی فقط برای واژه‌های به‌اندازهٔ کافی بلند، تا «آموزش» بتواند «آموزشی» را بگیرد ولی «زمان» به «سازمانی» نخورد.

ترتیب درست یکدست‌سازی

پیش از هر مقایسه، متن ورودی و متن مرجع باید از یک مسیر یکسان بگذرند:

۱. حذف اعراب و کشیده ۲. تبدیل نیم‌فاصله و نشانه‌های جهت‌دار به فاصلهٔ ساده ۳. تبدیل ارقام فارسی و عربی‌هندی به لاتین ۴. یکدست‌سازی حروف: ي و ى و ئ به ی، ك به ک، ة و ۀ به ه، أ و إ و آ به ا ۵. کوچک‌کردن حروف لاتین ۶. تبدیل هر نویسهٔ غیرحرف و غیرعدد به فاصله و ادغام فاصله‌های پشت‌سرهم

نکتهٔ ظریف در گام دوم است: نیم‌فاصله باید به فاصله تبدیل شود، نه حذف. اگر حذف شود، «چت‌بات» می‌شود «چتبات» که با «چت بات» یکی نمی‌شود. اگر به فاصله تبدیل شود، هر دو املا به «چت بات» می‌رسند و یکدیگر را پیدا می‌کنند.

چرا این برای کسب‌وکارهای کرج بیشتر اهمیت دارد

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

سامانه‌ای که فقط با متن تمیز و یکدست آزمایش شده، در آزمایشگاه بی‌نقص کار می‌کند و در تماس با کاربر واقعی می‌لنگد. تیم ما در پارک علم و فناوری البرز همین سنجش را روی پیام‌های واقعی انجام می‌دهد، نه روی متن ساختگی — چون تفاوت میان این دو، تفاوت میان یک نمایش موفق و یک سرویس قابل اتکاست.

پرسش‌های متداول

نیم‌فاصله دقیقاً چیست و چرا مشکل‌ساز می‌شود؟

نیم‌فاصله نویسهٔ U+200C در یونیکد است: عرض صفر دارد، دیده نمی‌شود، ولی در رشته ذخیره می‌شود. برای همین «می‌رود» و «می رود» برای چشم یکسان و برای مقایسهٔ رشته‌ای متفاوت‌اند.

آیا فقط جست‌وجوی داخل سایت را خراب می‌کند؟

نه. هر جایی که متن فارسی مقایسه می‌شود تحت تأثیر است: جست‌وجوی محصول، فیلتر نام مشتری، تطبیق آدرس، و پاسخ‌گویی خودکار. در پایگاه داده هم دو رکورد با دو املا، دو رکورد جداگانه می‌مانند.

چند درصد پرسش‌ها به این دلیل بی‌پاسخ می‌مانند؟

عدد ثابتی ندارد و به دامنهٔ واژگان بستگی دارد. در سنجش سامانهٔ خودمان، پیش از یکدست‌سازی، سه پرسش از ده پرسش فارسیِ کاملاً متعارف به پاسخ پیش‌فرض می‌رسید؛ پس از آن، هر ده مورد به موضوع درست رسید.

آیا مدل زبانی بزرگ این مشکل را ندارد؟

مدل‌های بزرگ در برابر تفاوت املا مقاوم‌ترند، ولی مسئله را حذف نمی‌کنند: هر جایی که پیش یا پس از مدل، تطبیق رشته‌ای انجام شود — بازیابی سند، فیلتر، مسیریابی به دپارتمان — همین تله برمی‌گردد. انتخاب میان این دو معماری را در مقایسهٔ مدل زبانی و بازیابی از دانش سازمان بررسی کرده‌ایم.

یکدست‌سازی چقدر هزینهٔ پردازشی دارد؟

ناچیز. شش جایگزینی روی یک رشتهٔ کوتاه است و در سنجش ما کل زمان پردازش سمت سرور، شامل بازیابی پاسخ، ۱۰ تا ۱۴ میلی‌ثانیه بود. هزینهٔ نداشتنش بسیار بیشتر است.

خدمات مرتبط قطره