web-dev-qa-db-ja.com

putjbtghguhjjjanikaのような文字列を検出する方法はありますか?

人々は私のウェブサイトで検索し、これらの検索のいくつかはこれらのものです:

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

私の質問は、上記のものと同様の文字列を検出する方法はありますか?

それらを100%検出することは不可能だと思いますが、どんな解決策も歓迎します:)

編集:「意味不明な検索」を意味します。たとえば、検索エンジンで「asdqweasdqw」、「paykaprkg」、「iwepr wepr ow」などの文字列を検索する人がいますが、ジブリックな検索を検出したいと考えています。

検索結果が0になるかどうかは関係ありません。このロジックは使用できません。

「定番」を考えると新ブランドや新商品の一部は無視されます。

ご協力ありがとうございました

62
ahe

英語の一連のテキストからキャラクターからキャラクターへの移行のモデルを構築できます。したがって、たとえば、「t」の後に「h」があることはかなり一般的です(かなり一般的)。英語では、「q」の後に「u」が表示されることを期待しています。 'q'の後に 'u'以外のものが続く場合、これは非常に低い確率で発生するため、かなり警戒すべきです。確率があるように、テーブルのカウントを正規化します。次に、クエリについて、マトリックスをウォークスルーして、遷移の積を計算します。次に、クエリの長​​さで正規化します。数が少ない場合は、意味不明なクエリ(または別の言語の何か)がある可能性があります。

大量のクエリログがある場合は、最初に一般的な英語のテキストのモデルを作成し、そのモデルのトレーニングフェーズで独自のクエリに大きな重みを付けることができます。

背景については、 Markov Chains をお読みください。

編集、私はここでこれを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
150
Rob Neuhaus

あなたが意味不明な検索を意味すると仮定すると...それは価値があるよりももっと面倒です。あなたは彼らに検索機能を提供しています、彼らが好きなように彼らにそれを使わせてください。奇妙な文字のグループ化を検出するアルゴリズムは世の中にいくつかあると思いますが、結果を返さないだけの場合よりも、多くのリソース/労力が必要になるでしょう。

10
user686605

Stackoverflowが行うこと および 文字列のエントロピーを計算する を実行できます。

もちろん、これは多くのヒューリスティックの1つにすぎませんSOは低品質の回答を決定するために使用するものであり、100%正確であるとは考えないでください。

これらの文字列は、「通常の単語」を検出するのと同じ方法で検出できると思います。それは単なるパターンマッチングですよね?

whyユーザーがこれらの文字列を検索していることに関しては、それがより大きな問題です。意味不明な検索を他の方法で回避できる場合があります。たとえば、人々(またはスクリプト)が探しているコメントスパムフレーズの場合は、CAPTCHAをインストールします。

編集:入力を解釈するもう1つの最後の実行は、入力をわずかにスロットルすることです。 10秒程度ごとに検索を許可します。 (私はこれをフォーラムソフトウェアやSOのさまざまな場所で見たことを思い出します。)これにより、sdfpjheroptuhdfjを検索することの面白さをいくらか取り除くことができます。繰り返しますが、同時に、自分のアイテムを検索して見つけるユーザーを妨害しません。

5
John

一部の人々がコメントしたように、Googleにはtapoktrpasaweやputjbtghguhjjjanikaのヒットはありません(もちろん、もちろんあります)。そのため、APIを介して簡単にGoogle検索を行う方法がある場合、 Googleの検索結果はなく、製品の名前ではありませんでした。なぜこれを実行したいのかは、まったく別の質問です。検索ライブラリの労力を節約しようとしていますか? 「人気のある検索用語」の手によるレビューをより意味のあるものにしますか?それとも、大規模なインターネット上にいる一部の人々の不可解な行動にイライラしているだけですか?後者の場合、それを防ぐ方法があったとしても、私のアドバイスはただ手放すことです。他の奇妙なことが起こります。

3
Kate Gregory

簡単な回答-意味不明な検索

確率的言語モデルが機能します。

ロジック

Wordは文字のシーケンスで構成されています。2つの文字がより頻繁に集まり、2つの連続する文字がWordに集まる頻度をすべて合計し、しきい値を超えると(英語のWordであるため)、適切であると言われます英語の単語。簡単に言うと、このロジックはMarkovチェーンで有名です

リンク

意味不明な数学とその理解については、ビデオ https://www.youtube.com/watch?v=l15C8UJu17s を参照してください。ありがとう!!

2
Aakash Goel

私はソースコードマイニングプロジェクトの密接に関連する問題を解決する必要があり、パッケージはPHPではなくPythonで記述されていますが、何らかの形でまだ役立つ場合があるので、ここで言及する価値があるように思われました。パッケージは Nostril ( "Nonsense String Evaluator"の場合)であり、ソースコードマイニング中に抽出された文字列がクラス/関数/変数/などであるかどうかを判断することを目的としています。識別子またはランダムな意味不明なもの。プログラムの識別子だけでなく、実際のテキストでも機能します。Nstrilは、n-gramを使用します( Rob Neuhaus による回答のGibberish Detectorと同様)。カスタム 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 にあり、私は貢献を歓迎します。

1
mhucka

製品で検索を実行する場合、データベースを照会する前に、製品の名前またはコードをキャッシュし、それらをそのリストと照合してチェックできます。それ以外の場合、サイトが英語のユーザー向けである場合、qwkfagsdのように、英語で使用されていない文字列の辞書を作成できます。これは、他の回答に同意する場合、存在しない場合よりもリソースを集中的に使用します。

0
noinstance