Note: the geocoding service may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited. For complete details on allowed usage, consult the Maps API Terms of Service License Restrictions.
You can have a look at gisgraphy. It mix Openstreetmap and Geonames datasets. You can install it by your own or use the free services for non commercial use
->nominatim is a webservice based on the openstreetmap dataset.
->openstreetmap provides streets informations that you can download and use it.
->Gisgraphy is a framework that provides an importer for the Openstreetmap and Geonames datasets and provides geocoding / reverse geocoding / findnearby webservices. you can use the free services hosted by gisgraphy or install it on your own server.