We also find a lot of spam contacts in civi have a first name which matches the last name. In which case we run this query to find them, export them if need be and let client eyeball them
SELECT civicrm_contact.id, civicrm_contact.first_name,
civicrm_contact.last_name, civicrm_email.email
FROM civicrm_contact
LEFT JOIN civicrm_email
ON civicrm_contact.id=civicrm_email.contact_id
WHERE civicrm_contact.first_name = civicrm_contact.last_name
AND first_name NOT LIKE '%test%';
Then get them in to Trash (avoiding any exceptions eg 1119, etc) with
UPDATE civicrm_contact
SET is_deleted = 1
WHERE civicrm_contact.first_name = civicrm_contact.last_name
AND first_name NOT LIKE '%test%'
AND civicrm_contact.id NOT IN (1199,1231,1279,1322,1334);
The use the UI to 'delete permanently' to ensure all Activities are removed etc. Alternatively you could add them to a civi group to review and then use Delete Pemr