This sounds like a graph clustering problem.
Given a graph of nodes (people), and edges (bonds/relationships), where edges have weights (relationship strength), you want to split it into disjoint subgraphs (groups of people where no person is in two different groups), such that the level of connection inside each group is in some sense "higher" than the connection between groups.
How we define this "higher" level of connection will determine what algorithms we use, and what kinds of groups we get:
A) Group the strongest relationships first
This approach leads to Kruskal's Algorithm - often used for finding a minimum spanning tree of a graph, but it can be stopped early to produce clusters instead.
Here you start with everyone in their own solo group.
Sort all your bonds by strength, then walk through the list from strongest to weakest, looking at each bond in turn.
If the two people sharing that bond are already in a group together, skip it and move on.
Otherwise, if the two people are in different groups, merge the two groups into one group containing all the members of each.
Stop once you hit a bond you consider too weak to unite a group, or once you're down to a desired number of groups.
This is simple to code up and with appropriate disjoint set data structures is very fast - the initial edge sort is the most expensive part (\$O(E \cdot \log E)\$). But it can produce "tenuous" groups, where individual members each share a strong bond with at least one other member, but might have no connection at all with more distant members in the same group.
B) Find groups where everyone shares a strong bond
To counter this, we might insist that everyone in the group should have a strong relationship with everyone else in the group. In graph theory terms, this means they form a "clique," and finding them entails the NP-Complete "Clique Problem," so you can expect to work harder to find these. Exact algorithms run in exponential time, though their are more modest approximation algorithms you can try.
You can either convert your graph to an unweighted one by discarding all relationships below a threshold strength, to use algorithms that look for cliques with the largest number of members, or keep your weights and use algorithms that look for cliques of maximum total weight.
Depending on how you define which bonds are strong enough to count, you might find your graph contains very few, small cliques of just a handful of people - since two people knowing each other only as "a friend of a friend" is enough to block them from both being members of the same group.
C) Allow friends-of-friends
We can relax our clique criterion to say it's OK if not everyone in the group knows everyone else directly, as long as they know someone who knows them. In graph theory terms, we're looking for subgraphs of diameter 2, where any two members of the group are separated by at most two relationships with a mutual friend in between.
We can find groups like these with a Highly-Connected Subgraphs clustering algorithm. Here again, we'd discard relationships below a threshold strength to convert our graph to an unweighted one. We then repeatedly search for a minimum cut, the smallest bundle of edges we can slice to split the graph into two. As long as there are fewer than half as many edges in the minimum cut than nodes in our group (the connection from one side of the group to the other is "weak enough"), we slice those edges out and repeat on each of the two subgraphs.
This animation by Fredseadroid via Wikipedia shows the algorithm in action.
This looks to me like it gives a good compromise between the tight connections of a clique and the six-degrees-of-separation chains of a Kruskal cluster, as well as intermediate complexity to compute (roughly \$O(n^2)\$ to \$O(n^3)\$ depending on the min-cut subroutine you choose).