pycorpdiff 0.1.0a7__tar.gz → 0.1.0a9__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.
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/CHANGELOG.md +3 -3
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/CITATION.cff +1 -1
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/PKG-INFO +4 -4
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/README.md +3 -3
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/pyproject.toml +1 -1
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/__init__.py +1 -1
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_crossval_quanteda.py +18 -7
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_sbert_slow.py +13 -2
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/.gitignore +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/LICENSE +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/_backends/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/_backends/pandas.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/_backends/polars.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/collocation/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/collocation/cooccurrence.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/collocation/measures.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/collocation/network.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/collocation/shift.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/compare.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/corpus.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/_data/hansard_sample.parquet +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/_generate_hansard.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/hansard.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/histwords.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/explain.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/io/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/io/duckdb.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/io/huggingface.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/io/readers.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/bayes.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/chi_squared.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/correction.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/dispersion.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/effect_sizes.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/loglikelihood.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/multicorpus.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/keyness/permutation.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/py.typed +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/results.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/semantic/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/semantic/alignment.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/semantic/embed.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/semantic/shift.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/semantic/trajectory.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/stats.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/bocpd.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/causal_impact.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/changepoint.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/forecast.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/its.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/temporal/slicing.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/tokenize.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/bocpd.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/causal_impact.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/collocation.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/dispersion.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/forecast.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/keyness.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/network.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/scattertext.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/semantic_forecast.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/viz/trajectory.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/conftest.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/fixtures/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_collocation_integration.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_crossval_histwords.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_crossval_nltk.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_crossval_rayson.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_crossval_scattertext.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_explain_integration.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_keyness_integration.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_semantic_integration.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_stop_words.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_temporal_stats.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/integration/test_viz.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/property/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/property/test_collocation_properties.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/property/test_keyness_properties.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/property/test_temporal_properties.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/__init__.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_audit_a7_fixes.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_bayes_factor.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_bocpd.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_causal_impact.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_changepoint.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_chi_squared.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_collocation_cooccurrence.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_collocation_measures.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_collocation_shift.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_comparison_concordance.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_cooccurrence_network.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_corpus_hash.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_corpus_vocab.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_correction.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_datasets_hansard.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_dispersion.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_dispersion_plot.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_doc_term_counts_sparse.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_effect_sizes.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_embedders.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_explain.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_forecast.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_forecast_semantic_drift.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_from_huggingface.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_hansard_fetcher.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_histwords_loader.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_its.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_keyness_multi.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_loglikelihood.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_ngram_tokenizer.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_permutation_keyness.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_polars_interop.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_procrustes.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_read_duckdb.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_read_txt_line_mode.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_result_exports.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_scattertext_plot.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_semantic_neighbours.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_semantic_shift.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_semantic_trajectory.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_smoke.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/tests/unit/test_temporal.py +0 -0
- {pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/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.
|
|
7
|
+
## [0.1.0a9] — first public release
|
|
8
8
|
|
|
9
9
|
The first public alpha of `pycorpdiff` — comparative corpus analysis
|
|
10
10
|
for modern Python workflows. Three public verbs (`compare`, `track`,
|
|
@@ -49,8 +49,8 @@ The package is checked against standard tools by automated test:
|
|
|
49
49
|
on every adjacent bigram (slow tier).
|
|
50
50
|
- **Scattertext (Kessler 2017)** — behavioural agreement on the 2012
|
|
51
51
|
US Conventions corpus (slow tier).
|
|
52
|
-
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-
|
|
53
|
-
`formula="dunning"` (slow tier).
|
|
52
|
+
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-6 with
|
|
53
|
+
`formula="dunning"` (cross-runtime float-arithmetic ceiling; slow tier).
|
|
54
54
|
- **HistWords (Hamilton et al. 2016)** — known-shifter / stable-word
|
|
55
55
|
sanity check on Stanford SNAP COHA decade embeddings; skips
|
|
56
56
|
gracefully when the archive isn't reachable (slow tier).
|
|
@@ -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.
|
|
7
|
+
version: 0.1.0a9
|
|
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.
|
|
3
|
+
Version: 0.1.0a9
|
|
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's
|
|
|
131
131
|
direct runtime dependencies are `numpy`, `pandas`, `scipy`, and
|
|
132
132
|
`pyarrow`; everything else is opt-in via extras.
|
|
133
133
|
|
|
134
|
-
> **Status: alpha (0.1.
|
|
134
|
+
> **Status: alpha (0.1.0a9).** 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
|
|
@@ -252,8 +252,8 @@ Slow tier:
|
|
|
252
252
|
on every adjacent bigram
|
|
253
253
|
- **Scattertext (Kessler 2017)** — behavioural agreement on the 2012
|
|
254
254
|
US Conventions corpus
|
|
255
|
-
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-
|
|
256
|
-
`formula="dunning"`
|
|
255
|
+
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-6 with
|
|
256
|
+
`formula="dunning"` (cross-runtime float-arithmetic ceiling)
|
|
257
257
|
- **HistWords (Hamilton et al. 2016)** — known-shifter / stable-word
|
|
258
258
|
sanity check on Stanford SNAP COHA decade embeddings (skips
|
|
259
259
|
gracefully if the archive isn't reachable)
|
|
@@ -35,7 +35,7 @@ points — one-line adapters, no plugin registry. The base install's
|
|
|
35
35
|
direct runtime dependencies are `numpy`, `pandas`, `scipy`, and
|
|
36
36
|
`pyarrow`; everything else is opt-in via extras.
|
|
37
37
|
|
|
38
|
-
> **Status: alpha (0.1.
|
|
38
|
+
> **Status: alpha (0.1.0a9).** 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
|
|
@@ -156,8 +156,8 @@ Slow tier:
|
|
|
156
156
|
on every adjacent bigram
|
|
157
157
|
- **Scattertext (Kessler 2017)** — behavioural agreement on the 2012
|
|
158
158
|
US Conventions corpus
|
|
159
|
-
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-
|
|
160
|
-
`formula="dunning"`
|
|
159
|
+
- **quanteda (R)** via `rpy2` — G² agreement to ≤ 1e-6 with
|
|
160
|
+
`formula="dunning"` (cross-runtime float-arithmetic ceiling)
|
|
161
161
|
- **HistWords (Hamilton et al. 2016)** — known-shifter / stable-word
|
|
162
162
|
sanity check on Stanford SNAP COHA decade embeddings (skips
|
|
163
163
|
gracefully if the archive isn't reachable)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pycorpdiff"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.0a9"
|
|
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" }
|
|
@@ -76,12 +76,16 @@ def _quanteda_keyness(corpus_df: pd.DataFrame) -> pd.DataFrame:
|
|
|
76
76
|
from rpy2.robjects.conversion import localconverter
|
|
77
77
|
|
|
78
78
|
# rpy2 >= 3.5 deprecated pandas2ri.activate() in favour of a
|
|
79
|
-
# context-managed converter.
|
|
79
|
+
# context-managed converter. Within `localconverter(...)` the
|
|
80
|
+
# `pandas2ri` converter is registered, so `r("out_df")` auto-converts
|
|
81
|
+
# the R data.frame to a pandas DataFrame on the way out; no explicit
|
|
82
|
+
# `pandas2ri.rpy2py(...)` call is needed (that's the deprecated
|
|
83
|
+
# pre-context-manager idiom and now raises NotImplementedError when
|
|
84
|
+
# the object is already pandas).
|
|
80
85
|
with localconverter(default_converter + pandas2ri.converter):
|
|
81
86
|
r("library(quanteda)")
|
|
82
87
|
r("library(quanteda.textstats)")
|
|
83
|
-
|
|
84
|
-
r.assign("docs_df", r_df)
|
|
88
|
+
r.assign("docs_df", pandas2ri.py2rpy(corpus_df))
|
|
85
89
|
|
|
86
90
|
r(
|
|
87
91
|
"""
|
|
@@ -96,7 +100,7 @@ def _quanteda_keyness(corpus_df: pd.DataFrame) -> pd.DataFrame:
|
|
|
96
100
|
out_df <- as.data.frame(keyness)
|
|
97
101
|
"""
|
|
98
102
|
)
|
|
99
|
-
out =
|
|
103
|
+
out = r("out_df") # auto-converted to pandas via localconverter
|
|
100
104
|
|
|
101
105
|
out = out.rename(columns={"G2": "g2"})
|
|
102
106
|
return out[["feature", "g2"]]
|
|
@@ -106,11 +110,17 @@ def test_log_likelihood_matches_quanteda_byte_for_byte(
|
|
|
106
110
|
fixture_corpus: pcd.Corpus,
|
|
107
111
|
) -> None:
|
|
108
112
|
"""For every term shared with quanteda (using formula='dunning'),
|
|
109
|
-
our signed G² agrees
|
|
113
|
+
our signed G² agrees to ≤ 1e-6.
|
|
110
114
|
|
|
111
115
|
quanteda's ``textstat_keyness(measure="lr")`` uses the full 4-cell
|
|
112
116
|
Dunning G². The Rayson 2-cell shortcut (our default) is a different
|
|
113
117
|
statistic; comparing like-to-like requires passing ``formula="dunning"``.
|
|
118
|
+
|
|
119
|
+
The 1e-6 tolerance reflects the realistic cross-runtime
|
|
120
|
+
floating-point ceiling between R (BLAS-via-R) and NumPy
|
|
121
|
+
(BLAS-via-Python); accumulation order in xlogy differs subtly
|
|
122
|
+
between the two stacks. Tightening below ~1e-7 produces sporadic
|
|
123
|
+
failures on otherwise-identical math.
|
|
114
124
|
"""
|
|
115
125
|
a = fixture_corpus.slice(frame="A")
|
|
116
126
|
b = fixture_corpus.slice(frame="B")
|
|
@@ -136,7 +146,8 @@ def test_log_likelihood_matches_quanteda_byte_for_byte(
|
|
|
136
146
|
# quanteda's textstat_keyness uses signed G² with the same
|
|
137
147
|
# convention we do: positive when overused in the target
|
|
138
148
|
# group. With matching formulae, the two implementations
|
|
139
|
-
#
|
|
140
|
-
|
|
149
|
+
# agree to cross-runtime float-arithmetic noise (~1e-7 on
|
|
150
|
+
# this fixture, well below the 1e-6 ceiling we assert here).
|
|
151
|
+
assert math.isclose(ours_v, theirs_v, abs_tol=1e-6), (
|
|
141
152
|
f"{term}: pycorpdiff={ours_v}, quanteda={theirs_v}"
|
|
142
153
|
)
|
|
@@ -44,8 +44,19 @@ def frame_corpus() -> pcd.Corpus:
|
|
|
44
44
|
|
|
45
45
|
@pytest.fixture(scope="module")
|
|
46
46
|
def sbert_embedder() -> pcd.SBERTEmbedder:
|
|
47
|
-
"""Construct
|
|
48
|
-
|
|
47
|
+
"""Construct + warm the SBERT embedder.
|
|
48
|
+
|
|
49
|
+
Skip the whole module if the model can't be loaded (network flake,
|
|
50
|
+
HuggingFace outage, gated-model auth gap, transformers version
|
|
51
|
+
mismatch). The point of these tests is pycorpdiff's wiring, not
|
|
52
|
+
SBERT's; an upstream-download failure is no signal.
|
|
53
|
+
"""
|
|
54
|
+
e = pcd.SBERTEmbedder(model_name="all-MiniLM-L6-v2")
|
|
55
|
+
try:
|
|
56
|
+
e.encode(["warmup"]) # triggers the lazy model download
|
|
57
|
+
except (OSError, ValueError, RuntimeError) as exc: # pragma: no cover
|
|
58
|
+
pytest.skip(f"SBERT model unavailable: {exc}")
|
|
59
|
+
return e
|
|
49
60
|
|
|
50
61
|
|
|
51
62
|
def test_sbert_encode_returns_correct_shape(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pycorpdiff-0.1.0a7 → pycorpdiff-0.1.0a9}/src/pycorpdiff/datasets/_data/hansard_sample.parquet
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|