25 — Газоанализатор: Описание, цена, заказ
Аналитприбор / Каталог / Продукция партнеров / Газоанализаторы портативные / BM-25 Газоанализатор
Цена: По запросу
Доставка: В любой регион
Доставка продукции осуществляется транспортными компаниями на Ваш выбор. Подробнее о доставке и оплате
Оформить заявку
Есть вопросы? Задать вопрос специалисту.
- Описание
- Фото 4
Содержание
- Описание BM-25
- Особенности BM-25
- Технические характеристики BM-25
- До 5 каналов измерения
- «Интеллектуальные» взаимозаменяемые датчики
- Ударопрочный корпус
- Четкий ЖК дисплей с подсветкой
- Мощная звуковая и световая сигнализация
- Встроенная память
Мультигазоанализатор BM-25 разработан специально для работы в трудных условиях на открытых рабочих площадках.
Особенности BM-25
- Определение 5 газов одновременно, 6 диапазонов измерения, универсальный эксплозиметр;
- Может применяться в Зоне 0, возможно постоянное питание;
- Интеллектуальные взаимозаменяемые ячейки: классические и инфракрасные;
- Эргономичность в соответствии с окружающей средой на площадке.
Технические характеристики BM-25
Назначение: | Контроль токсичных, горючих газов/кислорода |
Корпус: | Ударопрочный антистатический поликарбонат |
Определяемые газы: | От 1 до 5 см. спецификацию |
Измерения: | Непрерывные |
Датчики: | Электрохимический, термокаталитический или ИК (в зависимости от контролируемого газа) |
Дисплей: | Жидкокристаллический графический с подсветкой |
Аварийные сигналы: | Мощный звуковой (105 дБ) и визуальный аварийные сигналы |
Функция самотестирования: | Да |
Регистрация данных: | Непрерывная. В памяти хранятся результаты измерений за последний год |
Связь с ПК: | Да |
Источник питания: | Ni-MH АКБ |
Время автономной работы: | до 300 часов |
Время зарядки: | 5 часов |
Влагозащита: | IP 66 |
Температурный диапазон: | От — 25 до + 40 ?С |
Вес: | 7,5 кг |
Габаритные размеры: | 110х80х45 мм |
Рекомендуем:
MX-2100
Портативный газоанализатор
Макс. кол-во каналов: 5
Тип прибора: Переносной
Сенсор: Электрохимический, Термокаталитический, Оптический
Цифровая индикация: Да
Измерение: O2, h3, CO, CO2, SO2, h3S, CL2, NO, NO2, HCL, EX, O3, HF, Ph4
Взрывозащита: Нет
Подробнее
MX-6
Портативный газоанализатор
Макс. кол-во каналов: 6
Тип прибора: Переносной
Сенсор: Электрохимический, Термокаталитический, Оптический, Фотоионизационный
Цифровая индикация: ДаИзмерение: O2, h3, CO, CO2, SO2, h3S, NO, NO2, Nh4, HCL, EX, Ch5, Ph4
Взрывозащита: Нет
Подробнее
М-40
Портативный газоанализатор
Макс. кол-во каналов: 4
Тип прибора: Переносной
Сенсор: Электрохимический, Термокаталитический
Цифровая индикация: Да
Измерение: O2, CO, h3S, EX
Взрывозащита: Нет
Подробнее
Gasbadge Pro
Газоанализатор
Макс. кол-во каналов: 1
Тип прибора: Переносной
Сенсор: Электрохимический
Цифровая индикация: Да
Измерение: O2, CO, SO2, h3S, CL2, NO2, Nh4, Ph4
Взрывозащита: Нет
Подробнее
Алгоритм BM25 / Хабр
Впервые данный алгоритм встретил на Википедии и не обратил на него особого внимания. Позже изучая научные труды сотрудников Яндекса, я обратил внимание на то, что они ссылаются на него, например, в статье Сегаловича об алгоритмах определения нечетких дубликатов, поэтому решил разобраться, в чем смысл его использования. Постараюсь на простых примерах это объяснить. Итак, для чего этот алгоритм?
Первое. Вводится зависимость релевантности от вхождения или не вхождения слов в запросах с более чем одного слова.
Пусть есть несколько запросов состоящих из нескольких слов, например (пример чисто иллюстративный):
- купить смартфон Samsung
- купить смартфон Samsung Galaxy
Пусть сравниваются два документы (опять же иллюстративно) и первый документ не содержит слова Galaxy. Согласно расчетов оценка релевантности эта сума релевантностей каждого из слов.
Релевантность каждого из слова равна его IDF * на второй множитель в выражении выше. Релевантность всего поискового запроса равна сумме релевантностей всех слов.
Таким образом, отсутствие слова или другими словами (его частота) равна 0 дает релевантность 0. Поэтому если по двум первым словам score будет одинаково то более релевантным будет тот документ, который содержит слово Galaxy.Второе. Преимущество при поиске в запросах с более чем 2-ух слов, одно из которых менее употребительно (более узкоспециализированное) будет отдаваться документам которые содержат это узкоспециализированное слово. Например, есть запрос купить Samsung Galaxy Note 2 (чисто иллюзорный пример). Пусть Note 2 – это более редкое слово (меньше раз встречается в коллекции чем Samsung и Galaxy). Пусть есть 2-а документа каждый из которых релевантен запросу и каждый из них содержит кроме Samsung и Galaxy также Note 2. При этом в первом документе note 2 употребляется только один раз, тогда как во втором – 3 раза (подразумевается, что документ содержит больше информации о Note 2). Но сначала рассмотрим, результат вычисление релевантности алгоритмом, если частоты всех указанных слов в документах одинаковы.
Обратите также внимание, что из-за того, что количество документов содержащее слово Note 2 меньше равно в 50 раз от содержащих слово galaxy (500) мы получаем IDF равный 3,279634 что значительно больше IDF для слова galaxy.
Пока что у нас были одинаковые значения частот для слова note 2 (для других слов также). Теперь давайте в Excel увеличим частотность слова note 2 для док2, вместо 0,02 сделаем 0,05 (5 вхождений слова).
Обратите внимание, что значение IDF не изменяется но значение формула (второй множитель на изображении в самом вверху) теперь стало равно 0,061856 и именно это значение участвует в вычислении score, которое теперь для док2 равно уже 0,290559
Теперь самое главное. Увеличим частоту вхождения слова galaxy до 5 в док 1
Как мы видим суммарная частота каждого из слов в док1 и док2 одинакова. Но значение score (релевантность) выше у док2, потому что слово note2 является более редко встречающимся соответственно его результирующее влияние больше чем слово galaxy.
На практике наличие слов в многосложных запросах очень важно. Конечно же релевантность современных поисковых систем определяется не только исходя из частот как это было показано на примере формулы BM25, но все же некоторые корреляции провести можно. В основном это касается того, что если в документе нет слова из поискового запроса то такому документу значительно сложнее подняться в ТОП по запросу по сравнению с теми, у которых это слово содержится. Давайте рассмотрим пример на поисковой системе Яндекс.
Вводим запрос Samsung galaxy. У меня выдача касалась Samsung galaxy в целом (2 сайта, как обычно Википедия) остальное модели, картинки и т.д.
Вводим запрос samsung galaxy note 2. Выдача полностью меняется, теперь представлены страницы, которые содержат информацию не просто о Samsung galaxy, а о Samsung galaxy note 2.
Вводим запрос samsung galaxy note 2 ценаОпять выдача меняется теперь в выдаче страницы, которые уже содержат слово цена, а не просто Samsung galaxy.
Вводим запрос samsung galaxy note 2 цена Харьков. Выдача кардинально меняется, все страницы в ТОП10 содержат слово Харьков.
Можно ли сказать, что слово Харьков является более узкоспециализированным, как это приводилось в алгоритме BM25 выше? IDF cлова Харьков знает только поисковая система, но в контексте поискового запроса Samsung galaxy note 2 оно без сомнения сужает область поиска. Может быть пример с Яндексом немного неудачен, в силу того, что в приведенном случае большую роль будет играть учет региональности запроса, но я думаю со мной согласится любой сеошник, что слово из поискового запроса обязательно должно быть в тексте, я же всего лишь постарался показать работу алгоритма BM25 и раскрыть 2-а важных его аспекта.
Ссылка на xls документ — книга11.xls
Практический BM25 — Часть 2: Алгоритм BM25 и его переменные
Это второй пост в серии из трех частей Практический BM25 о ранжировании сходства (релевантности). Если вы только присоединяетесь, ознакомьтесь с Часть 1: Как осколки влияют на оценку релевантности в Elasticsearch. Алгоритм BM25 в происходящее. Сначала посмотрим на формулу, потом разобью каждый компонент на понятные части:
Мы видим несколько общих компонентов, таких как q i , IDF(q i ), f(q i ,D), k1, b и кое-что о длинах полей. Вот о чем каждый из них:
- q i — это i th термин запроса.
Например, если я ищу «шейн», будет только 1 термин запроса, поэтому q 0 — это «шейн». Если я ищу «shane connelly» на английском языке, Elasticsearch увидит пробел и разметит это как 2 термина: q 0 будет «шейн», а q 1 будет «коннелли». Эти термины запроса подключаются к другим битам уравнения, и все они суммируются.
- IDF(g i ) – это обратная частота документа для i -го -го термина запроса.
Для тех, кто раньше работал с TF/IDF, концепция IDF может быть вам знакома. Если нет, не беспокойтесь! (И если это так, обратите внимание, что существует разница между формулой IDF в TF/IDF и IDF в BM25. ) Компонент IDF нашей формулы измеряет, как часто термин встречается во всех документах, и «штрафует» термины, которые являются общими. . Фактическая формула, используемая Lucene/BM25 для этой части:
Где docCount — это общее количество документов, которые имеют значение для поля в сегменте (по сегментам, если вы используетеsearch_type=dfs_query_then_fetch
) и f(q i ) — количество документов, содержащих i th термин запроса. Мы можем видеть в нашем примере, что «шейн» встречается во всех 4 документах, поэтому для термина «шейн» мы получаем IDF («шейн»):
Однако мы видим, что «коннелли» появляется только в 2 документах, поэтому мы получаем IDF («коннелли»):
Здесь мы видим, что запросы, содержащие эти более редкие термины («коннелли» реже, чем «шейн» в нашем корпусе из 4 документов), имеют более высокий множитель, поэтому они вносят больший вклад в итоговую оценку. Это имеет интуитивно понятный смысл: термин «the», вероятно, встречается почти в каждом документе на английском языке, поэтому, когда пользователь ищет что-то вроде «слон», «слон», вероятно, важнее — и мы хотим, чтобы он вносил больший вклад в поисковый запрос. оценка — чем термин «the» (который будет почти во всех документах). - Мы видим, что длина поля делится на среднюю длину поля в знаменателе как fieldLen/avgFieldLen.
Мы можем рассматривать это как длину документа относительно средней длины документа. Если документ длиннее среднего, знаменатель увеличивается (уменьшается оценка), а если он короче среднего, знаменатель уменьшается (увеличивается оценка). Обратите внимание, что реализация длины поля в Elasticsearch основана на количестве терминов (а не на чем-то другом, например, на длине символа). Это точно так, как описано в исходной статье BM25, хотя у нас есть специальный флаг (discount_overlaps) для обработки синонимов, если вы того пожелаете. Об этом можно думать следующим образом: чем больше терминов в документе — по крайней мере, не соответствующих запросу — тем ниже оценка документа. Опять же, это имеет интуитивный смысл: если документ состоит из 300 страниц и в нем один раз упоминается мое имя, он с меньшей вероятностью будет иметь такое же отношение ко мне, как короткий твит, в котором я упоминается один раз.
- Мы видим переменную b, которая появляется в знаменателе и умножается на коэффициент длины поля, который мы только что обсуждали. Чем больше b, тем сильнее влияние длины документа по сравнению со средней длиной. Чтобы убедиться в этом, вы можете представить, что если вы установите b равным 0, эффект соотношения длины будет полностью сведен на нет, и длина документа не будет иметь никакого отношения к оценке. По умолчанию b имеет значение 0,75 в Elasticsearch.
- Наконец, мы видим две составляющие оценки, которые проявляются как в числителе, так и в знаменателе: k1 и f(q i ,D). Их внешний вид с обеих сторон затрудняет понимание того, что они делают, просто взглянув на формулу, но давайте быстро перейдем к делу.
- f(q i ,D) — «сколько раз термин запроса i th встречается в документе D?» Во всех этих документах f(«shane»,D) равно 1, но f(«connelly»,D) различается: 1 для документов 3 и 4, но 0 для документов 1 и 2. Если бы было 5 -й -й документ с текстом «shane shane» будет иметь значение f («shane», D) равное 2. Мы видим, что f(q i ,D) находится как в числителе, так и в знаменателе, и есть специальный множитель «k1», о котором мы поговорим далее. Если рассматривать f(q i ,D), то чем больше терминов запроса встречается в документе, тем выше будет его оценка. Это имеет интуитивно понятный смысл: документ, в котором наше имя упоминается много раз, с большей вероятностью будет связан с нами, чем документ, в котором оно упоминается только один раз.
- k1 — это переменная, которая помогает определить характеристики насыщения частоты термина. То есть он ограничивает, насколько один термин запроса может повлиять на оценку данного документа. Это достигается путем приближения к асимптоте. Вы можете увидеть сравнение BM25 с TF/IDF в этом:
Большее/меньшее значение k1 означает, что наклон кривой «tf() of BM25» изменяется. Это влияет на изменение того, как «термины, встречающиеся больше раз, добавляют дополнительные баллы». Интерпретация k1 заключается в том, что для документов средней длины именно значение частоты термина дает половину максимального балла для рассматриваемого термина. Кривая влияния tf на счет быстро растет, когда tf() ≤ k1, и все медленнее и медленнее, когда tf() > k1.Продолжая наш пример, с k1 мы контролируем ответ на вопрос «насколько больше должно добавление второго «шейна» к документу способствовать оценке, чем первое или третье по сравнению со вторым?» Более высокий k1 означает, что оценка для каждого термина может продолжать расти относительно больше для большего количества экземпляров этого термина. Значение 0 для k1 будет означать, что все, кроме IDF(q i ) отменяется. По умолчанию k1 имеет значение 1,2 в Elasticsearch.
Пересматривая наш поиск с нашими новыми знаниями
Мы удалим наш индекс людей и воссоздадим его всего с 1 сегментом, чтобы нам не пришлось использовать search_type=dfs_query_then_fetch
. Мы проверим наши знания, установив три индекса: один со значением k1 для 0 и b для 0,5 и второй индекс (люди2) со значением b для 0 и k1 для 10 и третий индекс (люди3) со значением b до 1 и k1 до 5.
УДАЛИТЬ людей ПОСТАВИТЬ людей { "настройки": { "количество_осколков": 1, "индекс" : { "сходство" : { "по умолчанию" : { "тип": "BM25", «б»: 0,5, "к1": 0 } } } } } ПОСТАВИТЬ людей2 { "настройки": { "количество_осколков": 1, "индекс" : { "сходство" : { "по умолчанию" : { "тип": "BM25", "б": 0, «Л1»: 10 } } } } } ПОСТАВИТЬ людей3 { "настройки": { "количество_осколков": 1, "индекс" : { "сходство" : { "по умолчанию" : { "тип": "BM25", "б": 1, «к1»: 5 } } } } }
Теперь добавим несколько документов во все три индекса:
POST люди/_doc/_bulk { "индекс": { "_id": "1" } } { "название": "Шейн" } { "индекс": { "_id": "2" } } { "название": "Шейн Си" } { "индекс": { "_id": "3" } } { "title": "Шейн П. Коннелли" } { "индекс": { "_id": "4" } } { "title": "Шейн Коннелли" } { "индекс": { "_id": "5" } } { "title": "Шейн Шейн Коннелли Коннелли" } { "индекс": { "_id": "6" } } { "title": "Шейн Шейн Шейн Коннелли Коннелли Коннелли" } POST люди2/_doc/_bulk { "индекс": { "_id": "1" } } { "название": "Шейн" } { "индекс": { "_id": "2" } } { "название": "Шейн Си" } { "индекс": { "_id": "3" } } { "title": "Шейн П. Коннелли" } { "индекс": { "_id": "4" } } { "title": "Шейн Коннелли" } { "индекс": { "_id": "5" } } { "title": "Шейн Шейн Коннелли Коннелли" } { "индекс": { "_id": "6" } } { "title": "Шейн Шейн Шейн Коннелли Коннелли Коннелли" } POST люди3/_doc/_bulk { "индекс": { "_id": "1" } } { "название": "Шейн" } { "индекс": { "_id": "2" } } { "название": "Шейн Си" } { "индекс": { "_id": "3" } } { "title": "Шейн П. Коннелли" } { "индекс": { "_id": "4" } } { "title": "Шейн Коннелли" } { "индекс": { "_id": "5" } } { "title": "Шейн Шейн Коннелли Коннелли" } { "индекс": { "_id": "6" } } { "title": "Шейн Шейн Шейн Коннелли Коннелли Коннелли" }
Теперь, когда мы делаем:
ПОЛУЧИТЬ /люди/_поиск { "запрос": { "соответствовать": { "название": "Шейн" } } }
Мы видим у людей, что все документы имеют оценку 0,074107975. Это соответствует нашему пониманию установки k1 на 0: для оценки имеет значение только IDF поискового запроса!
Теперь проверим people2, у которого b = 0 и k1 = 10:
ПОЛУЧИТЬ /people2/_search { "запрос": { "соответствовать": { "название": "Шейн" } } }
Из результатов этого поиска следует сделать вывод о двух вещах.
Во-первых, мы видим, что результаты упорядочены исключительно по количеству появлений «шейн». Документы 1, 2, 3 и 4 получили «шейн» один раз и, таким образом, имеют одинаковую оценку 0,074107975. Документ 5 имеет «шейн» дважды, поэтому имеет более высокий балл (0,13586462) благодаря f («шейн», D5) = 2, а документ 6 снова имеет более высокий балл (0,18812023) благодаря f («шейн», D6) = 3. Это согласуется с нашей интуицией, когда мы устанавливаем b равным 0 в people2: длина — или общее количество терминов в документе — не влияет на оценку; только количество и релевантность совпадающих терминов.
Во-вторых, следует отметить, что разница между этими оценками нелинейна, хотя для этих 6 документов она кажется довольно близкой к линейной.
- Разница в оценке между NO вхождениями из нашего поискового термина, а первая — 0,074107975
- Разница в оценке между добавлением секунды нашего поиска и первого — 0,13586462 — 0,074107975 = 0,06175666664586462 — 0,074107975 = 0,06117666664586462 — 0,074107975 = 0,06117666664586462 — 0,074107975 = 0,06176666664586462 — 0,074107975 = 0,0617666666456462 — 0,074107975. разница между добавлением третье вхождение нашего поискового запроса, а второе 0,18812023 — 0,13586462 = 0,05225561
0,074107975 довольно близко к 0,061756645, что довольно близко к 0,05225561, но они явно уменьшаются. Причина, по которой это выглядит почти как линейных, заключается в том, что k1 велико. По крайней мере, мы можем видеть, что оценка не увеличивается линейно с дополнительными вхождениями — если бы они были, мы ожидали бы увидеть ту же разницу с каждым дополнительным термином. Мы вернемся к этой идее после проверки людей3.
Теперь проверим people3, у которого k1 = 5 и b = 1:
GET /people3/_search { "запрос": { "соответствовать": { "название": "Шейн" } } }
Возвращаем следующие хиты:
"попадания": [ { "_index": "люди3", "_тип": "_doc", "_id": "1", "_score": 0,16674294, "_источник": { "title": "Шейн" } }, { "_index": "люди3", "_тип": "_doc", "_id": "6", "_score": 0,10261105, "_источник": { "title": "Шейн Шейн Шейн Коннелли Коннелли Коннелли" } }, { "_index": "люди3", "_тип": "_doc", "_id": "2", "_score": 0,102611035, "_источник": { "title": "Шейн Си" } }, { "_index": "люди3", "_тип": "_doc", "_id": "4", "_score": 0,102611035, "_источник": { "title": "Шейн Коннелли" } }, { "_index": "люди3", "_тип": "_doc", "_id": "5", "_score": 0,102611035, "_источник": { "title": "Шейн Шейн Коннелли Коннелли" } }, { "_index": "люди3", "_тип": "_doc", "_id": "3", "_score": 0,074107975, "_источник": { "title": "Шейн П. Коннелли" } } ]
Мы можем видеть на примере людей3, что теперь отношение совпадающих терминов («шейн») к несовпадающим — это единственное, что влияет на относительную оценку. Таким образом, такие документы, как документ 3, в котором только 1 термин соответствует из 3 баллов ниже 2, 4, 5 и 6, все из которых соответствуют ровно половине терминов, и все они имеют меньшие баллы, чем документ 1, который точно соответствует документу.
Опять же, мы можем отметить, что существует «большая» разница между документами с наивысшей оценкой и документами с более низкой оценкой для людей2 и людей3. Это благодаря (опять же) большому значению k1. В качестве дополнительного упражнения попробуйте удалить людей2/людей3 и снова установить для них что-то вроде k1 = 0,01, и вы увидите, что оценки между документами с меньшим количеством документов меньше. При b = 0 и k1 = 0,01:
- The score difference between having no occurrences of our search term and the first is 0. 074107975
- The score difference between adding a second occurrence of our search term and the first is 0.074476674 — 0.074107975 = 0.000368699
- The score разница между добавлением третьего вхождения нашего поискового термина и второго составляет 0,07460038 — 0,074476674 = 0,000123706
Таким образом, при k1 = 0,01 мы видим, что влияние оценки каждого дополнительного вхождения падает намного быстрее, чем при k1 = 5 или k1 = 10. 4 9Вхождение 0027-й добавит к счету гораздо меньше, чем 3 -й -й и так далее. Другими словами, при этих меньших значениях k1 показатели термина насыщаются гораздо быстрее. Как мы и ожидали!
Надеюсь, это поможет увидеть, что эти параметры делают с различными наборами документов. Обладая этими знаниями, мы затем перейдем к тому, как выбрать подходящие b и k1 и как Elasticsearch предоставляет инструменты для понимания оценок и повторения вашего подхода.
Продолжите эту серию: Часть 3: Рекомендации по выбору b и k1 в Elasticsearch
BM25 Релевантность Lucene следующего поколения
Есть что-то новое в том, как Lucene оценивает текст. Вместо традиционного «TF*IDF» Lucene просто переключилась на что-то под названием BM25 в багажнике. Это означает новую формулу оценки для Solr (Solr 6) и Elasticsearch в будущем.
Звучит круто, но что все это значит? В этой статье я хочу дать вам обзор того, как переключение может быть благом для ваших приложений Solr и Elasticsearch. Каким был оригинальный TF*IDF? Как это работает? Чем новый BM25 лучше? Как вы его настраиваете? Подходит ли BM25 для всего?
BM25 и TF*IDF лежат в основе функции ранжирования. Они составляют то, что Lucene называет «весом поля». Вес поля измеряет, сколько совпадающего текста относится к поисковому запросу.
Classic Lucene Сходство: что такое TF*IDF?
TF*IDF — это грубый способ примерно оценить, как пользователи оценивают релевантность текстового соответствия. Интуиция, лежащая в основе TF*IDF, довольно прямолинейна и опирается на два основных фактора, заложенных в названии формулы оценки, которые, как правило, соответствуют тому, как человеческий разум склонен оценивать релевантность поиска:
- Частота термина, также известного как tf: как часто в статье встречается слово «собака»? 3 раза? 10 раз?
- Обратная частота документа, также известная как idf: частота документа измеряет, в скольких документах появляется термин. Обратная частота документа (
1/df
) измеряет, насколько особенным является термин. Является ли термин «собака» очень редким (встречается только в одном документе)? Или относительно часто (встречается почти во всех документах)?
Другими словами, TF*IDF измеряет относительную концентрацию термина в данном фрагменте текста. Если слово «собака» часто встречается в этой статье, но относительно редко где-либо еще, то оценка TF*IDF будет высокой. Эту статью следует считать очень актуальной для поискового запроса «собака». Если слово «собака» встречается здесь один раз, но очень заметно во многих других документах, его оценка будет относительно низкой.
Еще одна мера — длина текста. Слово «собака», встречающееся дважды в книге на 500 страниц, почти ничего не говорит о том, насколько эта книга посвящена «собаке». Однако «собака», встречающаяся дважды в коротком твите, означает, что твит во многом посвящен «собаке»! Таким образом, вводится дополнительное смещение, называемое «нормами поля». Этот вклад дает значительный уклон в сторону сопоставления более коротких документов с более длинными документами. Термины более «концентрированы» в более коротком документе, поэтому этот более короткий документ, скорее всего, будет посвящен искомому термину и, следовательно, должен быть оценен выше.
Классический Lucene Сходство: подделка TF*IDF
Благодаря постоянным экспериментам в области информационного поиска (академическая сторона поиска) пришли к выводу, что необработанные значения TF IDF не совсем соответствуют интуитивным представлениям пользователей о релевантности. Если в статье шесть раз упоминается «собака», будет ли она в два раза релевантнее статьи, в которой «собака» упоминается 3 раза? Большинство пользователей говорят, что нет. Конечно, статья, в которой слово «собака» упоминается 6 раз, может быть более актуальной, но не в два раза более актуальной. Аналогичные соображения вступают в игру для IDF термина. Термин, встречающийся в 500 документах, не является в два раза более особенным, чем термин, встречающийся в 1000.
Вместо этого TF*IDF
изменен так, что TF, IDF и длина поля не берутся напрямую. Вместо TF напрямую в формулу подсчета очков берется sqrt(TF)
. Документы с вдвое большим количеством терминов, чем в другом документе, не в два раза релевантнее. Вместо этого вы получаете оценку TF, рассчитанную следующим образом:
Raw TF | Оценка ТФ |
---|---|
1 | 1,0 |
2 | 1,141 |
4 | 2,0 |
8 | 2,828 |
16 | 4,0 |
Хорошо, здесь с TF, документ с 16 терминами примерно в два раза более релевантен, чем документ с 4.
Точно так же пользователи не считают термины, которые встречаются только в 10 документах, в десять раз более особенными, чем те, которые встречаются в 100 документы. Вместо этого оценка IDF вычисляется как
log ( numDocs / docFreq + 1) + 1
Здесь numDocs — количество документов в корпусе. Например, для numDocs=1000 это соответствует::
Raw DF | Оценка ЦАХАЛа |
---|---|
1 | 7,214 |
2 | 6.809 |
4 | 6,298 |
64 | 3,733 |
128 | 3,048 |
256 | 2,359 |
Растет медленнее. Здесь термин, встречающийся только в 4 документах, примерно в два раза более специфичен, чем термин, встречающийся в 64 документах. Опять же, это интуитивно понятно большинству пользователей.
Как насчет влияния длины документа? Как это вычисляется? Это вычисляется на основе другой простой формулы, которая также , кажется, работает с ожиданиями пользователя :).
1 / кв.(длина)
Необработанная длина | Оценка норм поля |
---|---|
1 | 1,0 |
2 | 0,707 |
4 | 0,5 |
64 | 0,125 |
128 | 0,088 |
256 | 0,0625 |
Таким образом, документ длиной 128 примерно в десять раз менее релевантен, чем совпадение в документе длиной 1. Это имеет своего рода смысл, основанный на нашей интуиции: если вы сопоставите единственный термин в длинном документе, что ж, этот документ абсолютно полностью посвящен этому термину! В документе длиной 128 слов это один из множества терминов, и не обязательно, о чем этот документ.
Classic Lucene Сходство Все вместе…
Общая формула:
Оценка IDF * Оценка TF * fieldNorms
или
log(numDocs / (docFreq + 1)) * sqrt(tf) * (1/sqrt(length) ))
с оговорками
- numDocs на самом деле maxDocs, который часто считает удаленные документы
- fieldNorms вычисляются и сохраняются как 8-битное значение с плавающей запятой. Что является ужасной точностью и создает множество забавных задач!
Введите BM25: Следующее поколение TF*IDF
BM25 улучшает TF*IDF. BM25 означает «Лучший матч 25». Выпущенный в 1994 году, это 25-я итерация настройки вычисления релевантности. BM25 уходит своими корнями в вероятностный поиск информации. Вероятностный поиск информации сам по себе является увлекательной областью. По сути, релевантность рассматривается как вероятностная проблема. Оценка релевантности, согласно вероятностному поиску информации, должна отражать вероятность того, что пользователь сочтет результат релевантным. Это тема, которая заслуживает отдельного поста в блоге, поэтому я не буду ее здесь освещать!
Вместо того, чтобы углубляться в очень увлекательную теорию, я предпочел бы интуитивно обсудить, как использовать BM25. Вы увидите, какую форму принимает ранжирование, хотя с математической точки зрения это выглядит пугающе, но на самом деле имеет большой интуитивный смысл.
Взгляд BM25 на АОИ
Хорошо, сначала давайте уберем АОИ с дороги. На графике IDF BM25 очень похож на IDF классического Lucene. Единственная причина различия здесь заключается в том, что он получен из вероятностного поиска информации. Lucene вносит одно изменение в обычный IDF BM25. IDF BM25 может давать отрицательные оценки терминам с очень высокой частотой документов. Таким образом, IDF в Lucene BM25 делает удивительный трюк, чтобы решить эту проблему. Они добавляют 1 к значению, прежде чем взять журнал, что делает невозможным вычисление отрицательного значения. Конечным результатом является IDF, который очень похож на текущую кривую IDF Lucene, как показано на следующем графике.
Так что для АОИ не так много сюрпризов. Нам не нужно менять свое представление об АОИ в БМ25. Что еще более увлекательно, если вы увидите (опять же вне рамок этого поста), как IDF выводится из теории вероятностей.
Взгляд BM25 на TF
Теперь давайте посмотрим на частоту терминов. Было бы немного неправдой рассматривать частоту терминов изолированно, но мы попытаемся в целях демонстрации построить более крупную формулу BM25.
Частота терминов в BM25 ослабляет влияние частоты терминов даже больше, чем традиционный TF*IDF. Влияние частоты терминов всегда увеличивается, но асимптотически приближается к значению.
Без учета длины документа частота терминов следует формуле
((k + 1) * tf) / (k + tf)
, как показано на графике ниже:
Как видите, эта кривая приближается к ( k + 1) асимптотически (здесь k=1,2). Дает действительно интересный эффект. Больше tf
всегда значит больше актуальности. Однако вы быстро сталкиваетесь с убывающей отдачей. Вы никогда не проходите мимо k, но всегда приближаетесь к нему! С другой стороны, классический Lucene tf постоянно увеличивается и никогда не достигает точки насыщения.
Что это за значение k? Для BM25 k часто устанавливается равным 1,2. Большинство оставляют k в покое. Однако изменение k может быть полезным подходом к настройке для изменения воздействия на TF. Очевидно, что изменение k приводит к смещению асимптоты. Однако более важно то, что чем выше k, тем больше времени требуется TF для достижения насыщения. Растягивая точку насыщения, вы увеличиваете разницу релевантности между документами с более высокой и более низкой частотой терминов!
Как BM25 использует длину документа?
Последний раздел был полезной ложью. Приведенный выше показатель TF дополнительно зависит от того, превышает ли длина документа среднюю длину документа в корпусе.
Как это выглядит? Что ж, давайте возьмем формулу TF из предыдущего примера, введя две переменные: константу b
и значение длины L
. Взяв приведенную выше формулу и добавив (1,0 - b + b * L)
как кратное k в знаменателе.
((k + 1) * tf) / (k * (1.0 - b + b * L) + tf)
Здесь L
— это длина документа относительно средней длины документа. L
равно 2, если оцениваемый документ в два раза превышает среднюю длину документа корпуса. L
равен 0,1, если оцениваемый документ составляет одну десятую средней длины документа. Таким образом, L
фактически представляется как |d|/avgDl
– длина этого документа, деленная на среднюю длину документа.
Как вы можете видеть на графике, конечный результат для различных значений L
заключается в том, что более короткие документы достигают асимптоты намного быстрее. Они почти сразу насыщаются до максимально возможного показателя TF. Это имеет смысл, короткие документы имеют меньше терминов. Чем больше совпадений в этих коротких документах, тем больше вы можете быть уверены в их актуальности. Так цифра растет быстрее. С другой стороны, для длинной книги требуется гораздо больше совпадений, чтобы добраться до точки, в которой мы можем чувствовать себя уверенно. Поэтому достижение «максимальной релевантности» занимает больше времени.
Константа b
позволит нам точно настроить влияние значения L
на подсчет очков. Обратите внимание, что в приведенной выше формуле a b
, равное 0, полностью устраняет влияние L
, возвращаясь к формуле из предыдущего раздела. Чем выше значение b
, тем больше влияние длины документа на оценку. Другими словами, в классическом TF*IDF
вы всегда отключали нормы для поля, чтобы исключить влияние длины поля. Здесь вы можете просто установить b равным 0 для подобия, чтобы убрать влияние длины поля.
Все вместе
Когда BM25 берется все вместе:
IDF * ((k + 1) * tf) / (k * (1. 0 - b + b * (|d|/avgDl)) + tf)
Вы можете понять, почему мы начали с нуля здесь!
Подходит ли BM25 для всего?
Я реально впечатлен БМ25. Я использовал его в проекте O’Reilly Library для поиска фрагментов книг. Здесь много мудрости! Насыщение частоты термина имеет большой смысл. Так же модулирует влияние длины поля.
Но они по-прежнему имеют смысл для фрагментов текста размером со статью. Не все, что мы ищем, — это посты в блогах или страницы Википедии. Используемое сходство должно меняться в зависимости от того, что вы сравниваете. Поля заголовков, например, имеют свои собственные странности. Действительно, размещенные поисковые сервисы Algolia и SwiftType частично зарабатывают на том, что они действительно хороши в поиске коротких сниппетов.
Итак, мой приятель Алекс из Solr Start спросил меня — подходит ли BM25 для всех? Для всего? Это огромное улучшение основной проблемы поиска документов. Но по краям для поиска чисел, изображений и других объектов выигрыш не ясен.