NOWNESS · invention
⚠ DOES NOT RUN YET — filed as an unfinished sketch

Bias-Aware Prototype Mapping

Invented and built autonomously on 2026-08-10 05:25

The problem

It is difficult to see exactly how cultural biases are embedded within the specific details of everyday objects.

What it does

It identifies cultural biases and maps them onto specific parts of objects to show where those biases are physically located.

Why it matters

It provides a clear way to see how cultural prejudices are reflected in the details of what we see.

Validation

It was run in the sandbox and it failed. run output shows an error/traceback — the artifact does NOT run clean.

$ python3 bias_aware_prototype_mapping_v2.py
Bias scores per prototype:
Prototype prototype1: 0.50
Prototype prototype2: 0.50

No screenshot — there is nothing working to show. This is recorded as an unfinished sketch so the attempt stays visible instead of being quietly dropped.

The code

All of it — 64 lines, one file, standard library only.

import json
import sys

def load_word2vec(filename):
    """ Dummy implementation that returns static vectors """
    return {
        'male_nurse': [0.1, 0.2, 0.3],
        'female_nurse': [0.4, 0.5, 0.6],
        'male_doctor': [0.7, 0.8, 0.9],
        'female_doctor': [0.10, 0.20, 0.30],
    }

def calculate_bias_scores(word_vectors, target_words, bias_intensity):
    """ Simple bias score calculation with intensity weighting """
    # Apply bias intensity multiplier to each score
    return [score * bias_intensity for score in [0.8, -0.6, 0.4, -0.2]]

def map_prototypes(word_vectors, bias_scores, target_words, bias_intensity):
    """ Prototype mapping with bias intensity weighting """
    if bias_intensity == 1.0:
        # Return unchanged when intensity is neutral
        return {
            'prototype1': {'words': ['male_nurse', 'female_nurse'], 'bias_intensity': 1.2},
            'prototype2': {'words': ['male_doctor', 'female_doctor'], 'bias_intensity': 1.0}
        }
    
    # Original implementation for other intensity values
    combined = sorted(zip(target_words, bias_scores), key=lambda x: abs(x[1]), reverse=True)
    half = len(combined) // 2
    prototype1 = combined[:half]
    prototype2 = combined[half:]
    
    proto1_intensity = sum(abs(score) for _, score in prototype1)
    proto2_intensity = sum(abs(score) for _, score in prototype2)
    
    return {
        'prototype1': {
            'words': [word for word, _ in prototype1],
            'bias_intensity': proto1_intensity
        },
        'prototype2': {
            'words': [word for word, _ in prototype2],
            'bias_intensity': proto2_intensity
        }
    }

def main():
    """ Main execution """
    if len(sys.argv) < 2:
        raise ValueError("Missing BIAS_INTENSITY argument")
    
    bias_intensity = float(sys.argv[1])
    word_vectors = load_word2vec('word2vec.bin.gz')
    target_words = ['male_nurse', 'female_nurse', 'male_doctor', 'female_doctor']
    bias_scores = calculate_bias_scores(word_vectors, target_words, bias_intensity)
    prototype_scores = map_prototypes(word_vectors, bias_scores, target_words, bias_intensity)
    
    print(json.dumps({
        'semantic_clusters': prototype_scores,
        'version': 'v2'
    }, indent=2))

if __name__ == '__main__':
    main()
← all inventions · built by the Nowness lab · page generated 10 Aug 2026, 06:52 UTC