Regex yugurish uchun 5 kun kerak edi. Shunday qilib, men 15 daqiqada bajaradigan vositani yaratdim.

dia057 | Ajratish

Dasturchilar matn bilan ishlaganda, ko'pincha uni avval tozalash kerak bo'ladi. Ba'zan kalit so'zlarni almashtirish orqali. "Javascript" ni "JavaScript" bilan almashtirish kabi. Boshqa safar, biz shunchaki hujjatda "JavaScript" eslatib o'tilganmi yoki yo'qligini aniqlashni xohlaymiz.

Ushbu kabi ma'lumotlarni tozalash vazifalari matn bilan bog'liq ko'pgina ma'lumotlarga oid loyihalar uchun standart hisoblanadi.

Data Science ma'lumotlarni tozalash bilan boshlanadi.

Yaqinda ishlashga juda o'xshash vazifam bor edi. Men Belong.co-da ma'lumot mutaxassisi bo'lib ishlayman va tabiiy tillarga ishlov berish bu mening ishimning yarmi.

Men hujjat korpusida Word2Vec modelini o'qitganimda, u o'xshash atamalar kabi sinonimlarni berishni boshladi. "Javascripting" "JavaScript" ga o'xshash atama sifatida kelgan.

Buni hal qilish uchun men barcha ma'lum sinonimlarni standart nomlar bilan almashtirish uchun oddiy iborani (Regex) yozdim. Regex "Javascriptting" ni "JavaScript" bilan almashtirdi, bu bitta muammoni hal qildi, ammo boshqasini yaratdi.

Ba'zi odamlar muammoga duch kelganda, o'ylashadi
"Men bilaman, men muntazam iboralarni ishlataman." Endi ular ikkita muammoga duch kelishdi.

Yuqoridagi iqtibos ushbu stek-almashinuv savolidan kelib chiqqan va men uchun to'g'ri bo'ldi.

Agar qidirish va o'zgartirish kerak bo'lgan kalit so'zlar soni 100-larda bo'lsa, Regex tezkor ekanligi ayon bo'ldi. Ammo mening korpusimda 20K dan ortiq kalit so'zlar va 3 millionta hujjatlar mavjud edi.

Regex kodimni taqqoslaganimda, bitta yugurishni tugatish uchun 5 kun kerakligini ko'rdim.

dahshat

Tabiiy yechim uni parallel ravishda bajarish edi. Ammo biz o'n millionlab hujjatlar va yuz minglab minglab kalit so'zlarga erishganimizda bu yordam bermaydi. Yaxshi yo'l bo'lishi kerak edi! Va men uni izlay boshladim ...

Men ofisimdan va Stack Overflow-dan so'radim - bir nechta takliflar paydo bo'ldi. Vinay Pandey, Suresh Lakshmanan va Stack Overflow Aho-Corasick algoritmi va Trie Data Strukturasi deb atalgan chiroyli algoritmga ishora qildilar. Men mavjud echimlarni qidirdim, lekin topolmadim.

Shunday qilib, men o'zimning bajarilishimni yozdim va FlashText tug'ildi.

FlashText nima ekanligini va uning qanday ishlashini o'rganishdan oldin, uning qidirish qanday bajarilishini ko'rib chiqamiz.

Pastki qismidagi qizil chiziq - FlashText tomonidan qidirish uchun ketgan vaqt

Yuqorida ko'rsatilgan jadval 1 ta hujjat uchun CompTed Regex-ni FlashText-ga taqqoslashdan iborat. Kalit so'zlar soni ortib borishi bilan Regex tomonidan qabul qilingan vaqt deyarli chiziqli ravishda o'sadi. Ammo FlashText-ning ahamiyati yo'q.

FlashText bizning ish vaqtimizni 5 kundan 15 daqiqagacha qisqartirdi !!

biz hozir yaxshimiz :)

Bu almashtirish uchun FlashText vaqti:

Quyidagi qizil chiziq - almashtirish uchun FlashText tomonidan qabul qilingan vaqt

Yuqorida ko'rsatilgan mezon uchun ishlatiladigan kod bu erda bog'langan va natijalar bu erda bog'langan.

Xo'sh, FlashText nima?

FlashText - bu GitHub-da ochgan Python kutubxonasi. Kalit so'zlarni olishda ham, ularni almashtirishda ham samaralidir.

FlashText-dan foydalanish uchun avval unga kalit so'zlar ro'yxatini berish kerak. Ushbu ro'yxat Trie lug'atini tuzishda ichki ishlatiladi. Keyin siz unga bir simni uzatasiz va almashtirish yoki qidirishni xohlaysizmi, deb aytasiz.

O'zgartirish uchun u almashtirilgan kalit so'zlar bilan yangi qatorni yaratadi. Qidiruv uchun u satrda joylashgan kalit so'zlar ro'yxatini qaytaradi. Bularning barchasi kirish satridan bir o'tish orqali amalga oshiriladi.

Baxtli foydalanuvchiga kutubxona to'g'risida nima deyish kerak:

Nima uchun FlashText juda tez?

Keling, misolni ushbu qism bilan tushunishga harakat qilaylik. Aytaylik, menda 3 ta so'z bor, Python yoqadi va 4 ta so'zdan iborat korpus {Python, Java, J2ee, Ruby}.

Agar biz har bir so'zni korpusdan olsak va uning jumlada bor-yo'qligini tekshirsak, 4 ta urinish kerak bo'ladi.

"Python" jumlasida?
'Java' jumlada?
...

Agar tanada n so'z bo'lsa, unda n ko'chirish kerak edi. Shuningdek, har bir qidiruv bosqichi jumlada? o'z vaqtini oladi. Regex o'yinida shunday bo'ladi.

Birinchisidan teskari bo'lgan yana bir yondashuv mavjud. Jumladagi har bir so'z uchun uning tarkibida mavjudligini tekshiring.

"men" korpusda emasmi?
korpusdagi "kabi"?
korpusda "piton" bormi?

Agar jumlada m so'zlari bo'lsa, u m looplarni olar edi. Bunday holda, vaqt faqat jumladagi so'zlar soniga bog'liq. Va bu qadam, korpusda? lug'at qidiruvi yordamida tez amalga oshirish mumkin.

FlashText algoritmi ikkinchi yondashuvga asoslanadi. U Aho-Corasick algoritmi va Trie ma'lumotlar tuzilmasidan ilhomlangan.

Uning ishlash usuli:
Avval korpus yordamida Trie lug'ati yaratiladi. Biroz shunday ko'rinishga ega bo'ladi:

Korpusning trie lug'ati.

Boshlash va EOT (Terminning oxiri) bo'sh joy, davr va yangi_ qator kabi so'z chegaralarini anglatadi. Kalit so'z, agar uning ikkala tomonida so'z chegaralari mavjud bo'lsa, mos keladi. Bu ananasdagi olma bilan mos kelishiga to'sqinlik qiladi.

Keyinchalik biz Python-ga yoqadigan matnni olamiz va uni belgilar bo'yicha qidiramiz.

1-qadam: lug'atda  men  bormi? Yo'q
2-qadam: lug'atda   ga o'xshaydimi? Yo'q
3-qadam: lug'atda  Python  bormi? Ha
<Start> Python <EOT> lug'atda mavjud.

Bu belgilar mosligi bo'yicha belgi bo'lganligi sababli, l-da kabi -ni osongina o'tkazib yuborishimiz mumkin, chunki l boshlang'ich bilan bog'lanmagan. Bu etishmayotgan so'zlarni o'tkazib yuborishni haqiqatan ham tezlashtiradi.

FlashText algoritmi faqat 'Menga Python yoqadi' kiritish satrining har bir belgisini bosib o'tdi. Lug'atda million kalit so'zlar juda yaxshi bo'lishi mumkin edi, ammo ish vaqtiga ta'sir ko'rsatmaydi. Bu FlashText algoritmining haqiqiy kuchi.

Xo'sh, qachon FlashText-dan foydalanishingiz kerak?

Oddiy javob: Qachon kalit so'zlar soni> 500

Qidiruv uchun FlashText Regex-ni ~ 500 ta kalit so'zdan keyin shakllantiradi.

Murakkab javob: Regex kalit so'zlarni ^, $, *, \ d, kabi maxsus belgilar asosida izlashi mumkin. FlashText-da qo'llab-quvvatlanmaydigan narsalar.

Shunday qilib, agar "word \ dvec" kabi qisman so'zlarni solishtirish yaxshi bo'lsa. Ammo "word2vec" kabi to'liq so'zlarni ajratib olish uchun juda yaxshi.

Kalit so'zlarni topish uchun FlashText

Kalit so'zlarni almashtirish uchun FlashText

Kalit so'zlarni ajratib olish o'rniga siz jumlalardagi kalit so'zlarni almashtirishingiz mumkin. Biz buni ma'lumotni qayta ishlash quvur liniyasida ma'lumotlarni tozalash bosqichi sifatida ishlatamiz.

Agar siz matnli ma'lumotlar, shaxsni aniqlash, tabiiy tilni qayta ishlash yoki Word2vec bilan ishlaydigan biror kishini bilsangiz, iltimos, ushbu blogni ular bilan bo'lishishni o'ylab ko'ring.

Ushbu kutubxona biz uchun haqiqatan ham foydali bo'ldi va ishonamanki, bu boshqalar uchun ham foydali bo'ladi.

Shunday qilib, uzoq va barcha qarsaklar uchun tashakkur