بازگشت به بلاگ

humanizer مجموعهٔ Instagram Agent Skill نیم‌فاصلهٔ فارسی را پاک می‌کند

Instagram Agent Skill سیزده skill رایگان و MIT برای Claude است، بدون ثبت‌نام و API key. ولی humanizer آن نیم‌فاصله، ZWJ و نشانه‌های جهت را حذف می‌کند و detect.py متن فارسیِ درست را ماشینی‌تر نمره می‌دهد. پیش از نصب این را بدانید.

Instagram Agent Skill این روزها زیاد دست‌به‌دست می‌شود: سیزده skill برای Claude که کار یک پیج اینستاگرام را پیش می‌برند. README خودش می‌گوید رایگان است، با مجوز MIT، بدون ثبت‌نام، بدون API key و بدون اتصال به اکانت. ما مخزن را در commit d03c56b (۱۳ سپتامبر ۲۰۲۶) خواندیم. آن ادعاها درست‌اند. ولی یک skill آن متن فارسی را خراب می‌کند.

چه چیزی واقعاً در مخزن هست

  • سیزده پوشه در skills/: از ig-reel و ig-caption تا ig-dm و ig-audit. نصب را به سه شکل گفته: لینک را در Claude paste کنید، پوشه‌ها را در ~/.claude/skills/ کپی کنید، یا plugin بسازید. (README)
  • پنج اسکریپت Python فقط کتابخانهٔ استاندارد را import می‌کنند. هیچ‌کدام requests، urllib یا socket ندارند.
  • چیزی پست نمی‌کند. README صریح است: skillها متن می‌نویسند و پست را شما می‌گذارید، چون خودکارسازی با مرورگر خلاف قوانین اینستاگرام است. «مدیر محتوای پیج» یعنی نویسندهٔ پیش‌نویس، نه اپراتور اکانت.
  • نویسنده hook scorer خودش را آزموده و نتیجه را پنهان نکرده. hookهای عمداً بد را خوب می‌گیرد (AUC ۰٫۸۳)، ولی بین hit و miss یک سازنده تقریباً شیر یا خط است (AUC ۰٫۵۶). داده‌اش هم YouTube Shorts انگلیسی است، نه Reels.

چیزی که به ما برخورد

ig-human همان humanizer است و طبق README دلیل اصلی کارکردن بقیه. فهرست کاراکترهای «نامرئی» آن در slop.json است. خط ۱۱ آن U+200C است، یعنی ZERO WIDTH NON-JOINER یا همان نیم‌فاصله، با "action": "delete". در همان فهرست ZWJ (U+200D)، علامت‌های LRM و RLM و ARABIC LETTER MARK (U+061C) هم حذف می‌شوند.

اگر یک مدخل را از فهرست بردارید، باز حذف می‌شود. humanize.py در خط‌های ۸۸ تا ۹۲ هر کاراکتر باقیمانده با دستهٔ یونیکد Cf را هم پاک می‌کند، و نیم‌فاصله در همین دسته است. نتیجه: «می‌خواهم» می‌شود «میخواهم» و «کتاب‌ها» می‌شود «کتابها».

detect.py هم در خط ۱۰۸ همهٔ کاراکترهای Cf را می‌شمارد و در خط ۱۱۳ وزن هر کدام را ۴ می‌گیرد. پس متنی که فارسی‌اش درست نوشته شده نمرهٔ FINGERPRINT بدتری می‌گیرد و ماشینی‌تر به نظر می‌رسد.

ZWJ مشکل همهٔ زبان‌هاست. شکلک‌های ترکیبی مثل 👨‍👩‍👧 با همین کاراکتر سر هم می‌مانند، و حذفش آن‌ها را به چند شکلک جدا می‌شکند. در کپشن اینستاگرام این کم پیش نمی‌آید.

ما اسکریپت‌ها را اجرا نکردیم. این‌ها از خواندن سورس است و خط‌ها لینک شده‌اند.

کاری که باید کرد

روی متن فارسی یا عربی humanize.py را اجرا نکنید. اگر می‌خواهید اجرا کنید، این پنج مدخل را از آرایهٔ invisible در slop.json بردارید و حذف Cf را محدود کنید:

# Persian and Arabic need these; ZWJ also holds emoji sequences together
KEEP = {chr(c) for c in (0x200C, 0x200D, 0x200E, 0x200F, 0x061C)}

stray = [c for c in text if unicodedata.category(c) == "Cf" and c not in KEEP]
text = "".join(c for c in text if unicodedata.category(c) != "Cf" or c in KEEP)

همین استثنا باید در detect.py:108 هم بیاید، وگرنه نمره همچنان جریمه می‌کند.

منابع

پیش‌نویس با کمک AI، بازبینی توسط عماد حبیب‌نیا