Es no existente en un subconjunto de los caracteres alfanuméricos que es más fácil de leer? En particular, existe un subconjunto que tiene menos caracteres que visualmente son ambiguos, y por la eliminación de (o la equiparación de) ciertos personajes que reducir el error humano?

Sé «visualmente ambigua» es algo waffly de una expresión, pero es bastante evidente que la D, O y 0 son todas similares, y 1 y yo también son similares. Me gustaría maximizar el tamaño del conjunto de alfa-numéricos, pero minimizar el número de caracteres que son propensos a ser mal interpretado.

El único precedente que soy consciente de que para este tipo de conjunto es la Canadá código Postal sistema que elimina las letras D, F, I, O, P y U, y ese subconjunto fue creado para ayudar en el sistema postal del proceso de OCR.

Mi idea inicial es utilizar sólo letras mayúsculas y números como sigue:

Un 
B = 8 
C = G 
D = 0 = O = P 
E = F 
H 
I = J = L = T = 1 = 7 
K = X 
M 
N 
P 
R 
S = 5 
U = V = Y 
W 
Z = 2 
3 
4 
6 
9 

Este problema puede ser difícil de separar de el tipo de la cara. El carácter distintivo de los personajes en la opción de tipo de letra podría afectar significativamente el potencial visual de la ambigüedad de cualquiera de los dos personajes, pero espero que en la mayoría de los modernos tipos de personajes de la parte superior que se equiparan tendrá una bastante similar apariencia para justificar la equiparación de ellos.

Agradecería pensamientos sobre la son las ecuaciones anteriores adecuado, o tal vez hay más caracteres que debe ser equiparada? Sería caracteres en minúsculas ser más adecuado?

Nota: «Visualmente ambigua» se entiende en el contexto de los seres humanos, no el sistema de OCR. La solución que se requiere es ayuda de entrada manual.
Consulte ux.stackexchange.com/questions/21076/…
si usted hace esto en una respuesta, es probable que recoger la recompensa. Discusión en UX es exactamente lo OP que estaba buscando.
Es la recompensa cerrado – tengo una mejor solución..
Publicación en GitHub.. ETA 6 Hrs

OriginalEl autor Brian M. Hunt | 2012-08-12

6 Comentarios

  1. 9

    Principalmente inspirándose en este ux hilo, mencionado por @rwb,

    • Varios los programas de usar cosas similares. La lista en tu post, parece ser muy similar a los utilizados en estos programas, y creo que debería ser suficiente para la mayoría de propósitos. Usted puede agregar siempre agregar redundancia (corrección de errores) para «perdonar» los errores de menor importancia; para ello será necesario que el espacio de los códigos (ver La distancia de Hamming), aunque.
    • No hay referencias en cuanto a particular método utilizado en la obtención de las listas, salvo prueba y error
      con los seres humanos (lo cual es genial para los no-ocr: sus usuarios son los seres humanos)
    • Puede tener sentido utilizar caracteres de agrupamiento (por ejemplo, en grupos de 5) para aumentar contexto («primer carácter en el segundo de los 5 grupos»)
    • Ambigüedad puede ser eliminado mediante el uso de completa los sustantivos (a partir de un diccionario con algunos parecidos; word-editar-la distancia puede ser útil aquí) en lugar de los caracteres. Las personas pueden confundir «1» con el «yo», pero serán pocos los que confunden «a uno» con «hielo».
    • Otra opción es hacer que su código en un (falso) palabra que se puede leer en voz alta. Un modelo de markov puede ayudar.
    +1 para el uso completo de los sustantivos; cloudflare utiliza algo similar para sus servidores de nombre
    Corrección de errores está probablemente subestimada en UX. Un valioso poco aquí puede ser una visual a distancia métrica – por ejemplo O/D/0 están más cerca, por ejemplo, el C/P pero aún más, por ejemplo, I/H/R. Como se menciona en otra parte sin embargo, esto depende en gran medida de la fuente. Un símbolo basado en la corrección de errores (por ejemplo, Reed Solomon) que no depende de los efectos visuales puede ser más sencillo y eficaz. Es realmente una gran idea, tucuxi, gracias!
    Gran idea con los modelos de Markov…

    OriginalEl autor tucuxi

  2. 9

    Necesitaba un reemplazo para el hexadecimal (base 16) por razones similares (por ejemplo, para la codificación de una clave, etc.), la mejor que se me ocurrió es la siguiente conjunto de 16 caracteres, que puede ser utilizado como un reemplazo para hexadecimal:

    0 1 2 3 4 5 6 7 8 9 A B C D E F     Hexadecimal
    H M N 3 4 P 6 7 R 9 T W C X Y F     Replacement
    

    En el conjunto de reemplazo, consideramos las siguientes:

    Todos los caracteres que se utilizan tienen importantes características distintivas, que sólo se omite en un verdaderamente horrible de la fuente.

    Las vocales a E I O U omitido para evitar que accidentalmente ortografía de las palabras.

    Conjuntos de caracteres que potencialmente podrían ser muy similares o idénticos en algunas fuentes se evitan completamente (ninguno de los personajes en cualquier juego se utilizan en todos):

    0 O D Q 
    1 I L J
    8 B 
    5 S
    2 Z
    

    Por evitar estos personajes completamente, la esperanza es que el usuario introduzca los caracteres correctos, en lugar de tratar de corregir mis-los caracteres introducidos.

    Para conjuntos de menos similares, pero la posibilidad de confundir los personajes, que sólo el uso de uno de los personajes de cada serie, espero que la mayoría de los distintivos:

    Y U V 
    

    Aquí Y es utilizado, ya que siempre tiene la parte inferior de la sección vertical, y un tipo en tipos de letra serif

    C G         
    

    Aquí C es utilizado, ya que parece menos probable que una C escribirse como G, que viceversa

    X K         
    

    Aquí X es utilizado, ya que es más coherente en la mayoría de las fuentes

    F E         
    

    Aquí F es utilizado, ya que no es una vocal

    En el caso de estos conjuntos similares, la entrada de cualquier carácter en el conjunto podría ser convertidos automáticamente a la que realmente se utiliza (el primero de la lista en cada set). Tenga en cuenta que el Correo no debe ser convertidos automáticamente a F si hexadecimal entrada puede ser utilizado (ver más abajo).

    Nota que todavía hay sonido similar cartas en el conjunto de reemplazo, esto es prácticamente inevitable. Cuando la lectura en voz alta, un alfabeto fonético debe ser utilizado.

    Donde los personajes que también están presentes en el estándar hexadecimales se utilizan en el conjunto de reemplazo, que se utilizan para las mismas en base 16 valor. En teoría mixta de entrada de hexadecimal y de caracteres de sustitución podría ser admitidos, siempre que E no se convierte automáticamente a F.

    Ya que esto es sólo un personaje de reemplazo, debe ser fácil de convertir a/desde hexadecimal.

    Mayúsculas parece mejor para la «canónica» formulario para la salida, aunque de menor caso también parece razonable, excepto por «h» y «n», que debería ser relativamente clara en la mayoría de las fuentes:

    h m n 3 4 p 6 7 r 9 t w c x y f
    

    De entrada, por supuesto, pueden ser mayúsculas o minúsculas.

    Hay varios sistemas similares para la base 32, ver http://en.wikipedia.org/wiki/Base32 sin Embargo, estos obviamente necesidad de introducir más similares caracteres, a cambio de un 25% más de información de cada personaje.

    Al parecer, el siguiente también fue utilizado para claves de producto de Windows en la base de 24, pero de nuevo tiene más similares caracteres:

    B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9
    
    Muy bien pensado, gracias por contribuir a esta respuesta.
    Si la tengo a la derecha, aquí es un trivial Python esencial la implementación de este.

    OriginalEl autor trepidacious

  3. 2

    Esto sería un problema general en el OCR. Por lo tanto para la solución final, donde en el OCR de codificación es controlada especializados fuentes se han desarrollado para solucionar el «visual ambigüedad» problema que usted menciona.
    Ver: http://en.wikipedia.org/wiki/OCR-A_font

    como información adicional : es posible que desee saber acerca de Base32 de la Codificación en el símbolo para el dígito » 1 «no se utiliza como se puede» confundir a los usuarios con el símbolo del alfabeto ‘l’.

    Gracias – Base32 es una buena sugerencia. Estrictamente hablando, la cuestión se refiere únicamente a la OCR por medio de los Correos de Canadá precedente de la eliminación de caracteres que son ambiguos a la máquina de los lectores. Estoy interesado en un personaje (o glifo, la verdad) establece que es menos ambiguo para los seres humanos.
    Usted puede usar su propio conjunto de símbolos en base32-codificación de la aplicación de la parte restante de la misma.

    OriginalEl autor Ujjwal Singh

  4. 2

    Lo que usted busca es un inequívoco, eficiente Humanos-código de Computadora. Lo que yo recomiendo es codificar el conjunto de los datos con el literal(significativo) palabras, sustantivos, en particular.

    He sido el desarrollo de un software para hacer eso – y de manera más eficiente. Yo lo llamo WCode.
    Técnicamente sólo de su Base-1024 de la Codificación en el que el uso de palabras en lugar de símbolos.

    Aquí están los enlaces:

    Presentación: https://docs.google.com/presentation/d/1sYiXCWIYAWpKAahrGFZ2p5zJX8uMxPccu-oaGOajrGA/edit

    Documentación: https://docs.google.com/folder/d/0B0pxLafSqCjKOWhYSFFGOHd1a2c/edit

    Proyecto: https://github.com/San13/WCode (por Favor, espere mientras yo me carga…)

    Muy cool – muchas gracias por esto!
    Visite el sitio web: WCodes.org. También hice un video y lo he publicado el proyecto en crowdfunding sitio: IndieGoGo, igg.me/at/wcode/x/2245741
    Muy inteligente – me encanta!
    Gracias Brian ! 🙂

    OriginalEl autor Ujjwal Singh

  5. 0

    Depende de qué tan grande quieres que tu conjunto. Por ejemplo, sólo el conjunto {0, 1} probablemente va a funcionar bien. Del mismo modo el conjunto de dígitos. Pero, probablemente, usted desea un conjunto que es aproximadamente la mitad del tamaño de la serie original de los personajes.

    No he hecho esto, pero aquí es una sugerencia. Seleccionar una fuente, elegir un conjunto inicial de los personajes, y escribir algo de código para hacer el siguiente. Dibujar cada uno de los caracteres que caben en un n-por-n plaza de píxeles blancos y negros, para n = 1 a (por ejemplo) 10. Corte cualquier blanco de filas y columnas desde el borde, ya que sólo estamos interesados en el área negra. Eso le da una lista de los 10 códigos para cada personaje. Medir la distancia entre dos caracteres por cómo muchos de estos códigos diferentes. Estimación de la distancia es aceptable para su aplicación. A continuación, hacer una búsqueda de fuerza bruta para un conjunto de caracteres que son muy distintas.

    Básicamente, utilizar una secuencia de comandos para simular entrecerrando los ojos a los personajes y ver que todavía se puede diferenciar.

    Esto depende en gran medida de la fuente, e incluso el tamaño de fuente. También podría requerir algunos ataques de fuerza bruta alineación: L y I compartir unos píxeles hasta que se coloca el trazo vertical de forma que se superpongan.

    OriginalEl autor Hew Wolff

  6. 0

    Aquí un poco de python me escribió para codificar y decodificar números enteros mediante el sistema de caracteres descritos anteriormente.

    def base20encode(i):
        """Convert integer into base20 string of unambiguous characters."""
        if not isinstance(i, int):
            raise TypeError('This function must be called on an integer.')     
        chars, s = '012345689ACEHKMNPRUW', ''
        while i > 0:
            i, remainder = divmod(i, 20)
            s = chars[remainder] + s
        return s
    
    
    def base20decode(s):
        """Convert string to unambiguous chars and then return integer from resultant base20"""
        if not isinstance(s, str):
            raise TypeError('This function must be called on a string.')
        s = s.translate(bytes.maketrans(b'BGDOQFIJLT7KSVYZ', b'8C000E11111X5UU2'))
        chars, i, exponent = '012345689ACEHKMNPRUW', 0, 1
        for number in s[::-1]:
            i += chars.index(number) * exponent
            exponent *= 20
        return i
    
    
    base20decode(base20encode(10))
    

    OriginalEl autor Lucas

Dejar respuesta

Please enter your comment!
Please enter your name here