biblionetwork (development version)
- No change yet since 0.2.0 (released on CRAN on 4 November 2026).
biblionetwork 0.2.0
CRAN release: 2026-11-04
Changes of the interface
-
biblio_coupling()is now the general coupling function, with amethodargument ("angle","strength","similarity","jaccard","vladutz"). The formerbiblio_coupling()(the coupling angle of Sen and Gan, 1983) is renamedcoupling_angle(). Calls that leavemethodat its default and name their other arguments give the same result; a call passingnormalized_weight_onlyby position (4th argument) must now name it, sincemethodcomes first. -
coupling_entity()is renamedentity_network()and is deprecated (it still works, with the former method names): it is not a measure of its own, but the aggregation of the coupling measures at the level of entities. It now accepts all the methods ofbiblio_coupling()("angle","strength","similarity","jaccard","vladutz"; the last two with the minimum rule of Zhao and Strotmann by analogy, not taken from the paper) and anetworkargument,"coupling"or"cocitation". -
compute_couplings()acceptsmethods = "descriptive"([coupling_descriptive()]), not computed by default: it informs the user of its cost and of the fact that its pairs differ, and needstitle(further arguments indescriptive_args). -
merge_weights()now adds the rank of each pair under each measure (rank_<name>, computed on the pairs present in all the tables) and therank_gapbetween two measures; the vignettes use it to find the pairs on which two measures disagree.
Bug fixes
- Identifiers stored as factors with different levels made every function fail (“level sets of factors are different”): they are now turned into characters.
-
coupling_descriptive()returned a pair of documents twice when both were targets (weights equal up to floating-point error, sounique()kept both). -
coupling_similarity()was wrong in two ways. The idf of every reference was computed from the first reference of the table only (nb_docwas a one-cell table, recycled with its first value), so that the weights were proportional to those ofcoupling_strength(). And the denominator was the product of the informational lengths instead of its square root, so that the measure was not the cosine of Shen et al. (2019, Eq. 8) that the documentation announced. It now computessum_shared idf / sqrt(S(A) S(B)), a cosine bounded by 1, checked against the formula and the worked example of the paper. -
coupling_strength()computedN(the number of documents) after removing the references cited once, forgetting the documents without any shared reference.Nnow counts all the citing documents, as documented: weights change slightly (about 2% on average on the stagflation data). -
coupling_entity()used a globalmin()instead of the element-wisepmin()for the number of times two entities cite a reference: the weights were wrong as soon as an entity cited several references several times. -
biblio_cocitation(normalized_weight_only = FALSE, output_in_character = FALSE)failed (wrong column name). -
biblio_coupling(),biblio_cocitation(),coupling_strength(),coupling_similarity(),coupling_entity()andcoauth_network()failed with “only 0’s may be mixed with negative subscripts” when no pair of nodes was linked; they now return a zero-row table with the usual columns, and a warning (classbiblionetwork_no_edges) that says whether nothing is shared or theweight_thresholdis too high (with the largest number of shared items found). -
dt[unique(id_art)]was a keyed join on the reference identifier, which counted wrongly the documents if a document identifier was also a reference identifier; replaced byuniqueN().
Speed and memory
- The coupling and co-citation functions now compute the pairs with sparse matrices (
Matrix) instead of listing, for each reference, all the pairs of documents citing it. A pair sharing k references used to be stored k times, with its identifiers, before being counted; it is now stored once, as integers. On a sample of 30,000 Scopus documents (830,000 citations, 4.5 million edges),biblio_coupling()went from 12.9 s and 7.1 GB of memory to 4.3 s and 0.8 GB; computing the five measures withcompute_couplings()takes 5.7 s and 1.0 GB. The results are unchanged (checked against the former implementation on the stagflation data and against slow reference implementations in the tests). -
coupling_entity()andcoauth_network()use sparse matrices too (for the entity measures,min(a, b)is written as the number of levels reached by both entities, which turns the sum of minima into a cross-product). Coupling the 35 journals of a sample of 830,000 citations takes about 3 s and 0.8 GB. - The lengths of bibliographies are now numeric: products of two large lengths (entities such as journals) used to overflow the integer range and give
NAweights.
New functions
-
coupling_jaccard(): relative coupling strength of Sen and Gan (1983), a Jaccard index. -
coupling_vladutz(): the Vladutz and Cook (1984) formula, as reported by Shen et al. (2019). -
compute_couplings(): computes several coupling measures at once, sharing the costly pair-listing step. -
biblio_cocitation()has amethodargument: the co-citation can be weighted with the angle (default, unchanged), the coupling strength, the idf similarity, the Jaccard index or the Vladutz-Cook formula, as the coupling.compute_couplings()has anetworkargument to compute them on co-citation. -
coupling_entity()has a thirdmethod,"coupling_similarity": the idf cosine, with the minimum rule of Zhao and Strotmann (2008) for the counts. -
coupling_descriptive(): the DescriptiveBC measure of Liu (2017), which uses the words of the titles of the references to couple documents that cite different but related references;descriptive_terms()gives the words that say why two documents are related. -
summarise_weights(),correlate_weights(),overlap_top_weights(),merge_weights()andplot_weights(): compare the distributions and the rankings of the weights of different measures.
Other changes
- The document-level coupling functions share one internal engine (
R/coupling_core.R). - A new vignette,
comparing_measures, compares all the measures on the stagflation corpus. - New internal helpers (
R/utils.R) shared by all the functions: the input is checked with informativeclierrors (missing columns, wrong arguments), rows with missing identifiers are dropped with a warning, and the pairs are built in one place. -
coauth_network(): an unknownmethodis now an error instead of silently using the refined fractional counting. - First test suite (
testthat3): hand-computed toy examples, invariants, cross-checks with a slow implementation, and tests on samples of the authors’ Scopus and Web of Science databases (skipped where the databases are absent). - The package now depends on R >= 4.1.0 and imports
cli,rlangandMatrix.
