Есть ли способ обнаружить строки, такие как putjbtghguhjjjanika? - PullRequest
62 голосов
/ 09 июня 2011

Люди ищут на моем сайте, и вот некоторые из этих поисков:

tapoktrpasawe
qweasd qwa as
aıe qwo ıak kqw
qwe qwe qwe a

У меня вопрос, есть ли способ обнаружить строки, похожие на строки выше?

Полагаю, невозможно обнаружить 100% из них, но приветствуется любое решение:)

редактировать: я имею в виду "бредовые поиски". Например, некоторые люди ищут в моей поисковой системе такие строки, как «asdqweasdqw», «paykaprkg», «iwepr wepr ow», и я хочу обнаруживать неровные поиски.

Не имеет значения, будет ли результат поиска 0 или что-то еще. Я не могу использовать эту логику.

Некоторые новые бренды или продукты будут игнорироваться, если я рассмотрю «обычные слова».

Спасибо за вашу помощь

Ответы [ 8 ]

148 голосов
/ 09 июня 2011

Вы можете построить модель перехода от символа к символу из набора текста на английском языке.Так, например, вы узнаете, как часто встречается «h» после «t» (довольно часто).В английском вы ожидаете, что после «q» вы получите «u».Если вы получите «q», за которым следует что-то отличное от «u», это произойдет с очень низкой вероятностью, и, следовательно, это должно быть довольно тревожным.Нормализуйте счет в ваших таблицах, чтобы у вас была вероятность.Затем для запроса пройдитесь по матрице и вычислите произведение переходов, которые вы делаете.Затем нормализуйте по длине запроса.Когда число невелико, у вас, скорее всего, есть бессмысленный запрос (или что-то на другом языке).

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

Для справки прочитайте о Марковских цепях .

Правка, я реализовал это здесь, в Python:

https://github.com/rrenaud/Gibberish-Detector

и buggedcom переписал его на PHP:

https://github.com/buggedcom/Gibberish-Detector-PHP

my name is rob and i like to hack True
is this thing working? True
i hope so True
t2 chhsdfitoixcv False
ytjkacvzw False
yutthasxcvqer False
seems okay True
yay! True
10 голосов
/ 09 июня 2011

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

8 голосов
/ 09 июня 2011

Вы можете сделать , что делает Stackoverflow и вычислить энтропию строки .

Конечно, это только одна из многих эвристических процедур, которые SO использует для определения низкого уровнякачественные ответы, и на них нельзя полагаться как на 100% точных.

5 голосов
/ 09 июня 2011

Я думаю, вы могли бы обнаружить эти строки так же, как вы могли бы обнаружить «обычные слова».Это просто сопоставление с шаблоном, нет?

Что касается , почему пользователи ищут эти строки, это более важный вопрос.Возможно, вам удастся избежать идиотского поиска другим способом.Например, если это спам-комментарии в комментариях, которые ищут люди (или сценарий), то установите CAPTCHA.

Edit : Еще одна попытка интерпретации ввода заключается в его ограничении.немного.Разрешить поиск каждые 10 секунд или около того.(Я помню, что видел это в программном обеспечении форума, а также в различных местах на SO.) Это отнимает часть удовольствия от поиска sdfpjheroptuhdfj снова и снова, и в то же время не будет мешатьс пользователями, которые ищут и находят свои вещи.

3 голосов
/ 09 июня 2011

Как прокомментировали некоторые люди, в google нет показов по tapoktrpasawe или putjbtghguhjjjanika (ну, конечно, теперь есть), так что если у вас есть способ сделать быстрый поиск в Google через API, вы можете отказаться от любого поискаусловия, которые не дали результатов Google и не были названиями одного из ваших продуктов.Почему вы хотели бы сделать это совсем другой вопрос - вы пытаетесь сэкономить усилия для вашей библиотеки поиска?Сделайте свой ручной обзор "популярных поисковых терминов" более значимым?Или вы просто разочарованы необъяснимым поведением некоторых людей в большом широком интернете?Если это последнее, мой совет просто отпустить, даже если есть способ предотвратить это.Придет какая-то другая странность.

2 голосов
/ 19 июня 2018

Краткий ответ - Jibberish Search

Вероятностная модель языка работает.

Логика

Слово состоит из последовательности символов, и если 2 символа встречаются чаще, и если мы суммируем все частоты двух смежных символов, объединяющихся вслово, и сумма пересекает пороговый предел (являясь английским словом), это называется правильным английским словом.Короче говоря, эта логика известна цепями Маркова.

Ссылка

По математике и лучшему пониманию см. Видео https://www.youtube.com/watch?v=l15C8UJu17s.Спасибо !!

1 голос
/ 31 января 2018

Мне пришлось решить тесно связанную проблему для проекта по извлечению исходного кода, и хотя пакет написан на Python, а не на PHP, казалось, стоит упомянуть здесь на случай, если он все еще может быть как-то полезен.Пакет Nostril (для "Nonsense String Evaluator") и предназначен для определения того, могут ли строки, извлеченные во время анализа исходного кода, быть классом / функцией / переменной / и т. Д.идентификаторы или случайная тарабарщина.Он хорошо работает и с реальным текстом, а не только с идентификаторами программ.Nostril использует n-граммы (аналогично «Детектору гиббериш» в ответе Роба Нейхауса ) в сочетании с пользовательской функцией подсчета TF-IDF .Он поставляется с предварительной подготовкой и готов к использованию «из коробки».

Пример: следующий код,

from nostril import nonsense
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo',
             'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom']
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty']
for s in real_test + junk_test:
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real'))

, выдаст следующий вывод:

bunchofwords: real
getint: real
xywinlist: real
ioFlXFndrInfo: real
DMEcalPreshowerDigis: real
httpredaksikatakamiwordpresscom: real
faiwtlwexu: nonsense
asfgtqwafazfyiur: nonsense
zxcvbnmlkjhgfdsaqwerty: nonsense

Проект на GitHub , и я приветствую вклады.

0 голосов
/ 09 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...