در نوشته های پیشین درباره کلاس های گوناگونی از کتابخانه Scikit-Learn برای استخراج ویزگی های متنی گفته ایم. ویژگی ها در متن ها و نوشته ها، همان واژگان درون نوشته هستند ولی آشکار است که هر واژه ای مفهوم و حس آن نوشته را نمی رساند. برای نمونه در تحلیل توییت های توییتر برای آنکه بدانیم یک توییت پیرامون چه موضوعی است، باید واژگان آن را استخراج کرده و سپس به کمک کلاس بندی مانند بیز (Bayes Classification) بفهمیم که در کدام دسته قرار می گیرد.

البته توجه کنید که هر واژه ای مفهوم و حس آن نوشته را نمی رساند. در یک نوشته واژگانی هستند که بسیار تکرار شده اند و از این رو آنها برای رساندن مفهوم محتوای نوشته، کاربردی ندارند. برای نمونه واژه the یا you یا that بسیار تکرار می شوند ولی نمی توان با تکیه بر انها چیزی از درون مایه نوشته فهمید.

کلاس TfidfTransformer

پیش از این در نوشته استخراج داده ها – فراوانی وزنی TF-IDF با Sklearn درباره کلاس TfidfVectorizer گفته بودیم و در این نوشته می خواهیم کلاس دیگری به نام TfidfTransformer را به شما بشناسانیم. این کلاس در پایان ارزش های IDF را بدست می آورد ولی یک تفاوت با TfidfVectorizer دارد و آن اینکه، نیازمندی این کلاس این است که پیش از این، با کلاس CountVectorizer بسته واژگان (Bag-of-Word) را بدست آوریم و سپس کلاس TfidfTransormer را به آن اعمال کنیم ولی با کلاس TfidfVectorizer هر دو این ها یک باره انجام می شوند.

در کد زیر نخست دو کلاس CountVectorizer و TfidfTransformer را به برنامه پیوست کرده ایم و سپس یک سند (یا Document) به گونه یک لیست از رشته ها نوشته ایم. سپس یک نمونه از کلاس CountVectorizer را به آن اعمال کرده ایم و در پایان متغیر docs را به متد ()fit_transform از کلاس CountVectorizer فرستاده ایک که نتیجه آن یک آرایه با ۵ آرایه درونی است که هر یک دارای ۱۶ عنصر هستند و از این رو مقدار برگشتی count_vector.shape به گونه (16, 5) است.

چون که درون همه ۵ رشته تنها ۱۶ واژه یکتا هست، پس با اعمال متد ()fit_transform، یک آرایه خواهیم داشت که در count_vector نگهداری شده که دارای ۵ آرایه درونی است که هر یک برداری هستند که ه کدام از آیتم های آنها بودن یا نبودن واژگان در رشته متناسب را نشان می دهند. در شکل زیر به کمک ویژگی _vocabulary دیکشنری را نشان داده ایم که هر کلید آن نام یک واژه و ارزشهر کلید، اندیس واژه در هر یک از بردارهای درونی است.

بدست آوردن ارزش های IDF

پس از آنکه بردار Bag-of-Word را بدست آوردیم اکنون باید به کمک کلاس TfidfTransformer ارزش های IDF را بدست آوریم. نخست یک نمونه از کلاس TfidfTransformer به نام tfidf_transformer می سازیم و سپس متغیر count_word را به متد ()fit  از این کلاس می فرستیم. در شکل زیر به کمک ویژگی _idf ارزش های IDF بدست آمده را نشان داده ایم و همانگونه که می بینید اندازه آن برابر با ۱۶ است که نشان دهنده این است که، به ازای هر یک از ۱۶ واژه یکتا درون همه رشته ها، یک ارزش IDF بدست آمده است. توجه کنید که متغیر count_word که به متد ()fit فرستاده شده است، دکشنری است که دوتایی های نام واژه و شمار تکرار آن واژه را در خود دارد.

بدست آوردن امتیازهای TF-IDF

اکنون که ارزش ها یا مقدارهای IDF را داریم باید امتیازهای TF-IDF را برای هر یک از سندها (در اینجا هر یک از ۵ رشته) بدست آوریم. در کد زیر نخست یک متغیر به نام transform_count_vector ساخته می شود که مقدار برگشتی تابع ()transform از کلاس CountVectorizer را در خود نگه می دارد. سپس این متغیر تازه ساخته شده را به متد ()transform از کلاس TfidfTransformer می دهیم تا در پایان آنچه که می خواهیم، یعنی امتیازهای TF-IDF را برگشت دهد.

توجه کنید برگشتی متد ()transform امتیازهای TF-IDF است که در واقع این متد ضرب tf * idf را انجام می دهد. در کدهای زیر و پس از داشتن امتیازهای TF-IDF، نخست به کمک دستور (feature_names = vectorizer.get_feature_names فهرست ویژگی ها یا همان فهرست واژگان یکتا درون سند را در متغیر feature_names می ریزیم. سپس با دستور [first_document_vector = tf_idf_vector[0، نخستین ایتم درون امتیازهای TF-IDF که درون متغیر tf_idf_vector هستند را در متغیر first_document_vector می ریزیم.

بنابراین ویژگی _vocabulary از کلاس CountVectorizer دیکشنری است که هر دوتایی آن نام یک واژه در سند و مقدارهر کلید نیز شماره اندیس آن واژه در یک از بردارهای درونی است. همچنین با متد ()transform از کلاس  TfidfTransformer امتیازهای TF-IDF را بدست می آوریم. بنابراین در کد بالا امتیازهای نخستین رشته درون متفیر docs، یعنی رشته the house had a tiny little mouse را بدست آورده ایم. در شکل بالا متغیر first_document_vector دارای ۶ عنصر است، زیرا نخستین رشته درون docs تنها ۶ تا از همه واژه های یکتا و مشترک میان همه رشته ها را داشت.