В обработке естественного языка любую текстовую проблему необходимо преобразовать в форму, которую можно смоделировать. Простой текст можно преобразовать в функции с помощью различных методов, таких как Пакет слов (BOW), TF-IDF или встраивание слов. В последнем блоге серии Text Feature Extraction мы изучали CountVectorizer с нуля и его варианты использования для классификации текста. Мы расшифровали там, что у него есть главный недостаток - отсутствие смыслового значения. CountVectorizer учитывает количество слов для создания функции, поэтому не принимает во внимание структуру и порядок предложений. Кроме того, это приводит к большой разреженной матрице. Таким образом, TF-IDF вступает в игру.
В этой серии блогов подробно рассматривается методика TF-IDF. Итак, приступим.
Цель
Техника TF-IDF дает вам соответствующий термин. Этот релевантный термин - тот, с помощью которого можно понять весь контекст, а не читать весь текст.
Интуиция
- Слово, встречающееся несколько раз, подразумевает его важность (TF).
- Но в то же время, если он слишком часто появляется в нескольких документах, он может не иметь отношения к делу (IDF). Эти слова мы можем обозначать как стоп-слова, такие как the, this и т. Д.
Теория и концепция
- TF-IDF (термин «частота-обратная частота документа») отображает важность слова. Это вычисление скалярного произведения TF и IDF. Перед этим давайте сначала разберемся с терминами по отдельности.
- Частота термина (TF):
- Он демонстрирует важность слова для документа с интуицией, что чем больше термин в документе, тем выше важность.
- Частота обратного документа (IDF):
- показывает, насколько термин актуален на самом деле. Необязательно, чтобы термин, часто используемый в некоторых документах, мог быть релевантным, например, стоп-слова (the that, of и т. Д.). Стоп-слова не раскрывают контекст, поэтому их следует избегать. IDF работает таким образом, что игнорирует их.
- Он наказывает слово, часто встречающееся в документах.
- Оценка IDF выше для соответствующего термина, но меньший вес для стоп-слова
- Учитывается натуральная логарифмическая функция, также известная как log e
- В двух словах, значение TFIDF относится к документу, а IDF зависит от корпуса
- Вычисление TF-IDF вручную отличается от TF-IDF Sklearn.
Разница: термин TF остается прежним, в то время как термин IDF отличается. Давайте нырнем!
Стандартный TF-IDF
Стандартные обозначения показаны ниже, где N - это документы в корпусе, а n - это документы, содержащие термин m.
Sklearn TF-IDF
По определению, Tfidf должен работать как указанная выше формула, но Sklearn обеспечивает более сложные вычисления. TfidfVectorizer и TfidfTransformer вычисляют иначе, чем стандарт, следующим образом:
- Добавление 1 к числителю
- Добавление 1 к знаменателю для предотвращения деления нуля
- Добавление 1 ко всему члену журнала как константа для сглаживания
- Полученные векторы TF * IDF, затем нормализованные с помощью L2 (евклидово)
Если вам интересно узнать больше, посетите эту ссылку на StackOverflow и блог с подробными сведениями.
Процесс
Давайте перейдем к делу и изучим этапы построения модели TF-IDF. Мы будем использовать стандартное обозначение уравнение-3.
corpus = «Она любит путешествовать», «Она прекрасна»
- Вычислить TF: см. уравнение 1.
TF_doc2 («есть») = 1/3
TF_doc2 («прекрасный») = 1/3
2. Вычислить IDF: см. Уравнение-3.
IDF («is») = log (2/2) = 0
IDF («lovely») = log (2/1) = 0,30
Как ясно видно, вес «is» меньше, чем «прекрасный». Таким образом, прекрасное кажется более актуальным.
- Точечное произведение слова TF и IDF:
TF-IDF («есть») = TF. IDF = (1/3) * 0 = 0
TF-IDF («прекрасный») = (1/3) * 0,3 = 0,09
Результаты показали, что слово «есть» не имеет значения, в то время как «прекрасный» имеет некоторое значение. Прочитав только слово «прекрасный», можно различить предложение.
Сводка результатов выглядит следующим образом:
Реализация
Чтобы понять модель TF-IDF, давайте сначала посмотрим, как реализовать ее вручную, а затем рассмотрим реализацию Sklearn.
- Вручную
- Давайте создадим наш корпус предложений и переведем их в нижний регистр, чтобы не различать «это» и «это».
doc = "She is a wanderlust”, “She is lovely” #Convert into lowercase doc = list(map(str.lower, doc))
- Создайте набор слов для каждого документа в корпусе
cv = CountVectorizer() count_occurrences = cv.fit_transform(corpus) #For doc1 bagOfWords_1 = dict.fromkeys(cv.get_feature_names()) for ind,key in enumerate(bagOfWords_1): bagOfWords_1[key] = count_occurrences.toarray()[0][ind] bagOfWords_1 Out[2]: {'is': 1, 'lovely': 0, 'she': 1, 'wanderlust': 1} #For doc2 bagOfWords_2 = dict.fromkeys(cv.get_feature_names()) for ind,key in enumerate(bagOfWords_2): bagOfWords_2[key] = count_occurrences.toarray()[1][ind] bagOfWords_2 Out[3]: {'is': 1, 'lovely': 1, 'she': 1, 'wanderlust': 0}
- Вычислить TF
def compute_tf(bow, doc): tf_dict ={} doc_count = len(doc) for word, count in bow.items(): tf_dict[word] = count/doc_count return tf_dict tf_doc1 = compute_tf(bagOfWords_1, corpus[0].split(' ')) tf_doc2 = compute_tf(bagOfWords_2, corpus[1].split(' ')) tf_doc1 Out[4]: {'is': 0.25, 'lovely': 0.0, 'she': 0.25, 'wanderlust': 0.25}
- Вычислить IDF
def compute_idf(docs): N = len(docs) idfDict = dict.fromkeys(docs[0].keys(),0) for doc in docs: for word, val in doc.items(): if val > 0: idfDict[word] +=1 for word, val in idfDict.items(): # standard notation idfDict[word] = math.log(N / float(val)) #sklearn notation #idfDict[word] = (math.log((N+1) / (val+1))) + 1 return idfDict idfs = compute_idf([bagOfWords_1,bagOfWords_2]) idfs Out[5]: {'is': 0.0, 'lovely': 0.6931471805599453, 'she': 0.0, 'wanderlust': 0.6931471805599453}
- Вычислить TF * IDF
def compute_tfidf(tf,idf): tfidf = {} for word, tfVal in tf.items(): tfidf[word] = tfVal * idf[word] return tfidf tfidf_doc1 = compute_tfidf(tf_doc1, idfs) tfidf_doc2 = compute_tfidf(tf_doc2, idfs) tfidf_doc1 Out[6]: {'is': 0.0, 'lovely': 0.0, 'she': 0.0, 'wanderlust': 0.17328679513998632}
2. Sklearn
Вышеуказанные шаги можно выполнить всего несколькими строками кода. Scikit-learn предоставляет библиотеку под названием TfidfVectorizer, которая вычисляет веса Tfidf.
vectorizer = TfidfVectorizer() vectors = vectorizer.fit_transform(corpus).todense() vectors """ matrix([[0.50154891, 0. , 0.50154891, 0.70490949], [0.50154891, 0.70490949, 0.50154891, 0. ]]) """
Недостатки
- Понимание контекста
Методам BagOfWords и TFIDF не хватает понимания контекста. TFIDF может расшифровать структуру предложения, но не контекст. - Большой словарный запас
В случае большого словарного запаса функции становятся настолько объемными, что бросают вызов памяти и времени.
Чтобы преодолеть указанные выше недостатки, появилась новая функция извлечения слов, которая называется «Встраивание слов». Давайте узнаем об этом в статье «Извлечение функций текста» (3/3): модель встраивания слов.
Ознакомьтесь с моим репозиторием на GitHub, в котором резюмируется весь продемонстрированный здесь код.
Кроме того, вы можете узнать больше о том, как разработать модель TF-IDF для прогнозирования настроений в обзорах фильмов через этот репозиторий GitHub.
использованная литература
Чем« TF-IDF Sklearn отличается от стандартного TF-IDF ?
Давайте посмотрим на различия и шаг за шагом проанализируем применяемый подход. для вычисления TF-IDF Sklearn в сторонуdatascience.com »
Не стесняйтесь подписываться на этого автора, если вам понравился блог, потому что этот автор заверяет вас, что вы снова вернетесь с более интересными материалами, связанными с ML / AI.
Спасибо,
Удачного обучения! 😄
Можно связаться через LinkedIn.