Tout le monde sait que le contenu rend la question. Mais un bon titre aide aussi, et c'est la première chose que nous voyons. Il est temps de transformer cette première impression en un programme et de déterminer quels types de titres obtiennent plus de votes positifs.
Vous êtes par conséquent invité à écrire un programme ou une fonction prenant le titre d’une question PPCG en tant qu’entrée et renvoyant une prédiction de son score.
Par exemple, vous pouvez recevoir Counting Grains of Rice
une entrée et essayer de renvoyer quelque chose de proche du score, 59
dans ce cas. Les suppositions non entières vont bien, mais les suppositions inférieures ou égales -20
ne le sont pas.
Voici les données, pour les tests et les scores:
http://data.stackexchange.com/codegolf/query/244871/names-and-upvotes
Notation: Votre programme sera exécuté sur toutes les questions de l'historique de ce site (PPCG), sans compter les questions fermées. La fonction ln(score + 20)
sera ensuite appliquée à chaque score et à chaque conjecture. L'erreur racine moyenne moyenne entre les deux ensembles de valeurs résultants est votre score. Plus c'est bas, mieux c'est.
Par exemple, un programme qui devine 0 à chaque fois obtiendrait un score de 0,577, tandis qu'un programme qui en devinerait 11 à chaque fois obtiendrait un score de 0,362.
Veuillez calculer votre score et l'inclure dans le titre de votre réponse. Veuillez également inclure la prévision de votre programme pour le nombre de votes positifs que cette question obtiendra.
Restrictions
Pour éviter un codage en dur excessif, ne pas dépasser 1000 caractères.
Doit fonctionner sur l’ensemble des données ci-dessus en moins d’une minute sur une machine raisonnable.
Les échappatoires standard sont fermées.
Voici un testeur écrit en Python, pour votre usage et / ou pour lever les ambiguïtés:
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))
la source
[closed]
et[on hold]
, le cas échéant?Réponses:
Python 2, 991 caractères, score 0,221854834221, prédire 11
Explication:
C’est un codage dur éhonté, mais nous essayons de le faire efficacement.
Prétraitement:
Dans un code séparé, j'ai haché chaque titre à une valeur comprise entre 0 et 256 ^ 2-1. Appelons ces bacs de valeurs. Pour chaque bin, j'ai calculé le score moyen. (La moyenne est nécessaire car pour une infime fraction des bacs, il y a des collisions - plus d'un hachage de titres dans le même bac. Mais pour la grande majorité, chaque titre est mappé sur un bac lui-même).
L'idée derrière le code à 2 octets pour chaque titre est qu'un 1 octet n'est pas suffisant - nous rencontrons trop de collisions, nous ne savons donc pas vraiment quel score attribuer à chaque groupe d'un octet. Mais avec les bacs de 2 octets, il n'y a presque pas de collisions et nous obtenons effectivement une représentation de 2 octets de chaque titre.
Ensuite, classez les bacs - calculez le gain en score si nous attribuons à ce bac sa valeur calculée, au lieu de simplement deviner 11. Prenez les N premiers bacs et codez-les dans une chaîne (qui est d dans le code réel).
Le codage: la clé de la corbeille est codée sur 2 octets. la valeur est codée en utilisant 1 octet. J'ai trouvé des valeurs comprises entre -8 et 300 + quelque chose, donc j'ai dû serrer un peu pour le faire en 1 octet: x -> (x + 8) / 2.
Code actuel:
lu d comme des triplets d’octets, décodant le codage expliqué ci-dessus. Lorsqu'un titre est donné, calculez son hachage (modulo 256 ^ 2), et si cette clé est trouvée dans le dict, renvoyez la valeur à laquelle il correspond. Sinon, retournez 11.
la source
Javascript ES6
Score: 0.245663
Longueur: 1000 octets
Prédits: 5
(Je suppose que la question est due à une avalanche inattendue de votes négatifs.: P)
Minified
Étendu
La fonction
S
accepte une chaîne (titre) et renvoie son score.Notes sur le comportement:
la source
Python 2, score = 0,335027, 999 caractères, prédisez 11,34828 pour cette question
Juste pour faire avancer les choses. Ceci n'est nulle part optimal.
SVM n’est qu’une idée aléatoire et j’ai eu l’impression de la mettre en œuvre, alors la voici. Cela améliore la ligne de base de 0,02 point, je suis donc assez content de cela. Mais pour montrer que le codage en dur est à l'origine de la majorité des améliorations, je codifie également certaines réponses.
Sans le codage en dur, le score est de 0,360 (et toutes les prédictions se situent autour de 11, haha)
J'utilise scikit-learn et nltk
la source
Python 2, 986 caractères, score de 0.3480188, prédire 12
La fonction pertinente est
J
.Le programme est essentiellement Naive Bayes utilisant des mots de titre comme fonctionnalités, mais il est extrêmement limité grâce à la limite de caractères. Comment restreint? Bien...
w
ci-dessus). La compression est effectuée en réarrangeant les triplets de manière à ce qu'il y ait autant de lettres doubles que possible, et que ces paires soient remplacées par leur majuscule ASCII correspondante (par exemple, fiLoNoN ... → fil, lon, non, ...)m
,s
ci - dessus, en utilisant le fait que la moyenne / sd est au maximum de 90 (permettant un codage ASCII direct, car il existe 95 ASCII imprimables)G
est la fonction de distribution normale - nous arrondissons e à 2dp et la racine carrée inverse de 2 pi à 1 dp pour économiser sur les caractères.Globalement, la limite extrême de carbonisation en faisait l’une des pires idées que j’ai jamais proposée, mais je suis assez contente du travail que j’ai réussi à faire (même si cela ne fonctionne pas très bien). Si quelqu'un a de meilleures idées pour la compression, merci de me le faire savoir :)
(Merci à KennyTM d'avoir signalé ma compression inutile)
la source
w='grge…scse';w=[w[i:i+2]for i in range(0,len(w),2)]
correspond à 165 octets, tandis que le vôtre àC=lambda:…;w=C('…')
179 octets.Python 2, 535 caractères, score de 0.330910, prédit 11.35
Effectuez une moyenne du score des titres contenant chaque mot, puis utilisez les 50 premiers et derniers mots pour éventuellement modifier le score BASE de la
guess(title)
fonction.Code Python:
la source
C
Score: Inconnu
Longueur: 5 octets
Prédits: 5
Golfé:
Ungolfed:
Une interrogation des scores donne un score moyen de 5.
Je n'ai pas la possibilité de le tester pour le moment, les autres sont invités à exécuter / modifier.
la source