Todos saben que el contenido hace la pregunta. Pero un buen título también ayuda, y eso es lo primero que vemos. Es hora de convertir esa primera impresión en un programa y descubrir qué tipos de títulos obtienen más votos positivos.
Por el presente, se le desafía a escribir un programa o función que tome el título de una pregunta PPCG como entrada y devuelva una predicción de su puntaje.
Por ejemplo, puede recibir Counting Grains of Rice
como entrada, e intentaría devolver algo cercano al puntaje, 59
en este caso. Las suposiciones no enteras están bien, pero las suposiciones iguales o inferiores -20
no.
Aquí están los datos, para probar y calificar:
http://data.stackexchange.com/codegolf/query/244871/names-and-upvotes
Puntuación: Su programa se ejecutará en cada pregunta en el historial de este sitio (PPCG), sin contar las preguntas cerradas. La función ln(score + 20)
se aplicará a cada puntaje y a cada suposición. La raíz del error cuadrático medio entre los dos conjuntos de valores resultantes es su puntaje. Más bajo es mejor.
Por ejemplo, un programa que adivinó 0 cada vez obtendría una puntuación de 0.577, mientras que uno que adivinó 11 cada vez obtendría una puntuación de 0.362.
Calcule su puntaje e inclúyalo en el título de su respuesta. Incluya también la predicción de su programa sobre cuántos votos positivos obtendrá esta pregunta.
Restricciones
Para evitar una codificación excesiva, no más de 1000 caracteres.
Debe ejecutarse en todo el conjunto de datos anterior en menos de un minuto en una máquina razonable.
Las lagunas estándar están cerradas.
Aquí hay un probador escrito en Python, para su uso y / o para aclarar ambigüedades:
import sys
import math
import csv
scores_dict = {}
with open(sys.argv[1], 'r') as csv_file:
score_reader = csv.reader(csv_file)
for score, title in score_reader:
if score == 'Score':
continue
scores_dict[title] = int(score)
def rate_guesses(guesser):
def transform(score):
return math.log(score + 20) if score > -20 else 0
off_by_total = 0
lines_count = 0
for title in scores_dict:
guessed_score = guesser(title)
real_score = scores_dict[title]
off_by_total += (transform(real_score) - transform(guessed_score)) ** 2
return (off_by_total/len(scores_dict)) ** .5
def constant11(title):
return 11
print(rate_guesses(constant11))
fuente
[closed]
y[on hold]
, cuando corresponda?Respuestas:
Python 2, 991 caracteres, puntaje 0.221854834221, predicen 11
Explicación:
Este es un hardcoding descarado, pero intenta hacerlo de manera eficiente.
Preprocesamiento:
En un código separado, hechice cada título a un valor entre 0 y 256 ^ 2-1. Llamemos a estos valores bins. Para cada contenedor, calculé el puntaje promedio. (El promedio es necesario porque para una pequeña fracción de los contenedores, hay colisiones: más de 1 título hash en el mismo contenedor. Pero para la gran mayoría, cada título se asigna a un contenedor propio).
La idea detrás del código de 2 bytes para cada título es que 1 byte no es suficiente: tenemos demasiadas colisiones, por lo que realmente no sabemos qué puntaje asignar a cada bin de 1 byte. Pero con los contenedores de 2 bytes, casi no hay colisiones, y efectivamente obtenemos una representación de 2 bytes de cada título.
Luego clasifique los bins: calcule la ganancia en puntaje si asignamos a este bin su valor calculado, en lugar de simplemente adivinar 11. Tome los N bins superiores y codifíquelos en una cadena (que es d en el código real).
La codificación: la clave de la papelera está codificada como 2 bytes. El valor se codifica con 1 byte. Encontré valores entre -8 y 300 + algo, así que tuve que apretar un poco para ponerlo en 1 byte: x -> (x + 8) / 2.
Código actual:
leer d como tripletes de bytes, decodificando la codificación explicada anteriormente. Cuando se otorga un título, calcule su hash (módulo 256 ^ 2), y si esa clave se encuentra en el dict, devuelva el valor al que se asigna. De lo contrario, regrese 11.
fuente
Javascript ES6
Puntuación: 0.245663
Longitud: 1000 bytes
Predice: 5
(Supongo que la pregunta se debe a una avalancha inesperada de votos negativos: P)
Minified
Expandido
La función
S
acepta una cadena (título) y devuelve su puntuación.Notas sobre el comportamiento:
fuente
Python 2, Puntuación = 0.335027, 999 caracteres, Predecir 11.34828 para esta pregunta
Solo para que la pelota ruede. Esto no es óptimo en ninguna parte.
Lo elegante de SVM es solo mi idea aleatoria y tuve ganas de implementarlo, así que aquí está. Mejora la línea de base en 0.02 puntos, así que estoy bastante feliz con eso. Pero para mostrar que codificar la entrada es de donde proviene la mayoría de las mejoras, también estoy codificando alguna respuesta.
Sin la codificación rígida, el puntaje es 0.360 (y en realidad todas las predicciones son alrededor de 11, jaja)
Estoy usando scikit-learn y nltk
fuente
Python 2, 986 caracteres, puntaje 0.3480188, predicen 12
La función relevante es
J
.El programa es esencialmente Naive Bayes usando palabras de título como características, pero está extremadamente restringido gracias al límite de caracteres. ¿Cuán restringido? Bien...
w
arriba). La compresión se realiza reorganizando los tripletes para que haya tantas letras duplicadas como sea posible, y estos pares se reemplacen con su correspondiente ASCII en mayúsculas (por ejemplo, fiLoNoN ... → fil, lon, non, ...)m
,s
arriba, usando el hecho de que la media / sd es como máximo 90 (permitiendo una codificación ASCII directa, ya que hay 95 ASCII imprimibles)G
es la función de distribución normal: redondeamos e a 2dp y la raíz cuadrada inversa de 2 pi a 1 dp para guardar en caracteres.En conjunto, el límite extremo de char hizo de esta una de las peores ideas que se me ocurrió, pero estoy muy contento con lo mucho que logré meter (aunque no funciona muy bien). Si alguien tiene mejores ideas para la compresión, hágamelo saber :)
(Gracias a KennyTM por señalar mi compresión sin sentido)
fuente
w='grge…scse';w=[w[i:i+2]for i in range(0,len(w),2)]
es de 165 bytes mientras que el suyoC=lambda:…;w=C('…')
es de 179 bytes.Python 2, 535 caracteres, puntaje 0.330910, predice 11.35
Promedio de la puntuación de los títulos que contienen cada palabra, luego use las 50 palabras superiores e inferiores para modificar posiblemente la puntuación BASE en la
guess(title)
función.Código de Python:
fuente
C
Puntuación: Desconocido
Longitud: 5 bytes
Predice: 5
Golfizado:
Sin golf:
Una consulta de los puntajes da un puntaje promedio de 5.
No tengo la capacidad de probarlo en este momento, otros son bienvenidos para ejecutar / editar.
fuente