Задать вопрос

Каким алгоритмом/библиотекой конвертировать слово, введённое в неправильной раскладке?

По сути, сделать то, что делают Punto Switcher. Нужно постоянно конвертировать подобные ошибки, сделанные в разных языках, не использующих латиницу. Желательно — на Python, можно на PHP.
  • Вопрос задан
  • 8235 просмотров
Подписаться 9 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 10
Daggett
@Daggett
Вот набросок того что я предлагал:

<?php

  $layouts['en'] = preg_split('!!u', 'qwertyuiop[]asdfghjkl;\'\zxcvbnm,./', null, PREG_SPLIT_NO_EMPTY);
  $layouts['ru'] = preg_split('!!u', 'йцукенгшщзхъфывапролджэ\ячсмитьбю.', null, PREG_SPLIT_NO_EMPTY);

 
  $phrase = "тестовая cnhjrf с неверной раскладкой\n";
  echo $phrase;

  $phrase_chunks = explode(' ', $phrase);
  $ch = array();
  foreach ($phrase_chunks as $phrase_chunk) $curl_handles[] = curl_init();

  foreach ($curl_handles as $index => $curl_handle) {
    curl_setopt($curl_handle, CURLOPT_URL, "http://ajax.googleapis.com/ajax/services/language/detect?v=1.0&q=".urlencode($phrase_chunks[$index]));
    curl_setopt($curl_handle, CURLOPT_HEADER, false);
    curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, true);
  }

  $mh = curl_multi_init();

  foreach ($curl_handles as $index => $curl_handle) {
    curl_multi_add_handle($mh, $curl_handle);
  }

  $active = null;
  do {
    $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);

  while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
      do {
        $mrc = curl_multi_exec($mh, $active);
      } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
  }
  
  foreach ($curl_handles as $index => $curl_handle) {
    $responses[] = json_decode(curl_multi_getcontent($curl_handle));
  }
  
  foreach ($curl_handles as $index => $curl_handle) {
    curl_multi_remove_handle($mh, $curl_handle);
  }
  curl_multi_close($mh);
  
  foreach ($responses as $index => $response) {
    if ($response->responseData->confidence <= 0.005 && $response->responseData->language != 'ru') {
      $phrase_chunks[$index] = str_replace($layouts['en'], $layouts['ru'], $phrase_chunks[$index]);
    }
  }
  echo implode(' ', $phrase_chunks)."\n";
  
?>
Ответ написан
iStyx
@iStyx
Разбивать на слова и передавать на поиск гуглу, если в ответе будет «возможно вы искали...» — использовать его :)
Ответ написан
Gorthauer87
@Gorthauer87
Программист
Нейронные сети же. Они образы как орехи щелкают.
Ответ написан
Комментировать
izmalk
@izmalk
На самом деле если сразу несколько языков, да еще без английского… просто задача мудренее. Возможно действительно стоит посмотреть в сторону обучаемых систем, готовое решение найти сложно будет имхо
Ответ написан
Daggett
@Daggett
простите "$response->responseData->language != 'ru'" это я неправ, приду домой попытаюсь допилять, не судите строго — всего лишь набросок
Ответ написан
Комментировать
Wott
@Wott
Найти можно в любой операционке :) должны быть таблицы соответствия скан кодов символам.
Ответ написан
Daggett
@Daggett
список для Windows, однако покопавшись так и не смог нормально вытянуть раскладки, впринципе часть файла понятна, но…
Ответ написан
Комментировать
RinNas
@RinNas
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы