پردازش متن یکی از زمینه های اساسی در یادگیری ماشین است. در این زمینه، نمی توانیم داده های خام را که توالی از نمادها و کاراکترها هستند را سرراست (مستقیما) به الگوریتم یادگیری ماشین بفرستیم ولی می توانیم بردارهای ویژگی شماره ای (Numerical Feature Vectors) را بغرستیم. برای نمونه در الگوریتم MultinomialNB در طبقه بندی متن ها، ویژگی های استخراج شده همان واژه های درون متن هستند که این رشته واژه ها به کار الگوریتم نمی آیند و می بایست ویژگی های تازه ای (شمار یا تعداد هر واژه) را از درون متن استخراج کنیم.

مدل بسته واژگان یا Bag of Words

شیوه BoG یک ویژگی را برای هر کلمه مورد علاقه در متن ایجاد می کند. در مفاهیم NLP، یک مجموعه از نوشته ها را Corpus می گویند. در دستور زیر با یک لیست پایتونی، یک Corpus از دو نوشته ساخته ایم. corpus زیر دارای ۸ واژه یکتا UNC, played, Duke, in, basketball, lost the و game است.

مفهوم بردار ویژگی

واژه های یکتا Corpus، دربرگیرنده Vocabulary آن است. مدل BoG، یک بردار ویژگی (Feature Vector) را با یک آیتم به ازای هر واژه درون Vocabulary به کار می برد، تا هر یک از نوشته ها را نمایش دهد. بنابراین مفهوم بردار ویژگی، تنها دربرگیرنده واژه های یکتا درون Corpus است. در اینجا، Corpus دارای ۸ واژه یکتا است و دو تا نوشته داریم، بنابراین در بردار ویژگی، هر نوشته (یا Document) با یک بردار ویژگی دارای ۸ آیتم نشان داده می شود.

تعداد آیتم هایی که یک بردار ویژگی را شکل می دهند، برابر با بُعد (Dimension) آن بردار ویژگی است. در مدل BoG، هر آیتم درون یک بردار ویژگی، یک ارزش (مقدار) دودویی است که نشان می دهد که آن واژه درون نوشته هست یا نه. در شکل زیر که در آن سه نوشته داریم، بنابراین به ازای هر نوشته، یک بردار ویژگی داریم. در میان هر سه نوشته، ۶ واژه یکتا هست، پس بُعد هر بردار ویژگی، ۶ است. در هر بردار ویژگی شماره یک نشان می دهد که آیا آن واژه درون نوشته مربوط به خودش هست یا نه؟

مفهوم Tokenizes

در ارتباط با مفهوم بسته واژگان (BoG) و استخراج ویژگی های شماره ای از نوشته ها و فایل های متنی، مفاهیمی مانند Tokenizes هست که در اینجا تا اندازه ای آن را بررسی می کنیم. مفهوم Tokenizes در پیوند با مفاهیم زمینه پردازش زبان طبیعی (NLP) است. Tokenizes فرایند شکستن یک رشته به توکن ها (Tokens) یا توالی از کاراکترهای معنا دار است. توکن ها معمولا همان واژه ها (Words) هستند.

کلاس CountVectorizer در Scikit-Learn

در کد زیر نخست کلاس CountVectorizer از ماژول sklearn.feature_extraction.text به برنامه پیوست شده است و سپس متغیر corpus را با دو نوشته و سپس نمونه از کلاس CountVectorizer را ساخته ایم. برای بدست آوردن بردار ویژگی و شمار (یا تعداد) هر یک از واژگان درون هر دو نوشته را بدست آوریم، متغیر corpus را به متد ()fit_transform فرستاده ایم که برآیند (نتیجه) آن درون متغیر counts نگهداری می شود. برای نمایش بردار ویژگی، دستور ()counts.toarray را انجام داده ایم. توجه کنید چون دو نوشته داریم، پس دو بردار ویژگی با ۸ آیتم داریم که شماره یک به معنی بودن واژه در آن نوشته است.

برای نمایش هر واژه و تعداد تکرار آن در همه نوشته ها دستور _vectorizer.vocabulary را انجام داده ایم. توجه کنید برای دسترسی به ویژگی _vocabulary، از نمونه (یا متغیر) کلاس CountVectorizer که در شکل بالا vectorizer نان دارد کمک گرفته ایم. متغیر counts همان بردار ویژگی است که تعداد تکرار را نشان نمی دهد و تنها می گوید که آیا واژه ای درون هر یک از نوشته ها (یا Documents) هست یا نه ولی ویژگی _vocabulary، دیکشنری را برگشت می دهد که شمار (یا تعداد) تکرار هر یک را نشان می دهد.

در شکل زیر یک نوشته دیگر به لیست corpus افزوده ایم و دوباره می خواهیم فرایند پیشین، یعنی اجرای تابع ()fit_transform را انجام دهیم. قاعدتا با افزوده شدن نوشته ای تازه با واژه های یکتا تازه، بردارهای ویزگی سه تا شده و آیتم های هر یک نیز از ۸ تا بیشتر می شوند. در پایان شکل زیر، با یک حلقه for به اندازه لیست corpus، در هر گام، همزمان یکی از آیتم های لیست corpus و آرایه feature_vetcor را نشان می دهیم.