Как да обработваме текстови данни, използвайки TF-IDF в Python

Компютрите са добри с цифри, но не толкова с текстови данни. Една от най-широко използваните техники за обработка на текстови данни е TF-IDF. В тази статия ще научим как работи и какви са неговите характеристики.

От нашата интуиция смятаме, че думите, които се появяват по-често, трябва да имат по-голяма тежест при анализа на текстови данни, но това не винаги е така. Думи като „the“, „will“ и „you“ - наречени стоп думи - се появяват най-много в корпус от текст, но имат много малко значение. Вместо това думите, които са редки, са тези, които всъщност помагат при разграничаването на данните и имат по-голяма тежест.

Въведение в TF-IDF

TF-IDF означава „Терминална честота - обратна честота на данните“. Първо ще научим какво означава този термин математически.

Честота на термина (tf) : дава ни честотата на думата във всеки документ в корпуса. Това е съотношението между броя на думите в документа в сравнение с общия брой думи в този документ. Той се увеличава с увеличаването на броя на появите на тази дума в документа. Всеки документ има свой собствен tf.

Честота на обратната информация (idf): използва се за изчисляване на теглото на редки думи във всички документи в корпуса. Думите, които се срещат рядко в корпуса, имат висока оценка на IDF. То се дава от уравнението по-долу.

Комбинирайки тези две, излизаме с оценката на TF-IDF (w) за дума в документ в корпуса. Това е продукт на tf и idf:

Да вземем пример, за да получим по-ясно разбиране.

Изречение 1: Колата се кара на пътя.

Изречение 2: Камионът се кара по магистралата.

В този пример всяко изречение е отделен документ.

Сега ще изчислим TF-IDF за горните два документа, които представляват нашия корпус.

От горната таблица можем да видим, че TF-IDF на често срещаните думи е нула, което показва, че те не са значими. От друга страна, TF-IDF на „кола“, „камион“, „път“ и „магистрала“ са ненулеви. Тези думи имат по-голямо значение.

Използване на Python за изчисляване на TF-IDF

Нека сега кодираме TF-IDF в Python от нулата. След това ще видим как можем да използваме sklearn за автоматизиране на процеса.

Функцията computeTFизчислява TF резултата за всяка дума в корпуса, по документ.

Функцията computeIDFизчислява оценката на IDF за всяка дума в корпуса.

Функцията computeTFIDFпо-долу изчислява оценката на TF-IDF за всяка дума, като умножава резултатите от TF и ​​IDF.

Резултатът, получен от горния код за набора от документи D1 и D2, е същият като този, който ръчно изчислихме по-горе в таблицата.

Можете да се обърнете към тази връзка за пълното внедряване.

sklearn

Сега ще видим как можем да приложим това с помощта на sklearn в Python.

Първо ще импортираме TfidfVectorizerот sklearn.feature_extraction.text:

Сега ще инициализираме vectorizerи след това ще извикаме годни и ще го преобразуваме, за да изчислим TF-IDF резултата за текста.

Под капака sklearn fit_transform изпълнява следните функции fit и transformфункции. Те могат да бъдат намерени в официалната библиотека sklearn в GitHub.

 def fit(self, X, y=None): """Learn the idf vector (global term weights) Parameters ---------- X : sparse matrix, [n_samples, n_features] a matrix of term/token counts """ if not sp.issparse(X): X = sp.csc_matrix(X) if self.use_idf: n_samples, n_features = X.shape df = _document_frequency(X) # perform idf smoothing if required df += int(self.smooth_idf) n_samples += int(self.smooth_idf) # log+1 instead of log makes sure terms with zero idf don't get # suppressed entirely. idf = np.log(float(n_samples) / df) + 1.0 self._idf_diag = sp.spdiags(idf, diags=0, m=n_features, n=n_features, format="csr") return self def transform(self, X, copy=True): """Transform a count matrix to a tf or tf-idf representation Parameters ---------- X : sparse matrix, [n_samples, n_features] a matrix of term/token counts copy : boolean, default True Whether to copy X and operate on the copy or perform in-place operations. Returns ------- vectors : sparse matrix, [n_samples, n_features] """ if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating): # preserve float family dtype X = sp.csr_matrix(X, copy=copy) else: # convert counts or binary occurrences to floats X = sp.csr_matrix(X, dtype=np.float64, copy=copy) n_samples, n_features = X.shape if self.sublinear_tf: np.log(X.data, X.data) X.data += 1 if self.use_idf: check_is_fitted(self, '_idf_diag', 'idf vector is not fitted') expected_n_features = self._idf_diag.shape[0] if n_features != expected_n_features: raise ValueError("Input has n_features=%d while the model" " has been trained with n_features=%d" % ( n_features, expected_n_features)) # *= doesn't work X = X * self._idf_diag if self.norm: X = normalize(X, norm=self.norm, copy=False) return X

Едно нещо, което трябва да забележите в горния код е, че вместо само дневника на n_samples, 1 е добавен към n_samples за изчисляване на резултата от IDF. Това гарантира, че думите с IDF резултат нула няма да бъдат потиснати изцяло.

Полученият изход е под формата на изкривена матрица, която се нормализира, за да се получи следният резултат.

По този начин видяхме как можем лесно да кодираме TF-IDF само в 4 реда, използвайки sklearn. Сега разбираме колко мощен е TF-IDF като инструмент за обработка на текстови данни извън корпуса. За да научите повече за sklearn TF-IDF, можете да използвате тази връзка.

Приятно кодиране!

Благодаря, че прочетохте тази статия. Не забравяйте да го споделите, ако сметнете за полезно.

За повече информация относно програмирането можете да ме следвате, за да получавате известия всеки път, когато измисля нова публикация.

Наздраве!

Also, Let’s get connected on Twitter, Linkedin, Github and Facebook.