pycorpdiff 0.1.0a4__tar.gz → 0.1.0a5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/CHANGELOG.md +1 -1
  2. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/CITATION.cff +1 -1
  3. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/PKG-INFO +2 -2
  4. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/README.md +1 -1
  5. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/pyproject.toml +1 -1
  6. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/__init__.py +2 -2
  7. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/collocation/network.py +14 -1
  8. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/datasets/__init__.py +1 -1
  9. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/.gitignore +0 -0
  10. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/LICENSE +0 -0
  11. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/_backends/__init__.py +0 -0
  12. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/_backends/pandas.py +0 -0
  13. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/_backends/polars.py +0 -0
  14. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/collocation/__init__.py +0 -0
  15. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/collocation/cooccurrence.py +0 -0
  16. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/collocation/measures.py +0 -0
  17. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/collocation/shift.py +0 -0
  18. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/compare.py +0 -0
  19. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/corpus.py +0 -0
  20. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/datasets/_data/hansard_sample.parquet +0 -0
  21. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/datasets/_generate_hansard.py +0 -0
  22. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/datasets/hansard.py +0 -0
  23. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/datasets/histwords.py +0 -0
  24. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/explain.py +0 -0
  25. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/io/__init__.py +0 -0
  26. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/io/duckdb.py +0 -0
  27. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/io/huggingface.py +0 -0
  28. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/io/readers.py +0 -0
  29. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/__init__.py +0 -0
  30. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/bayes.py +0 -0
  31. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/chi_squared.py +0 -0
  32. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/correction.py +0 -0
  33. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/dispersion.py +0 -0
  34. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/effect_sizes.py +0 -0
  35. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/loglikelihood.py +0 -0
  36. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/multicorpus.py +0 -0
  37. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/keyness/permutation.py +0 -0
  38. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/py.typed +0 -0
  39. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/results.py +0 -0
  40. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/semantic/__init__.py +0 -0
  41. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/semantic/alignment.py +0 -0
  42. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/semantic/embed.py +0 -0
  43. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/semantic/shift.py +0 -0
  44. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/semantic/trajectory.py +0 -0
  45. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/stats.py +0 -0
  46. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/__init__.py +0 -0
  47. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/bocpd.py +0 -0
  48. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/causal_impact.py +0 -0
  49. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/changepoint.py +0 -0
  50. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/forecast.py +0 -0
  51. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/its.py +0 -0
  52. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/temporal/slicing.py +0 -0
  53. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/tokenize.py +0 -0
  54. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/__init__.py +0 -0
  55. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/bocpd.py +0 -0
  56. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/causal_impact.py +0 -0
  57. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/collocation.py +0 -0
  58. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/dispersion.py +0 -0
  59. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/forecast.py +0 -0
  60. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/keyness.py +0 -0
  61. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/network.py +0 -0
  62. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/scattertext.py +0 -0
  63. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/semantic_forecast.py +0 -0
  64. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/src/pycorpdiff/viz/trajectory.py +0 -0
  65. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/__init__.py +0 -0
  66. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/conftest.py +0 -0
  67. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/fixtures/__init__.py +0 -0
  68. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/__init__.py +0 -0
  69. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_collocation_integration.py +0 -0
  70. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_crossval_histwords.py +0 -0
  71. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_crossval_nltk.py +0 -0
  72. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_crossval_quanteda.py +0 -0
  73. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_crossval_rayson.py +0 -0
  74. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_crossval_scattertext.py +0 -0
  75. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_explain_integration.py +0 -0
  76. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_keyness_integration.py +0 -0
  77. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_sbert_slow.py +0 -0
  78. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_semantic_integration.py +0 -0
  79. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_stop_words.py +0 -0
  80. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_temporal_stats.py +0 -0
  81. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/integration/test_viz.py +0 -0
  82. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/property/__init__.py +0 -0
  83. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/property/test_collocation_properties.py +0 -0
  84. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/property/test_keyness_properties.py +0 -0
  85. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/property/test_temporal_properties.py +0 -0
  86. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/__init__.py +0 -0
  87. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_bayes_factor.py +0 -0
  88. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_bocpd.py +0 -0
  89. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_causal_impact.py +0 -0
  90. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_changepoint.py +0 -0
  91. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_chi_squared.py +0 -0
  92. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_collocation_cooccurrence.py +0 -0
  93. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_collocation_measures.py +0 -0
  94. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_collocation_shift.py +0 -0
  95. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_comparison_concordance.py +0 -0
  96. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_cooccurrence_network.py +0 -0
  97. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_corpus_hash.py +0 -0
  98. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_corpus_vocab.py +0 -0
  99. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_correction.py +0 -0
  100. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_datasets_hansard.py +0 -0
  101. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_dispersion.py +0 -0
  102. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_dispersion_plot.py +0 -0
  103. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_doc_term_counts_sparse.py +0 -0
  104. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_effect_sizes.py +0 -0
  105. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_embedders.py +0 -0
  106. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_explain.py +0 -0
  107. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_forecast.py +0 -0
  108. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_forecast_semantic_drift.py +0 -0
  109. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_from_huggingface.py +0 -0
  110. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_hansard_fetcher.py +0 -0
  111. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_histwords_loader.py +0 -0
  112. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_its.py +0 -0
  113. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_keyness_multi.py +0 -0
  114. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_loglikelihood.py +0 -0
  115. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_ngram_tokenizer.py +0 -0
  116. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_permutation_keyness.py +0 -0
  117. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_polars_interop.py +0 -0
  118. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_procrustes.py +0 -0
  119. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_read_duckdb.py +0 -0
  120. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_read_txt_line_mode.py +0 -0
  121. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_result_exports.py +0 -0
  122. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_scattertext_plot.py +0 -0
  123. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_semantic_neighbours.py +0 -0
  124. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_semantic_shift.py +0 -0
  125. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_semantic_trajectory.py +0 -0
  126. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_smoke.py +0 -0
  127. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_temporal.py +0 -0
  128. {pycorpdiff-0.1.0a4 → pycorpdiff-0.1.0a5}/tests/unit/test_wilson_ci.py +0 -0
@@ -4,7 +4,7 @@ All notable changes to `pycorpdiff` are documented in this file. The format
4
4
  follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
5
5
  project adheres to [Semantic Versioning](https://semver.org/).
6
6
 
7
- ## [0.1.0a4] — initial release
7
+ ## [0.1.0a5] — initial release
8
8
 
9
9
  The initial public release of `pycorpdiff` — comparative corpus analysis
10
10
  for modern Python workflows. Three public verbs (`compare`, `track`,
@@ -4,7 +4,7 @@ message: >
4
4
  entry. GitHub renders a "Cite this repository" widget directly from
5
5
  this file.
6
6
  title: "pycorpdiff: Comparative Corpus Analysis for Modern Python Workflows"
7
- version: 0.1.0a4
7
+ version: 0.1.0a5
8
8
  date-released: 2026-05-25
9
9
  authors:
10
10
  - family-names: Turner
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycorpdiff
3
- Version: 0.1.0a4
3
+ Version: 0.1.0a5
4
4
  Summary: Comparative corpus analysis for Python: keyness, collocations, semantic shift, temporal trajectories with changepoints + causal inference.
5
5
  Project-URL: Homepage, https://github.com/jturner-uofl/pycorpdiff
6
6
  Project-URL: Documentation, https://github.com/jturner-uofl/pycorpdiff
@@ -131,7 +131,7 @@ points — one-line adapters, no plugin registry. The base install pulls
131
131
  only `numpy`, `pandas`, `scipy`, and `pyarrow`; everything else is opt-in
132
132
  via extras.
133
133
 
134
- > **Status: alpha (0.1.0a4).** Public API is stable for the features
134
+ > **Status: alpha (0.1.0a5).** Public API is stable for the features
135
135
  > described below; on PyPI as `pip install pycorpdiff`.
136
136
 
137
137
  ## The three-layer architecture
@@ -35,7 +35,7 @@ points — one-line adapters, no plugin registry. The base install pulls
35
35
  only `numpy`, `pandas`, `scipy`, and `pyarrow`; everything else is opt-in
36
36
  via extras.
37
37
 
38
- > **Status: alpha (0.1.0a4).** Public API is stable for the features
38
+ > **Status: alpha (0.1.0a5).** Public API is stable for the features
39
39
  > described below; on PyPI as `pip install pycorpdiff`.
40
40
 
41
41
  ## The three-layer architecture
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pycorpdiff"
7
- version = "0.1.0a4"
7
+ version = "0.1.0a5"
8
8
  description = "Comparative corpus analysis for Python: keyness, collocations, semantic shift, temporal trajectories with changepoints + causal inference."
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -14,12 +14,12 @@ Example
14
14
 
15
15
  >>> import pycorpdiff as pcd
16
16
  >>> pcd.__version__
17
- '0.1.0a4'
17
+ '0.1.0a5'
18
18
  """
19
19
 
20
20
  from __future__ import annotations
21
21
 
22
- __version__ = "0.1.0a4"
22
+ __version__ = "0.1.0a5"
23
23
 
24
24
  from .collocation.network import NetworkResult, cooccurrence_network
25
25
  from .compare import Comparison, compare
@@ -16,12 +16,14 @@ from __future__ import annotations
16
16
  from collections import Counter
17
17
  from collections.abc import Sequence
18
18
  from dataclasses import dataclass, field
19
- from typing import TYPE_CHECKING, Literal
19
+ from pathlib import Path
20
+ from typing import TYPE_CHECKING, Any, Literal
20
21
 
21
22
  import numpy as np
22
23
  import pandas as pd
23
24
 
24
25
  from ..corpus import Corpus, CorpusSlice
26
+ from ..results import _table_to_html, _table_to_json
25
27
  from .measures import logdice, mi_three, pmi, t_score
26
28
 
27
29
  if TYPE_CHECKING:
@@ -54,6 +56,17 @@ class NetworkResult:
54
56
  """Return the edges as a flat tidy DataFrame (for round-trips)."""
55
57
  return self.edges.copy()
56
58
 
59
+ def to_html(self, path: str | Path | None = None, **kw: Any) -> str:
60
+ """Render the edge table as HTML (returns the string and,
61
+ optionally, writes to ``path``). Extra kwargs forward to
62
+ :meth:`pandas.DataFrame.to_html`."""
63
+ return _table_to_html(self.edges, path, **kw)
64
+
65
+ def to_json(self, path: str | Path | None = None, **kw: Any) -> str:
66
+ """Render the edge table as JSON (default ``orient="records"``).
67
+ Returns the JSON string and, optionally, writes to ``path``."""
68
+ return _table_to_json(self.edges, path, **kw)
69
+
57
70
  def summary(self) -> str:
58
71
  return (
59
72
  f"NetworkResult(measure={self.measure}, window={self.window}, "
@@ -3,7 +3,7 @@
3
3
  What ships with the package
4
4
  ---------------------------
5
5
 
6
- - :func:`load_hansard_sample` — a 200-speech synthetic corpus designed
6
+ - :func:`load_hansard_sample` — a 193-speech synthetic corpus designed
7
7
  to mimic UK Hansard's structure across two decades, four topics, and
8
8
  four parties, with topical language shifts around real-world events
9
9
  (Brexit referendum, COVID-19, the climate-emergency declarations).
File without changes
File without changes