Your inner loop is iterating based on the number of elements in @gp_name but you are increasing the length of that array with push @gp_name, $key;.
I suggested a lookup table and envisaged something like:
my %group_table = (
'On' => 'One',
'Two' => 'Two',
'Twel' => 'Twelve',
'Twen' => 'Twenty',
So, if "Group " is common to all keys, strip that off. Then take increasingly larger substrings from what's left until you get a match. Include some limit so when you've tried X characters and still found no match, give up and put that item in a separate "bucket" for manual intervention.