Provided you don't have Tags with the same name in different Categories, you could do something like this
$tab = @{}Get-Tag |
ForEach-Object -Process {
if(-not $tab.ContainsKey($_.Name)){
$tab.Add($_.Name,$_.Category)
}
}
Get-TagAssignment | Group-Object -Property {$_.Tag.Name} |
ForEach-Object -Process {
$tab.Remove($_.Name)
}
$tab.GetEnumerator() | ForEach-Object -Process {
Write-Host "$($_.Value)/$($_.Name) not used"
}