Hi Andrew,
[Nominatim is not accurate]
Does anybody know how to fix this?
Short Answer:
Get the boundaries and import them. (cf. Zurich and its imported boundaries.)
Long Answer:
At the moment the districts of mosts cantons are only represented as a node in OSM. Thus Nominatim has to use some obscure[*] algorithms to guess its area. That may work for streets (which is the nearest village-node?) but not so good for districts.
A help for Nominatim could be the is_in-Key, but even if all is_in's are set, Nominatim still uses other sources to determine the 'correct' district.
Regards, Thomas
[*] I think the source is available somewhere..