Как я могу определить, находится ли символ рядом с другим символом на QWERTY-клавиатуре? - PullRequest
2 голосов
/ 01 октября 2011

Я занимаюсь разработкой системы обнаружения спама, и меня предупредили, что она не может обнаружить строки вроде этой - "asdfsdf".

Мое решение для этого заключается в обнаружении, если предыдущие клавиши были рядом с другими клавишами на клавиатуре. Я не получаю ввод (для обнаружения спама) с клавиатуры, я получаю его в виде строки.

Все, что я хочу знать, это то, является ли символ одной клавишей, двумя или более чем двумя клавишами от другого символа.

Например, на современной клавиатуре QWERTY символы «q» и «w» будут на расстоянии 1 клавиши. То же самое с символами 'q' и 's'. Люди могут понять это логически, как я могу сделать это в коде?

Ответы [ 4 ]

3 голосов
/ 01 октября 2011

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

+---+---+---+---+---+---+---
|   | a | b | c | d | f | s ...
+---+---+---+---+---+---+---
| a | 0 | 5 | 4 | 2 | 4 | 1 ...
| b | 5 | 0 | 3 | 3 | 2 | 4 ...
| c | 4 | 3 | 0 | 1 | 2 | 2 ...
| d | 2 | 3 | 1 | 0 | 1 | 1 ...
| f | 3 | 2 | 2 | 1 | 0 | 2 ...
| s | 1 | 4 | 2 | 1 | 2 | 0 ...
+---+---+---+---+---+---+---

Может ли это работать на тебя?Вы могли бы даже иметь отрицательные числа, чтобы показать, что один ключ находится слева от другого.ПЛЮС, вы можете поместить 2-целочисленную структуру в каждую ячейку, где второе целое положительно или отрицательно, чтобы показать, что вторая буква вверх или вниз по сравнению с первой.Позвони моему патентному поверенному, быстро!

3 голосов
/ 01 октября 2011

Вы можете просто создать двумерную карту для стандартной клавиатуры qwerty. В принципе это может выглядеть примерно так:

map[0][0] = 'q';
map[0][1] = 'a';
map[1][0] = 'w';
map[1][1] = 's';

и т. Д.

Когда вы получаете два символа, вам просто нужно найти их x и y в массиве 'map' выше, и вы можете просто рассчитать расстояние, используя пифагоры. Это не будет соответствовать требованию, которое у вас было: «q» и «s» на расстоянии 1 расстояние. Но скорее это будет sqrt (1 ^ 2 + 1 ^ 2) приблизительно 1,4

Формула будет:

  • Символы c1 и c2
  • Найти координаты для c1 и c2 : (x1, y1) и (x2, y2)
  • Рассчитать расстояние с помощью Пифагора: dist = sqrt ((x2-x1) ^ 2 + (y2-y1) ^ 2).
  • При необходимости, потолок или пол результат.

Например:

Допустим, вы получаете символы c1 = 'q' и c2 = 'w'. Изучите карту и найдите, что «q» имеет координаты (x1, y1) = (0, 0), а «w» имеет координаты (x2, y2) = (1, 0). Расстояние

sqrt((1-0)^2 + (0-0)^2) = sqrt(1) = 1
2 голосов
/ 01 октября 2011

Построить карту от клавиш до позиций на идеализированной клавиатуре.Что-то вроде:

'q' => {0,0},
'w' => {0,1},
'a' => {1,0},
's' => {1,1}, ...

Тогда вы можете принять «расстояние» как математическое расстояние между двумя точками.

1 голос
/ 01 октября 2011

Основная идея заключается в создании карты персонажей и их положений на клавиатуре.Затем вы можете использовать простую формулу расстояния, чтобы определить, насколько близко они находятся.

Например, рассмотрим левую сторону клавиатуры:

  1 2 3 4 5 6
  q w e r t
  a s d f g
  z x c v b

Символ a имеет позицию [2, 0] и символ b имеют позицию [3, 4].Формула их расстояния друг от друга:

sqrt((x2-x1)^2 + (y2-y1)^2);

Таким образом, расстояние между a и b равно sqrt((4 - 0)^2 + (3 - 2)^2)

Это займет немного усилий, чтобы отобразитьключи в прямоугольной сетке (мой пример не идеален, но он дает вам идею).Но после этого вы можете построить карту (или словарь), и поиск будет простым и быстрым.

...