sinonym 0.2.8__tar.gz → 0.2.9__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 (79) hide show
  1. {sinonym-0.2.8 → sinonym-0.2.9}/PKG-INFO +1 -1
  2. {sinonym-0.2.8 → sinonym-0.2.9}/pyproject.toml +1 -1
  3. sinonym-0.2.9/sinonym/timo/config.yaml +22 -0
  4. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/timo/integration_test.py +56 -1
  5. sinonym-0.2.9/sinonym/timo/interface.py +640 -0
  6. sinonym-0.2.9/tests/test_timo_interface.py +428 -0
  7. sinonym-0.2.8/sinonym/timo/config.yaml +0 -12
  8. sinonym-0.2.8/sinonym/timo/interface.py +0 -347
  9. sinonym-0.2.8/tests/test_timo_interface.py +0 -223
  10. {sinonym-0.2.8 → sinonym-0.2.9}/.gitignore +0 -0
  11. {sinonym-0.2.8 → sinonym-0.2.9}/LICENSE +0 -0
  12. {sinonym-0.2.8 → sinonym-0.2.9}/README.md +0 -0
  13. {sinonym-0.2.8 → sinonym-0.2.9}/scripts/README.md +0 -0
  14. {sinonym-0.2.8 → sinonym-0.2.9}/scripts/check_test_status.py +0 -0
  15. {sinonym-0.2.8 → sinonym-0.2.9}/scripts/name_order_routing_rules.py +0 -0
  16. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/__init__.py +0 -0
  17. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/chinese_names_data.py +0 -0
  18. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/coretypes/__init__.py +0 -0
  19. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/coretypes/config.py +0 -0
  20. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/coretypes/results.py +0 -0
  21. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/README.md +0 -0
  22. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/acl_2025_authors.txt +0 -0
  23. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/chinese_japanese_classifier.joblib +0 -0
  24. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/chinese_japanese_classifier.skops +0 -0
  25. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/familyname_orcid.csv +0 -0
  26. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/givenname_orcid.csv +0 -0
  27. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/model_features.json +0 -0
  28. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/name_order_routing/README.md +0 -0
  29. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/name_order_routing/pp_abstain_labels.jsonl +0 -0
  30. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/data/name_order_routing/pp_vys_abstain_labels.jsonl +0 -0
  31. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/detector.py +0 -0
  32. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/ml_model_components.py +0 -0
  33. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/patterns/__init__.py +0 -0
  34. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/patterns/compiled_patterns.py +0 -0
  35. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/patterns/regex_builders.py +0 -0
  36. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/pipeline/__init__.py +0 -0
  37. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/pipeline/name_order_routing.py +0 -0
  38. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/resources.py +0 -0
  39. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/__init__.py +0 -0
  40. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/batch_analysis.py +0 -0
  41. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/cache.py +0 -0
  42. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/ethnicity.py +0 -0
  43. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/formatting.py +0 -0
  44. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/initialization.py +0 -0
  45. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/non_person.py +0 -0
  46. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/normalization.py +0 -0
  47. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/order_metadata.py +0 -0
  48. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/parsing.py +0 -0
  49. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/services/process_pool.py +0 -0
  50. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/text_processing/__init__.py +0 -0
  51. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/text_processing/compound_detector.py +0 -0
  52. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/text_processing/text_normalizer.py +0 -0
  53. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/text_processing/text_preprocessor.py +0 -0
  54. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/timo/__init__.py +0 -0
  55. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/utils/__init__.py +0 -0
  56. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/utils/string_manipulation.py +0 -0
  57. {sinonym-0.2.8 → sinonym-0.2.9}/sinonym/utils/thread_cache.py +0 -0
  58. {sinonym-0.2.8 → sinonym-0.2.9}/tests/_case_assertions.py +0 -0
  59. {sinonym-0.2.8 → sinonym-0.2.9}/tests/conftest.py +0 -0
  60. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_acl.py +0 -0
  61. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_all_chinese_inputs.py +0 -0
  62. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_basic_chinese_names.py +0 -0
  63. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_batch.py +0 -0
  64. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_check_test_status.py +0 -0
  65. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_compound_names.py +0 -0
  66. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_compound_surname_formats.py +0 -0
  67. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_middle_names.py +0 -0
  68. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_misc.py +0 -0
  69. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_mixed_production_cases.py +0 -0
  70. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_mixed_scripts.py +0 -0
  71. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_ml_japanese_detection.py +0 -0
  72. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_multiprocess_pool.py +0 -0
  73. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_name_formatting.py +0 -0
  74. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_name_order_routing_label_fixtures.py +0 -0
  75. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_name_order_routing_rules.py +0 -0
  76. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_non_chinese_rejection.py +0 -0
  77. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_performance.py +0 -0
  78. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_regional_variants.py +0 -0
  79. {sinonym-0.2.8 → sinonym-0.2.9}/tests/test_regression_proposals.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sinonym
3
- Version: 0.2.8
3
+ Version: 0.2.9
4
4
  Summary: Chinese Name Detection and Normalization Module
5
5
  Project-URL: Homepage, https://github.com/allenai/sinonym
6
6
  Project-URL: Repository, https://github.com/allenai/sinonym
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sinonym"
7
- version = "0.2.8"
7
+ version = "0.2.9"
8
8
  description = "Chinese Name Detection and Normalization Module"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -0,0 +1,22 @@
1
+ config_version: 0.0.1
2
+ model_variants:
3
+ sinonym_v1:
4
+ instance: sinonym.timo.interface.Instance
5
+ prediction: sinonym.timo.interface.Prediction
6
+ predictor: sinonym.timo.interface.Predictor
7
+ predictor_config: sinonym.timo.interface.PredictorConfig
8
+ artifacts_s3_path: null
9
+ python_version: "3.10"
10
+ cuda: False
11
+ integration_test: sinonym.timo.integration_test.TestIntegration
12
+ docker_run_commands: []
13
+ sinonym_routing_v1:
14
+ instance: sinonym.timo.interface.RoutingInstance
15
+ prediction: sinonym.timo.interface.RoutedPaperPrediction
16
+ predictor: sinonym.timo.interface.RoutingPredictor
17
+ predictor_config: sinonym.timo.interface.PredictorConfig
18
+ artifacts_s3_path: null
19
+ python_version: "3.10"
20
+ cuda: False
21
+ integration_test: sinonym.timo.integration_test.TestRoutingIntegration
22
+ docker_run_commands: []
@@ -1,6 +1,15 @@
1
1
  import unittest
2
2
 
3
- from sinonym.timo.interface import Instance, Prediction, Predictor, PredictorConfig
3
+ from sinonym.timo.interface import (
4
+ Instance,
5
+ Prediction,
6
+ Predictor,
7
+ PredictorConfig,
8
+ RoutedPaperPrediction,
9
+ RoutedPrediction,
10
+ RoutingInstance,
11
+ RoutingPredictor,
12
+ )
4
13
 
5
14
 
6
15
  class TestIntegration(unittest.TestCase):
@@ -67,3 +76,49 @@ class TestIntegration(unittest.TestCase):
67
76
  self.assertEqual(len(result.name_order_evidence), 2)
68
77
  self.assertEqual(result.name_order_evidence[0].raw_name, "Li Wei")
69
78
  self.assertEqual(result.name_order_evidence[0].selected_format, "surname_first")
79
+
80
+
81
+ class TestRoutingIntegration(unittest.TestCase):
82
+ @classmethod
83
+ def setUpClass(cls):
84
+ cls.predictor = RoutingPredictor(config=PredictorConfig(), artifacts_dir=".")
85
+
86
+ def test_route_with_vys_pool(self):
87
+ # paper authors must be the leading slice of the pool
88
+ pp = ["Yue Lin", "Wei Wang"]
89
+ pool = pp + ["Jun Zhao", "Hui Li"]
90
+ results = self.predictor.predict_batch([RoutingInstance(pp_names=pp, vys_pool_names=pool)])
91
+ self.assertEqual(len(results), 1) # one prediction per instance (timo 1:1 contract)
92
+ paper = results[0]
93
+ self.assertIsInstance(paper, RoutedPaperPrediction)
94
+ self.assertEqual(len(paper.authors), 2) # one RoutedPrediction per pp author
95
+ for r in paper.authors:
96
+ self.assertIsInstance(r, RoutedPrediction)
97
+ self.assertIn(r.router_prediction, {"pp", "vys", "abstain", "not_person"})
98
+ self.assertIsNotNone(r.vys) # vys candidate present when a pool is given
99
+
100
+ def test_route_pp_only_fallback(self):
101
+ results = self.predictor.predict_batch([RoutingInstance(pp_names=["Li Wei"])])
102
+ self.assertEqual(len(results), 1)
103
+ authors = results[0].authors
104
+ self.assertEqual(len(authors), 1)
105
+ self.assertIsNone(authors[0].vys) # PP-only fallback: no venue pool
106
+ self.assertIsNone(authors[0].input_order_candidate)
107
+
108
+ def test_predict_batch_is_one_to_one(self):
109
+ instances = [
110
+ RoutingInstance(pp_names=["Li Wei", "Wang Weiming"]),
111
+ RoutingInstance(pp_names=["Zhang San"]),
112
+ ]
113
+ results = self.predictor.predict_batch(instances)
114
+ self.assertEqual(len(results), len(instances)) # 1:1, paper boundaries preserved
115
+ self.assertEqual([len(p.authors) for p in results], [2, 1])
116
+
117
+ def test_empty_paper_still_emits_one_prediction(self):
118
+ # an instance with no authors must not vanish from the output stream
119
+ results = self.predictor.predict_batch([RoutingInstance(pp_names=[])])
120
+ self.assertEqual(len(results), 1)
121
+ self.assertEqual(results[0].authors, [])
122
+
123
+ def test_predict_batch_empty(self):
124
+ self.assertEqual(self.predictor.predict_batch([]), [])