1-800-BAD-CODE commited on
Commit
b21595d
·
1 Parent(s): 5bda556

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +79 -104
README.md CHANGED
@@ -80,130 +80,105 @@ For each input subword `t`, this model predicts the probability that `t` is the
80
 
81
  # Example Usage
82
 
83
- This model has been exported to `ONNX` (opset 17) alongside the associated `SentencePiece` tokenizer.
84
 
85
- This model is intended to be downloaded and used in the native frameworks, rather than HF's API.
 
 
 
 
86
 
87
- First, let's download and prepare the ONNX and SentencePiece models:
88
 
89
  ```python
90
- from sentencepiece import SentencePieceProcessor
91
- import onnxruntime as ort
92
- import numpy as np
93
- from huggingface_hub import hf_hub_download
94
  from typing import List
95
 
96
- spe_path = hf_hub_download(
97
- repo_id="1-800-BAD-CODE/sentence_boundary_detection_multilang", filename="spe_mixed_case_64k_49lang.model"
98
- )
99
- onnx_path = hf_hub_download(
100
- repo_id="1-800-BAD-CODE/sentence_boundary_detection_multilang", filename="sbd_49lang_bert_small.onnx"
101
- )
102
-
103
- tokenizer: SentencePieceProcessor = SentencePieceProcessor(spe_path)
104
- ort_session: ort.InferenceSession = ort.InferenceSession(onnx_path)
105
- ```
106
-
107
- Next, let's define a simple function that runs inference on one text input and prints the predictions:
108
-
109
- ```python
110
- def run_infer(text: str, threshold: float = 0.5):
111
- # Encode as IDs for the model input; add BOS/EOS tags.
112
- ids = tokenizer.EncodeAsIds(text)
113
- input_ids = np.array([[tokenizer.bos_id()] + ids + [tokenizer.eos_id()]])
114
- # Run inference; get probablity of each token being a sentence boundary
115
- outputs = ort_session.run(None, {"input_ids": input_ids})
116
- # Shape [B, T]
117
- probs = outputs[0]
118
- # Single input is batched; keep only first element
119
- probs = probs[0]
120
- # Trim BOS/EOS
121
- probs = probs[1:-1]
122
- # Find all positions that exceed the threshold as a sentence boundary
123
- break_points: List[int] = np.squeeze(np.argwhere(probs > threshold), axis=1).tolist() # noqa
124
- # Add the final token to the break points, to not have leftover tokens after the loop
125
- if (not break_points) or (break_points[-1] != len(ids) - 1):
126
- break_points.append(len(ids) - 1)
127
- # Break tokens at boundaries, convert back to text
128
- print(f"Input: {text}")
129
- for i, break_point in enumerate(break_points):
130
- start = 0 if i == 0 else (break_points[i - 1] + 1)
131
- sub_ids = ids[start : break_point + 1]
132
- sub_text = tokenizer.DecodeIds(sub_ids)
133
- print(f"\tSentence {i}: {sub_text}")
134
  ```
135
 
136
- Now let's run some examples. These are all from the OpenSubtitles test set.
137
-
138
- Some interesting behavior is the English acronyms (a period is not a sufficient condition for a sentence boundary) and Thai (spaces are full stops in Thai, and this is detected automatically).
139
 
140
- These are all lower-cased to make it harder, but the model is trained with mixed-case data so true-cased inputs will work as well.
141
 
142
- ```python
143
- # English with a lot of acronyms
144
- run_infer(
145
- "the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over "
146
- "there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive."
147
- )
148
-
149
- # Chinese
150
- run_infer("魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。")
151
-
152
- # Spanish
153
- run_infer("él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.")
154
-
155
- # Thai
156
- run_infer(
157
- "พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน"
158
- )
159
-
160
- # Ukrainian
161
- run_infer(
162
- "розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный "
163
- "свой самолет."
164
- )
165
-
166
- # Polish
167
- run_infer(
168
- "szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem "
169
- "zabity tylko raz."
170
- )
171
- ```
172
-
173
- Expected output:
174
 
175
  ```text
176
  Input: the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive.
177
- Sentence 0: the new d.n.a. sample has been multiplexed, and the gametes are already dividing.
178
- Sentence 1: let's get the c.p.d. over there.
179
- Sentence 2: dinner's at 630 p.m.
180
- Sentence 3: see that piece on you in the l.a. times?
181
- Sentence 4: chicago p.d. will eat him alive.
 
 
182
  Input: 魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。
183
- Sentence 0: 魔鬼兵團都死了?
184
- Sentence 1: 但是如果这让你不快乐就别做了。
185
- Sentence 2: 您就不能发个电报吗。
186
- Sentence 3: 我們都準備好了。
 
 
187
  Input: él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.
188
- Sentence 0: él es uno de aquellos.
189
- Sentence 1: ¿tiene algo de beber?
190
- Sentence 2: cómo el aislamiento no vale la pena.
 
 
191
  Input: พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน
192
- Sentence 0: พวกเขาต้องโกรธมากเลยใช่ไหม
193
- Sentence 1: โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม
194
- Sentence 2: ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี
195
- Sentence 3: ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน
 
 
196
  Input: розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный свой самолет.
197
- Sentence 0: розігни і зігни, будь ласка.
198
- Sentence 1: я знаю, ваши люди храбры.
199
- Sentence 2: было приятно, правда?
200
- Sentence 3: для начала, тебе нужен собственный свой самолет.
 
 
201
  Input: szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem zabity tylko raz.
202
- Sentence 0: szedłem tylko do.
203
- Sentence 1: pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka.
204
- Sentence 2: ćwiczę już od dwóch tygodni a byłem zabity tylko raz.
 
 
205
  ```
206
 
 
 
 
207
  # Model Architecture
208
  This is a data-driven approach to SBD. The model uses a `SentencePiece` tokenizer, a BERT-style encoder, and a linear classifier to predict which subwords are sentence boundaries.
209
 
 
80
 
81
  # Example Usage
82
 
83
+ The easiest way to use this model is to install [punctuators](https://github.com/1-800-BAD-CODE/punctuators):
84
 
85
+ ```bash
86
+ $ pip install punctuators
87
+ ```
88
+
89
+ <details open>
90
 
91
+ <summary>Example Usage</summary>
92
 
93
  ```python
 
 
 
 
94
  from typing import List
95
 
96
+ from punctuators.models import SBDModelONNX
97
+
98
+ # Instantiate this model
99
+ # This will download the ONNX and SPE models. To clean up, delete this model from your HF cache directory.
100
+ m = SBDModelONNX.from_pretrained("sbd_multi_lang")
101
+
102
+ input_texts: List[str] = [
103
+ # English (with a lot of acronyms)
104
+ "the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive.",
105
+ # Chinese
106
+ "魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。",
107
+ # Spanish
108
+ "él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.",
109
+ # Thai
110
+ "พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน",
111
+ # Ukrainian
112
+ "розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный свой самолет.",
113
+ # Polish
114
+ "szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem zabity tylko raz.",
115
+ ]
116
+
117
+ # Run inference
118
+ results: List[List[str]] = m.infer(input_texts)
119
+
120
+ # Print each input and it's segmented outputs
121
+ for input_text, output_texts in zip(input_texts, results):
122
+ print(f"Input: {input_text}")
123
+ print(f"Outputs:")
124
+ for text in output_texts:
125
+ print(f"\t{text}")
126
+ print()
 
 
 
 
 
 
 
127
  ```
128
 
129
+ </details>
 
 
130
 
131
+ <details open>
132
 
133
+ <summary>Expected outputs</summary>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
134
 
135
  ```text
136
  Input: the new d.n.a. sample has been multiplexed, and the gametes are already dividing. let's get the c.p.d. over there. dinner's at 630 p.m. see that piece on you in the l.a. times? chicago p.d. will eat him alive.
137
+ Outputs:
138
+ the new d.n.a. sample has been multiplexed, and the gametes are already dividing.
139
+ let's get the c.p.d. over there.
140
+ dinner's at 630 p.m.
141
+ see that piece on you in the l.a. times?
142
+ chicago p.d. will eat him alive.
143
+
144
  Input: 魔鬼兵團都死了?但是如果这让你不快乐就别做了。您就不能发个电报吗。我們都準備好了。
145
+ Outputs:
146
+ 魔鬼兵團都死了?
147
+ 但是如果这让你不快乐就别做了。
148
+ 您就不能发个电报吗。
149
+ 我們都準備好了。
150
+
151
  Input: él es uno de aquellos. ¿tiene algo de beber? cómo el aislamiento no vale la pena.
152
+ Outputs:
153
+ él es uno de aquellos.
154
+ ¿tiene algo de beber?
155
+ cómo el aislamiento no vale la pena.
156
+
157
  Input: พวกเขาต้องโกรธมากเลยใช่ไหม โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน
158
+ Outputs:
159
+ พวกเขาต้องโกรธมากเลยใช่ไหม
160
+ โทษทีนะลูกของเราไม่เป็นอะไรใช่ไหม
161
+ ถึงเจ้าจะลากข้าไปเจ้าก็ไม่ได้อะไรอยู่ดี
162
+ ผมคิดว่าจะดีกว่านะถ้าคุณไม่ออกไปไหน
163
+
164
  Input: розігни і зігни, будь ласка. я знаю, ваши люди храбры. было приятно, правда? для начала, тебе нужен собственный свой самолет.
165
+ Outputs:
166
+ розігни і зігни, будь ласка.
167
+ я знаю, ваши люди храбры.
168
+ было приятно, правда?
169
+ для начала, тебе нужен собственный свой самолет.
170
+
171
  Input: szedłem tylko do. pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka. ćwiczę już od dwóch tygodni a byłem zabity tylko raz.
172
+ Outputs:
173
+ szedłem tylko do.
174
+ pamiętaj, nigdy się nie obawiaj żyć na krawędzi ryzyka.
175
+ ćwiczę już od dwóch tygodni a byłem zabity tylko raz.
176
+
177
  ```
178
 
179
+ </details>
180
+
181
+
182
  # Model Architecture
183
  This is a data-driven approach to SBD. The model uses a `SentencePiece` tokenizer, a BERT-style encoder, and a linear classifier to predict which subwords are sentence boundaries.
184