Основы машинного обучения — объяснение tf-idf в обработке естественного языка

NLP

Эта статья возникла из личного публичного аккаунта:TechFlow, оригинальность это не просто, прошу внимания


Сегодняшняя статья расскажет вам о простом, но всем известном алгоритме анализа текста ——TF-idf. Говорят, что этот алгоритм является важным алгоритмом в области обработки естественного языка, но поскольку он настолько известен, что, хотя я и не занимаюсь НЛП, во время интервью меня несколько раз спрашивали, что показывает важность этот алгоритм.

К счастью, сам алгоритм не сложный, хотя из названия много сомнений, но как только вы поймете принцип, все придет само собой, и вы больше не будете бояться, что не сможете вспомнить его во время собеседования. Без лишних слов, давайте к делу.


Принцип алгоритма


Середина имени TF-idf отделена разделителем, и ни TF, ни idf не похожи на имя человека, так что это фактически показывает, что алгоритм состоит из двух частей, TF и ​​idf. Давайте сначала посмотрим на часть TF.


Объяснение ТФ

Полное английское название TF — это термин «частота», а «частота» хорошо понимается как частота и частота. И этот термин жесткого перевода является значением элемента, и он фактически относится к слову или фразе в тексте по отношению к контексту. Таким образом, частота терминов равначастота фраз. На самом деле, если вы понимаете, что оно означает, то остальное можно догадаться путем догадок.

Значение его очень простое, оно буквальное, то есть важность слова в тексте связана с его частотностью.

Эта точка зрения очень интуитивна, например, когда мы ищем в Интернете».TechFlow", на выдаваемом веб-сайте нет ни одного "TechFlow", очевидно, что качество этого поиска очень низкое. Если на веб-сайте много "TechFlow", это означает, что поиск, скорее всего, будет правильным, этот веб-сайт то, что мы хотим.

В дополнение к этому, он также может отражать важность слов. Если в одном и том же тексте один термин встречается чаще другого, то в целом он явно важнее.

Говорят, что ранние поисковые системы использовали эту стратегию, которая измеряет частоту появления ключевых слов, которые ищут пользователи, в тексте каждой веб-страницы. Имеет тенденцию ранжировать высокочастотные страницы вверху, потому что страницы с самым высоким рейтингом могут получить много трафика. Поэтому, движимые интересами, все больше и больше веб-страниц имеют тенденцию встраивать большеПоиск горячих слов, чтобы получить более высокий рейтинг и больше трафика. Я считаю, что у всех был подобный опыт.Когда мы используем поисковую систему для ввода определенного ключевого слова, искомая веб-страница утверждает, что имеет релевантное совпадение, но когда мы на самом деле нажимаем на нее, мы ничего не находим или экран заполнен. рекламы.

На заре Интернета таких страниц было много, и они зарабатывали на жизнь за счет включения большего количества поисковых запросов. Из этого вытекает и техническая работа — SEO, то есть поисковая оптимизация, которая использует различные средства для оптимизации рейтинга поисковых систем для основных веб-страниц.

Вскоре эту проблему обнаружили и инженеры поисковика, и именно для решения этой проблемы было введено понятие IDF.


Концепция ЦАХАЛ


Английский IDF - это обратная частота документа, а именноЧастота обратного документа. Это понятие трудно перевести и объяснить напрямую, поэтому мы часто используем его английскую аббревиатуру. Это значит очень просто, т.Чем шире термин, тем менее важен, то есть важность Термина обратно пропорциональна широте его появления.

Например, наиболее часто используемые слова, такие как «的», «le», «yes», должны широко появляться в различных статьях, в то время как такие фразы, как «поиск» и «машинное обучение», могут появляться в меньшем количестве статей. Очевидно, для поисковых систем или каких-то других моделей этиЧем меньше слов, тем больше смысла, потому что они, как правило, означают более точное руководство.. Таким образом, IDF можно просто понимать как величину, обратную степени возникновения, и ее определение также очень простое:

\displaystyle idf_i=\log\frac{|D|}{1 + |\{j:t_i \in d_j \}|}

в|D|количество всех документов,t_ii-я фраза,|\{j:t_i \in d_j \}|Представляет количество документов, содержащих i-ю фразу. Чтобы он не был равен 0, мы добавляем к нему константу 1. Точно так же мы можем написать формулу для TF:

TF(t) = \frac{TF_i}{TN_t}

знаменательTN_tУказывает количество всех терминов, содержащихся в артикле t, числительTF_iвыражатьTerm_iколичество в документе.

Когда мы рассмотрим эти две концепции, мы обнаружим, что TF измеряет связь между фразами и документами, а idf измеряет связь между фразами и всеми документами. Другими словами, первый измеряет важность фраз для конкретного документа, а idf измеряет важность фраз для всех документов. Эти два немного похожи на отношения между частью и целым.Мы можем умножить два, чтобы получить термин, совместимый с конечной важностью двух, то есть TF-idf используется дляАлгоритм вычисления важности фразы в документе.

Алгоритм TF-idf тоже очень прост, мыУмножьте значения, рассчитанные по TF и ​​idf напрямуюВот и все.

Поняв принцип работы алгоритма, мы можем сами написать алгоритм расчета TF-idf, он не сложный, и весь процесс не превышает 40 строк:

class TFIdfCalculator:

    # 初始化方法
    def __init__(self, text=[]):
        # 自定义的文本预处理,包括停用词过滤和分词,归一化等
        self.preprocessor = SimpleTextPreprocessing()
        # 防止用户只传了单条文本,做兼容处理
        if isinstance(text, list):
            rows = self.preprocessor.preprocess(text)
        else:
            rows = self.preprocessor.preprocess([text])

        self.count_list = []
        # 使用Counter来计算词频
        for row in rows:
            self.count_list.append(Counter(row))

    # fit接口,初始化工作
    def fit(self, text):
        self.__init__(text)

    # 计算词频,即单词出现次数除以总词数
    # 用在初始化之后
    def tf(self, word, count):
        return count[word] / sum(count.values())

    # 计算包含单词的文本数量
    def num_containing(self, word):
        return sum(1 for count in self.count_list if word in count)

    # 计算idf,即log(文档数除以出现次数+1)
    def idf(self, word):
        return math.log(len(self.count_list) / (1 + self.num_containing(word)))

    # 计算tfidf,即tf*idf
    def tf_idf(self, word, count_id):
        if isinstance(count_id, int) and count_id < len(self.count_list):
            return self.tf(word, self.count_list[count_id]) * self.idf(word)
        else:
            return 0.0

Среди них SimpleTextPreprocessing — класс, который я разработал для предварительной обработки текста, включая основные операции, такие как сегментация слов, удаление стоп-слов и нормализация частей речи. Это содержание было упомянуто в предыдущей статье о Наивной байесовской классификации, Заинтересованные студенты могут щелкнуть ссылку ниже, чтобы просмотреть ее.

Основы машинного обучения — наивный байесовский код для практики классификации текстов

Давайте поэкспериментируем с кодом:

tfidf = TFIdfCalculator()
tfidf.fit(['go until jurong', 'point craze go', 'cine there got amore', 'cine point until'])
print(tfidf.tf_idf('jurong', 0))
print(tfidf.tf_idf('go', 0))

Мы создали какой-то бессмысленный текст, чтобы называть себя, и подсчитали важность слов go и jurong в первом тексте. Согласно определению TFidf, go встречается в первом и втором текстах, оно встречается больше раз, поэтому его idf меньше, а два слова встречаются в первом тексте с одинаковой частотой, поэтому jurong TFidf должно быть больше.

Конечный результат также соответствует нашим ожиданиям: TFidf джуронга составляет 0,345, а TFidf го — 0,143.


Глубокое мышление


Принцип работы TFidf мы все понимаем, код тоже написан, вроде бы полный, но на самом деле есть ключевой момент, который мы упустили. Немного странно, зачем нам вычислять значение частоты квазитекста, когда мы вычисляем idfпопросить журналШерстяная ткань? Хотя из результатов результаты после расчета лога выглядят более нормальными, а распределение более разумным. Но это результат, а не причина.В принципе, в чем причина этого лога?

На самом деле, в первые дни появления теории TFidf об этой проблеме никто не задумывался, можно сказать, что это было ошибкой. Позже великий бог дал объяснение с точки зрения теории информации Шеннона, и все это было вполне оправдано.

В предыдущей статье о выводе перекрестной энтропии мы обсуждали, что если существует событие А, количество содержащейся в нем информации равно-\log(P(A)), логарифм вероятности его возникновения. то естьЧем меньше вероятность события, тем оно информативнее.. Внешний вид этого журнала загадочен.Суть теории информации состоит в том, чтобыколичественно. Результатом квантования информации является бит, то есть двоичный бит. Все мы знаем, что двоичный бит может представлять два числа, 0 и 1, представляющие двухкомпонентную информацию. По мере увеличения числа битов количество информации, которую мы можем представить, также увеличивается, но количество информации увеличивается не линейно, апоказательрастет.

Если привести простой и классический пример, то к чемпионату мира вплотную подошли 32 команды, из которых только одна смогла победить. Если предположить, что окончательными победителями станут Франция и Испания, мы не удивимся, когда узнаем новости. И если японская команда выиграет, предполагается, что все будут удивлены. Причина этого связана с объемом информации.Все мы знаем, что хотя 32 команды на поверхности равны и у каждой есть возможность победить, на самом деле вероятность победы каждой команды различна.

Предполагая, что вероятность победы сборной Франции и Испании равна 1/4,-\log(\frac{1}{4})=2Тогда нам нужно всего 2 бита для его представления. Если предположить, что вероятность победы японской команды равна 1/128, то нам нужно 7 бит для представления, очевидно, что последняя имеет гораздо больший объем информации.

К этому моменту все поймут, что суть нашего логарифмирования состоит в том, чтобы вычислить количество бит, соответствующее количеству информации. Количество битов линейно, а количество информации экспоненциально, что означает, что мы преобразуем экспоненциальное количество информации в линейные биты. Для большинства моделей,Линейные объекты легче вписать, что является существенной причиной отличного эффекта TFidf.

Наконец, мы объясним idf с точки зрения теории информации, предполагая, что все документы в мире Интернета имеют2^{30}. Теперь пользователи ищут китайско-американскую торговую войну, и количество документов, содержащих как Китай, так и Соединенные Штаты,2^{14}, то количество информации, содержащейся в словах Китай и США, равно\log(\frac{2^{30}}{2^{14}})=16, и если количество документов, содержащих слово торговая война, всего2^6, то количество информации, содержащейся в слове торговая война, равно\log(\frac{2^{30}}{2^6})=24, то очевидно, что объем информации о слове торговая война намного больше, чем у Китая и США, поэтому он должен играть большую роль в сортировке документов.

Если вы можете объяснить принцип TFidf с точки зрения теории информации, а не просто понять принцип, то я думаю, что этот пункт знаний действительно освоен, и тогда вы сможете естественно с ним справиться, когда столкнетесь с ним на собеседовании.

На сегодняшней статье все. Если вы чувствуете, что что-то приобрели, пожалуйста, отсканируйте код и нажмитеобрати внимание наЧто ж, твое маленькое усилие много значит для меня.