وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

جستجو و جایگزینی کلمات در پایتون با FlashText

0 64
زمان لازم برای مطالعه: 6 دقیقه


معرفی

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

الگوریتم FlashText چگونه کار می کند؟

را متن ماژول مبتنی است روی الگوریتم اختصاصی آن، الگوریتم فلش. در اصل ، مبتنی است روی پیاده سازی پایتون از الگوریتم AHO -Corasick.

نکته اساسی این الگوریتم کاهش زمان صرف شده برای یافتن تعداد زیادی از کلمات کلیدی در متن است، با به حداقل رساندن تعداد دفعاتی که متن اسکن می شود.

یک الگوریتم ساده لوحانه شامل مقایسه هر کلمه کلیدی با هر کلمه در کل متن است – مشابه جستجوی خطی. این رویکرد بسیار ناکارآمد است، زیرا باید کل سند متنی را اسکن کند n بارها – کجا n تعداد کلمات کلیدی است.

از سوی دیگر، FlashText رویکرد متفاوتی را انتخاب می کند و قصد دارد فقط یک بار متن را اسکن کند.

کلید کارایی الگوریتم FlashText این است که تمام کلمات کلیدی را به همراه کلمات جایگزین مربوطه در یک ذخیره می کند. فرهنگ لغت. سپس، به جای اینکه متن را یکبار برای هر کلمه کلیدی در فرهنگ لغت اسکن کنید، آن را اسکن کنید متن را فقط یک بار اسکن می کند. در آن یک اسکن روی متن، کلمات با متن مطابقت دارند کلیدهای فرهنگ لغت و در صورت وجود – با کلید جایگزین می شود ارزش.

روش نصب FlashText

نصب FlashText نسبتاً ساده است، از طریق pip:

$ pip install flashtext

روش استفاده از FlashText

بیایید ابتدا نگاهی به FlashText API و برخی از کلاس های کلیدی درون آن.

را پردازشگر کلمات کلیدی کلاس

کلاس اصلی که ما با آن کار خواهیم کرد و پردازش کلمات کلیدی را بر عهده دارد، این است KeywordProcessor کلاس اجازه دهید import آن را مستقیما از FlashText و آن را مقدار دهی اولیه کنید:

from flashtext import KeywordProcessor
keyword_processor = KeywordProcessor()

خط قبلی ایجاد می کند KeywordProcessor شی که در کار خواهد کرد حالت حساس به حروف کوچک و بزرگ.

حالت حساس به حروف بزرگ و کوچک مطابقت دارد abc با ABC، و همچنین با aBc، ABc، و غیره.

حالت حساس به کوچک و بزرگ فقط مطابقت دارد aaa دقیقا با همان رشته aaa.

به طور متناوب، می توانیم a ایجاد کنیم KeywordProcessor نمونه در حالت حساس به حروف کوچک و بزرگ:

keyword_processor= KeywordProcessor(case_sensitive=True)

تعریف کردن دیکشنری کلمات کلیدی

در ماژول FlashText از کلمات کلیدی برای تعریف کلماتی که باید جایگزین شوند استفاده می کنیم. را KeywordProcessor شی شامل یک فرهنگ لغت حاوی تمام کلمات کلیدی تعریف شده است.

دو راه برای افزودن کلمات کلیدی به فرهنگ لغت وجود دارد: به صورت عمده یا یکی یکی.

در ابتدا، اجازه دهید نگاهی به چگونه کلمات کلیدی را یک به یک اضافه کنیم:

keyword_processor.add_keyword(<keyword>, <replacementWord>)

<replacementWord> یک آرگومان اختیاری است. وقتی مشخص نیست، فقط <keyword> به فرهنگ لغت اضافه شده است و هیچ راهی برای جایگزینی آن با کلمه جایگزین دیگری وجود ندارد.

بنابراین، اگر می خواهید از FlashText برای جایگزینی کلمات در یک متن استفاده کنید، به شما توصیه می کنیم که آن را مشخص کنید <replacementWord> بحث و جدل.

اگر بیش از چند کلمه کلیدی داشته باشیم، اضافه کردن یک به یک آنها می تواند کمی وقت گیر باشد. یک جایگزین که حتی برای لیست های کوچکی از کلمات کلیدی بسیار رایج تر استفاده می شود این است که کلمات کلیدی را به صورت انبوه اضافه کنید:

keyword_dictionary = {
    'replacementWord1': ('list', 'of', 'keywords', 'for', 'replacementWord1'),
    'replacementWord2': ('list', 'of', 'keywords', 'for', 'replacementWord2'),
    ...
    'replacementWordN': ('list', 'of', 'keywords', 'for', 'replacementWordN')
}

keyword_processor.add_keywords_from_dict(keyword_dictionary )

هر یک key در فرهنگ لغت یک کلمه کلیدی رشته ای است. هر یک value باید یک لیست باشد. از طرف دیگر، می توانید کلمات کلیدی را از طریق a ارائه کنید List:

keyword_processor.add_keywords_from_list(('list', 'of', 'keywords'))

اگرچه، با این رویکرد – شما فقط کلمات کلیدی را بدون کلمات جایگزین اضافه کنید. یا اگر یک فایل متنی حاوی جفت های کلید-مقدار زیر a key=>value نحو:

keyword1=>value1
keyword2=>value2

ما میتوانیم import آنها را از طریق keywords_from_file() تابع:

keyword_processor.add_keywords_from_file('keyword_list.txt')

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

حالا بیایید به یک مثال سریع نگاهی بیندازیم. تصور کنید ما یک سند متنی داریم و می خواهیم استفاده از مترادف ها را به حداقل برسانیم تا واژگان مورد استفاده را استاندارد کنیم. در اصل، ما می خواهیم همه ی وقوع کلماتی مانند وحشتناک، وحشتناک و وحشتناک (فهرست کلمات کلیدی) با کلمه بد (کلمه جانشین)، و تمامی وقوع کلماتی مانند خوب، عالی و عالی، با کلمه خوب.

ما آنها را اضافه می کنیم keywords و replacement_words به keyword_dictionary:

keyword_dictionary = {
    "bad": ("awful", "terrible", "horrible"),
    "good": ("fine", "excellent", "great")
}

و در نهایت، را اضافه کنید keyword_dictionary به keyword_processor هدف – شی:

keyword_processor.add_keywords_from_dict(keyword_dictionary)

کلمات کلیدی را با کلمات جایگزین جایگزین کنید

هنگامی که کلمات کلیدی و کلمات جایگزین مربوطه را در آن بارگذاری کردیم KeywordProcessor به عنوان مثال، ما می توانیم اجرا کنیم replace_keywords() تابع، که متن ارائه شده را اسکن می کند و جایگزین را اجرا می کند:

new_text = keywordProcessor.replace_keywords("Passed String")

متن ارائه شده را تجزیه می کند، همه کلمات کلیدی درون آن را با مقادیر همسان جایگزین می کند و یک رشته جدید برمی گرداند.

اکنون، ما معمولاً در اینجا با حروف رشته ای کار نمی کنیم – بلکه با اسناد کار می کنیم. می‌خواهیم سندی را باز کنیم، خطوط درون آن را بخوانیم و آن‌ها را به‌عنوان یک رشته به آن ارسال کنیم replace_keywords() تابع.

توجه داشته باشید: برای فایل های بسیار طولانی، ممکن است در حافظه دستگاه محلی شما جای نگیرد – ممکن است بخواهید در نظر بگیرید خواندن یک فایل خط به خط.

در هر صورت، بیایید در یک فایل متنی بارگذاری کنیم و آن را اجرا کنیم replace_keywords() تابع روی مطالب:


with open('data.txt', 'r+') as file:
    
    content = file.read()
    
    new_content = keyword_processor.replace_keywords(content)
    
    file.seek(0)
    file.truncate()
    
    file.write(new_content)

بنابراین اگر یک فایل متنی مانند، text.txt:

The breakfast was terrific! I really loved the eggs, you're a great cook.

با کلمات کلیدی زیر و کلمات جایگزین:

from flashtext import KeywordProcessor
keyword_processor = KeywordProcessor()

keyword_dictionary = {
    "good": ("terrific", "great"),
    "eggs": ("hash browns")
}

keyword_processor.add_keywords_from_dict(keyword_dictionary)

with open('data.txt', 'r+') as file:
    content = file.read()
    new_content = keyword_processor.replace_keywords(content)
    file.seek(0)
    file.truncate()
    file.write(new_content)

منجر به تغییر می شود text.txt فایل:

The breakfast was good! I really loved the hash browns, you're a good cook.

سایر عملکردهای مفید ماژول FlashText

بیا یه آدمک درست کنیم keyword_processor و keyword_dictionary برای نشان دادن برخی از دیگر عملکردهای مفید FlashText مدول:

keywordProcessor = KeywordProcessor()
keywordDictionary = {
    "bad": ("awful", "terrible", "horrible"),
    "good": ("fine", "excellent", "great")
}
keywordProcessor.add_keywords_from_dict(keywordDictionary)

برای دریافت لیستی از تمام کلمات کلیدی در KeywordProcessor نمونه، مثال، ما استفاده می کنیم get_all_keywords() تابع:


print(keywordProcessor.get_all_keywords())

که منجر به:

{'awful': 'bad', 'terrible': 'bad', 'horrible': 'bad', 'fine': 'good', 'excellent': 'good', 'great': 'good'}

به بررسی کنید که آیا یک کلمه کلیدی در KeywordProcessor، می توانیم استفاده کنیم in اپراتور:

'bad' in keywordProcessor



'red' in keywordProcessor



'awful' in keywordProcessor



و برای دسترسی به a replacement_word مستقر روی معین keyword:

keywordProcessor('fine')


keywordProcessor('excellent')


keywordProcessor('goood')


و در نهایت، برای حذف کلمات کلیدی از a KeywordProcessor، ما استفاده می کنیم remove_keyword() تابع:

keyword_processor.remove_keyword('fine')

از طرف دیگر، می‌توانیم فهرست یا فرهنگ لغت جفت‌های کلیدواژه-مقدار را که می‌خواهیم حذف کنیم، مشخص کنیم و از آنها برای حذف عناصر خاص استفاده کنیم:


keywordProcessor.remove_keywords_from_dict({"bad": ("awful", "terrible")})



keywordProcessor.remove_keywords_from_list(("fine", "excellent"))

FlashText در مقابل عبارات منظم

FlashText در درجه اول به عنوان جایگزینی برای عبارات منظم ایجاد شد، بنابراین مقایسه این دو مورد مفید خواهد بود. در واقع به عنوان پاسخی به a ایجاد شد سوال روی سرریز پشته.

هنگام مقایسه سرعت اجرا – FlashText برنده واضح است. برای یک متن، با تعداد کم و زیاد کلمات کلیدی، تقریباً زمان یکسانی طول می‌کشد. از طرف دیگر، با عبارات منظم – زمان اجرا متناسب با تعداد کلمات کلیدی که باید جایگزین شوند افزایش می یابد.

به عنوان نویسنده یادداشت های FlashText – برای پرس و جوهای بزرگ، می تواند عبارات منظم را بگیرد روزها برای اجرا، در حالی که FlashText آن را در 15 دقیقه انجام می دهد:

جایگزینی-معیار

اعتبار: ویکاش سینگ، نویسنده FlashText، در FreeCodeCamp

بنچمارک‌ها نشان داده‌اند که FlashText زمان کمتری نسبت به RegEx برای یافتن و جایگزینی کلمات کلیدی زمانی که تعداد کلمات کلیدی از 500 بیشتر می‌شود، طول می‌کشد.

اگرچه، وقتی صحبت از تطبیق کاراکترهای خاص می شود، FlashText هیچ شانسی برای شکست عبارات منظم ندارد. حتی بیشتر، FlashText حتی از آن نوع تطبیق پشتیبانی نمی کند – فقط می تواند کلمات کلیدی ساده را بدون هیچ کاراکتر خاصی مطابقت دهد.

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

مثلا شخصیت \d ارقام از 0 تا 9 را توصیف می کند، به این معنی که کلمه کلیدی number\d کلمات مطابقت خواهد داشت number0، number1، number2، و غیره.

FlashText با تطبیق کاراکترهای خاص در ذهن طراحی نشده است، بنابراین فقط می تواند با حروف الفاظ رشته مساوی مطابقت داشته باشد. کلمه number1 فقط با کلمه کلیدی قابل تطبیق است number1 و هیچ راهی برای استفاده از یک کلمه کلیدی برای تطبیق چندین کلمه مختلف وجود ندارد.

نتیجه

همانطور که قبلاً دیدیم، FlashText یک ابزار بسیار ساده و در عین حال قدرتمند است. بدون توجه به تعداد کلمات کلیدی که باید جایگزین شوند، بسیار سبک وزن، آسان برای یادگیری، و بسیار کارآمد در زمان است.

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

از سوی دیگر، اگر کمتر از 500 کلمه کلیدی یا نوعی تطبیق کاراکتر خاص دارید، احتمالاً باید FlashText را کنار بگذارید و با توجه به انعطاف‌پذیری و نحو، عبارات منظم قدیمی و خوب را دنبال کنید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-10 09:37:05

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید