[Перевод] О том, что происходит, когда в поиске Google используют слово «vs»

Случалось у вас такое: ищете что-нибудь в Google и вводите после искомого слова «vs», надеясь на то, что поисковик автоматически предложит вам что-то, немного похожее на то, что вам нужно?

1d2152ae0acae49abab98be51120a539.png


Ввод «vs» после искомого слова

Со мной такое бывало.

Как оказалось, это — большое дело. Это — приём, который, при поиске альтернативы чему-либо, способен сэкономить массу времени.
Я вижу 3 причины, по которым этот приём отлично себя показывает в том случае, если его используют для поиска сведений о технологиях, неких разработках и концепциях, в которых хотят разобраться:

  1. Лучший способ изучить что-то новое заключается в том, чтобы выяснить, чем это, новое, похоже на то, что уже известно, или чем новое от известного отличается. Например, в списке предложений, появляющемся после «vs», можно увидеть что-то такое, о чём можно сказать: «А, так, оказывается, то, что я ищу, похоже на это, мне уже знакомое».
  2. Это — простой приём. Для того чтобы им воспользоваться нужно, в буквальном смысле, несколько секунд.
  3. Слово «vs» — это чёткое указание, говорящее Google о том, что пользователя интересует прямое сравнение чего-то с чем-то. Тут можно воспользоваться и словом «or», но оно далеко не так сильно выражает намерение сравнить что-то с чем-то. Поэтому, если воспользоваться «or», Google выдаст список предложений, в котором более вероятно появление чего-то постороннего.


4c0a5cc3580c7494c62d90b9f0864155.png


Обрабатывая запрос «bert or», Google выдаёт предложения, касающиеся «Улицы Сезам». А запрос «bert vs» даёт подсказки по Google BERT

Это заставило меня задуматься. А что если взять те слова, что Google предложил после ввода «vs», и поискать по ним, тоже добавляя после них «vs»? Что если повторить это несколько раз? Если так, можно получить симпатичный сетевой граф связанных запросов.

Например, он может выглядеть так.

e260aa4db72d739b40c3cb8c1f5bb7b4.png


Эго-граф для запроса bert с радиусом 25

Это — весьма полезная методика создания ментальных карт технологий, разработок или идей, отражающих взаимосвязь подобных сущностей.

Расскажу о том, как строить такие графы.

Автоматизация сбора «vs»-данных из Google


Вот ссылка, которую можно использовать для того чтобы получить от Google предложения по автозавершению запроса в формате XML. Эта возможность не выглядит как API, предназначенный для широкого использования, поэтому, вероятно, не стоит слишком сильно налегать на эту ссылку.

http://suggestqueries.google.com/complete/search?&output=toolbar&gl=us&hl=en&q=


URL-параметр output=toolbar указывает на то, что нас интересуют результаты в формате XML, gl=us задаёт код страны, hl=en позволяет указать язык, а конструкция q= — это как раз то, для чего нужно получить результаты автозавершения.

Для параметров gl и hl используются стандартные двухбуквенные идентификаторы стран и языков.

Давайте со всем этим поэкспериментируем, начав поиск, скажем, с запроса tensorflow.

Первый шаг работы заключается в том, чтобы обратиться по указанному URL, воспользовавшись следующей конструкцией, описывающей запрос: q=tensorflow%20vs%20. Вся ссылка при этом будет выглядеть так:

http://suggestqueries.google.com/complete/search?&output=toolbar&gl=us&hl=en&q=tensorflow%20vs%20


В ответ мы получим XML-данные.

Что делать с XML?


Теперь нужно проверить полученные результаты автозавершения на соответствие некоему набору критериев. С теми, которые нам подойдут, мы продолжим работу.

ea3000399079d26a3d147ce42d4e8b18.png


Проверка полученных результатов

Я, при проверке результатов, пользовался следующими критериями:

  • Рекомендованный поисковый запрос не должен содержать текст исходного запроса (то есть — tensorflow).
  • Рекомендация не должна включать в себя запросы, которые были признаны подходящими ранее (например — pytorch).
  • Рекомендация не должна включать в себя несколько слов «vs».
  • После того, как найдено 5 подходящих поисковых запросов, все остальные уже не рассматриваются.


Это — лишь один из способов «очистки» полученного от Google списка рекомендаций по автозавершению поискового запроса. Я, кроме того, иногда вижу пользу в том, чтобы выбирать из списка только рекомендации, состоящие исключительно из одного слова, но использование этого приёма зависит от каждой конкретной ситуации.

Итак, используя этот набор критериев, мы получили 5 следующих результатов, каждому из которых присвоен определённый вес.

a0b257ac65237bbacb90bea25af773df.png


5 результатов

Следующая итерация


Затем эти 5 найденных рекомендаций подвергают такой же обработке, какой был подвергнут исходный поисковый запрос. Их передают API с использованием слова «vs» и опять выбирают 5 результатов автозавершения, соответствующих вышеозначенным критериям. Вот результат такой обработки вышеприведённого списка.

ce3ede79d6a45ad14e8df6c3c098a76a.png


Поиск результатов автозавершения для уже найденных слов

Этот процесс можно продолжать, изучая ещё не исследованные слова из столбца target.

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

Эго-графы


Сетевой граф, который я вам показывал в начале статьи, это — так называемый эго-граф (ego graph), построенный, в нашем случае, для запроса tensorflow. Эго-граф — это такой граф, все узлы которого находятся на каком-то расстоянии от узла tensorflow. Это расстояние не должно превышать заданного расстояния.

А как определяется расстояние между узлами?

Давайте сначала посмотрим на готовый граф.

362b260eefff5077a222ba4f9fb966b3.png


Эго-граф для запроса tensorflow с радиусом 22

Вес ребра (weight), соединяющего запрос A и B, мы уже знаем. Это — ранг рекомендации из списка автозавершения, изменяющийся от 1 до 5. Для того чтобы сделать граф неориентированным, можно просто сложить веса связей между вершинами, идущими в двух направлениях (то есть — от A к B, и, если такая связь есть, от B к A). Это даст нам веса рёбер в диапазоне от 1 до 10.

Длина ребра (distance), таким образом, будет вычисляться по формуле 11 — вес ребра. Мы выбрали здесь число 11 из-за того, что максимальный вес ребра — 10 (ребро будет иметь такой вес в том случае, если обе рекомендации появляются на самом верху списков автозавершения друг для друга). В результате минимальным расстоянием между запросами будет 1.

Размер (size) и цвет (color) вершины графа определяется количеством (count) случаев, в которых соответствующий запрос появляется в списке рекомендаций. В результате получается, что чем больше вершина — тем важнее представляемая ей концепция.

Рассматриваемый эго-граф имеет радиус (radius) 22. Это означает, что добраться до каждого запроса, начиная с вершины tensorflow, можно, пройдя расстояние, не превышающее 22. Взглянем на то, что произойдёт, если увеличить радиус графа до 50.

0d11bfc773ef992b04fefa97e51a4ac7.png


Эго-граф для запроса tensorflow с радиусом 50

Интересно получилось! Этот граф содержит большинство базовых технологий, о которых надо знать тем, кто занимается искусственным интеллектом. При этом названия этих технологий логически сгруппированы.

И всё это построено на основе одного единственного ключевого слова.

Как рисовать подобные графы?


Я, для рисования такого графа, использовал онлайн-инструмент Flourish.

Этот сервис позволяет строить сетевые графики и другие диаграммы с помощью простого интерфейса. Полагаю, на него вполне стоит взглянуть тем, кого интересует построение эго-графов.

Как создать эго-граф с заданным радиусом?


Для создания эго-графа с заданным радиусом можно воспользоваться Python-пакетом networkx. В нём есть очень удобная функция ego_graph. Радиус графа указывают при вызове этой функции.

import networkx as nx

#Формат исходных данных
#nodes = [('tensorflow', {'count': 13}),
# ('pytorch', {'count': 6}),
# ('keras', {'count': 6}),
# ('scikit', {'count': 2}),
# ('opencv', {'count': 5}),
# ('spark', {'count': 13}), ...]

#edges = [('pytorch', 'tensorflow', {'weight': 10, 'distance': 1}),
# ('keras', 'tensorflow', {'weight': 9, 'distance': 2}),
# ('scikit', 'tensorflow', {'weight': 8, 'distance': 3}),
# ('opencv', 'tensorflow', {'weight': 7, 'distance': 4}),
# ('spark', 'tensorflow', {'weight': 1, 'distance': 10}), ...]

#Построить исходный полный граф
G=nx.Graph()
G.add_nodes_from(nodes)
G.add_edges_from(edges)

#Построить эго-граф для 'tensorflow'
EG = nx.ego_graph(G, 'tensorflow', distance = 'distance', radius = 22)

#Найти двусвязные подграфы
subgraphs = nx.algorithms.connectivity.edge_kcomponents.k_edge_subgraphs(EG, k = 3)

#Получить подграф, содержащий 'tensorflow'
for s in subgraphs:
    if 'tensorflow' in s:
        break
pruned_EG = EG.subgraph(s)

ego_nodes = pruned_EG.nodes()
ego_edges = pruned_EG.edges()


Я, кроме того, воспользовался тут ещё одной функцией — k_edge_subgraphs. Она применяется для удаления некоторых результатов, которые не соответствуют нашим нуждам.

Например, storm — это опенсорсный фреймворк для распределённых вычислений в реальном времени. Но это — ещё и персонаж из вселенной Marvel. Как вы думаете, какие поисковые подсказки «победят», если ввести в Google запрос «storm vs»?

Функция k_edge_subgraphs находит группы вершин, которые невозможно разделить, выполнив k или меньшее число действий. Как оказалось, тут хорошо показывают себя значения параметров k=2 и k=3. Остаются, в итоге, только те подграфы, которым принадлежит tensorflow. Это позволяет обеспечить то, что мы не слишком удаляемся от того, с чего начали поиск, и не уходим в слишком далёкие области.

Использование эго-графов в жизни


Давайте отойдём от примера с tensorflow и рассмотрим другой эго-граф. В этот раз — граф, посвящённый ещё кое-чему такому, что меня интересует. Это — шахматный дебют, получивший название «Испанская партия» (Ruy Lopez chess opening).

▍Исследование шахматных дебютов


bb97f623db9544a8a27a546e662fbdb1.png


Исследование «Испанской партии» (ruy lopez)

Наша методика позволила быстро обнаружить самые распространённые идеи дебютов, что может помочь исследователю шахмат.

Теперь давайте рассмотрим другие примеры использования эго-графов.

▍Здоровое питание


Капуста! Вкуснятина!

Но что если у вас возникло желание заменить прекрасную, несравненную капусту на что-то другое? Вам в этом поможет эго-граф, построенный вокруг капусты (kale).

d883526b21ef4f59118c369e06fb55da.png


Эго-граф для запроса kale с радиусом 25

▍Покупаем собаку


Собак так много, а времени так мало… Мне нужна собака. Но какая? Может — что-то вроде пуделя (poodle)?

14f6b95e38ed51280cdc8e23dadcfb04.png


Эго-граф для запроса poodle с радиусом 18

▍Ищем любовь


Собака и капуста ничего не меняют? Нужно найти свою вторую половину? Если так — вот маленький, но весьма самодостаточный эго-граф, который может в этом помочь.

90fa481c8ffcc66aeec545b2631bcccd.png


Эго-граф для запроса coffee meets bagel с радиусом 18

▍Что делать, если приложения для знакомств ничем не помогли?


Если приложения для знакомств оказались бесполезными, стоит, вместо того, чтобы в них зависать, посмотреть сериал, запасшись мороженым со вкусом капусты (или со вкусом недавно обнаруженной рукколы). Если вам нравится сериал «The Office» (безусловно, тот, что снят в Великобритании), то вам могут понравиться и некоторые другие сериалы.

0f02add3cf8639300d52092ba4ee0b16.png


Эго-граф для запроса the office с радиусом 25

Итоги


На этом я завершаю рассказ об использовании слова «vs» в поиске Google и об эго-графах. Надеюсь, вам всё это хотя бы немного поможет в поиске любви, хорошей собаки и здоровой еды.

Пользуетесь ли вы какими-нибудь необычными приёмами при поиске в интернете?

guabcgmwuqoopx1ar80sjpz6keq.png

de0yl-6ppopvisr_a80b4yuhjj8.png

© Habrahabr.ru