Dada una lista de codificadores y sus respectivos conjuntos de fragmentos de código, ¿es posible inferir a partir de un fragmento de código nuevo dado el codificador original?

Hay un enfoque más simple que no utiliza el aprendizaje automático.
Defina un k-gramo como k unidades consecutivas del programa (por ejemplo, k declaraciones en un programa C ++). Ahora trocee cada uno de estos k-gramas y, de entre todos los k-gramos de un programa, seleccione un subconjunto fijo y llame a esto la huella digital del archivo. Las huellas digitales de todos los archivos enviados se pueden comparar para determinar la copia parcial. Funciona correctamente solo si el subconjunto de hashes utilizados como huella digital se elige con cuidado.

No necesita implementar esto, ya que hay un servicio web gratuito que ya lo hace. Solo tiene que enviar todos los archivos y detectará y mostrará cualquier plagio. Esta detección de plagio está alojada por Stanford. Si desea implementar el algoritmo usted mismo, eche un vistazo al documento vinculado en esa página.

Ciertamente sería posible, aunque dependería de los problemas específicos que se evalúen y de las limitaciones que existen en términos de lenguajes de programación, etc.

Debe examinar el campo del procesamiento del lenguaje natural [1], específicamente los aspectos relacionados con la evaluación y clasificación de la calidad textual automatizada.

Puede tratar fácilmente cada archivo de código como una unidad de texto distinta, y aplicar un algoritmo simple para dividir el código en bloques lógicos (“oraciones”) y tokenizar (dividir en “palabras”) las oraciones. Luego puede usar los tokens para representar cada archivo de código como un vector numérico (cada posición en el vector corresponde a una “palabra” única en todos los archivos, y contiene la incidencia de la palabra en el archivo particular que estamos examinando). Esto se llama el modelo de “bolsa de palabras” [2].

También puede agregar algunos metadatos de los archivos de código al vector numérico, como la frecuencia de las sangrías, el número de líneas de comentarios, etc.

Dados los vectores de datos con un autor conocido, puede clasificar / descubrir el autor de los vectores de datos “desconocidos”. Esto se hace utilizando algoritmos de aprendizaje automático [3]. Ver [4] para una introducción decente al proceso. Básicamente, los algoritmos de aprendizaje automático utilizan procesos estadísticos para derivar modelos de datos “conocidos”. Estos modelos se aplican luego a datos “desconocidos” para derivar una variable objetivo (en este caso, autor). Puede utilizar técnicas de aprendizaje automático supervisadas o no supervisadas.

Por supuesto, todo esto depende de que usted tenga acceso a un buen conjunto inicial de archivos de código fuente donde se conoce al autor. Cuantos más ejemplos tenga por autor, mejor. Si no tiene muchos datos, es probable que desee probar técnicas de aprendizaje sin supervisión, como la agrupación en clústeres, para descubrir archivos de código fuente similares que probablemente tengan el mismo autor.

El Concurso de ciencia de datos de EMC [5] que se está ejecutando actualmente en Kaggle le pide a los competidores que asignen el código fuente a un proyecto en particular basado únicamente en el archivo de código. Puede encontrar información útil en los foros.

Referencias

1. http://en.wikipedia.org/wiki/Nat
2. http://en.wikipedia.org/wiki/Bag
3. http://en.wikipedia.org/wiki/Mac
4. http://web.iiit.ac.in/~jawahar/P
5. https://www.kaggle.com/c/emc-dat

Sí, los estilos de codificación de los desarrolladores son muy distintos. Al trabajar en un grupo después de un tiempo, aprende a reconocer el código de sus colegas mediante sutiles elementos como sangría, nombres variables, uso de ciertas metáforas de codificación, etc.

Este es un problema típico de aprendizaje automático. La confiabilidad de dicha determinación dependerá principalmente de la cantidad de datos de capacitación disponibles, la consistencia de los estilos de codificación. No debería ser demasiado difícil de implementar.

Tal sistema también podría ser jugado. Por ejemplo, el código podría ser re-ideado automáticamente. Algunas herramientas de ofuscación de código renombran variables y tipos. También los estilos de otras personas podrían ser imitados intencionalmente.

Tengo una historia de mis días en la universidad. Fue hace muchos años bajo diferentes sistemas políticos y educativos, así que por favor no se apresure a hacer juicios morales. Estaba ayudando a algunos compañeros de clase con su tarea de programación, y la mayoría de ellos fueron arrestados en la primera tarea. Pronto me di cuenta de que, dado que trabajaba como programador profesional, mi estilo de codificación era muy diferente al de primer año: sangría, nombres de variables, etc. Así que la próxima vez que me pidieron que ayudara a alguien solía “simplificar” mi solución, a veces incluso agregando intencionalmente pequeños errores o ineficiencias.

More Interesting

¿Cómo pudo Mark Zuckerberg implementar algoritmos de aprendizaje automático a la edad de 14 años?

Cómo construir un generador de lenguaje natural

¿Cuál es una buena manera de elegir los puntos iniciales de los grupos de k en el grupo de medios k?

¿Puedo usar la agrupación (k-means, etc.) en un gran conjunto de datos para automatizar el proceso de búsqueda de similitudes y hacer recomendaciones?

¿Cómo usa la NASA el aprendizaje automático?

¿Podría la red neuronal de convolución completa aprender a discriminar entre clases si no hay muestreo descendente y la entrada es igual a salida?

¿Alguien puede presentar un tutorial o un documento sobre cómo elegir el valor de 'C' en la función de regresión logística scikit-learn?

¿Cuál es la diferencia entre alineación y deformación en visión artificial?

¿Existe una versión de objetivos múltiples de regresión logística, regresión lineal, SVM, PCA, K-means o algún otro algoritmo de aprendizaje automático?

¿El aprendizaje profundo ha vuelto obsoletos los métodos del núcleo?

¿Qué algoritmos son buenos para usar en el procesamiento del lenguaje natural?

¿Cuáles son las principales diferencias entre los MOOC de aprendizaje automático de Caltech y Stanford?

¿Cuál es el tamaño mínimo de corpus para entrenar incrustaciones de palabras?

¿Qué significa el impulso en las redes neuronales?

¿Por qué la mayoría de las declaraciones de investigación de aprendizaje automático suenan a mierda?