Shilpaj commited on
Commit
7672fa1
·
verified ·
1 Parent(s): 2cbd601

Feat: Upload project data

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
Dockerfile ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM python:3.9-slim
2
+
3
+ WORKDIR /code
4
+
5
+ # Install system dependencies
6
+ RUN apt-get update && apt-get install -y \
7
+ build-essential \
8
+ curl \
9
+ software-properties-common \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ # Copy requirements first for better caching
13
+ COPY ./requirements.txt /code/requirements.txt
14
+
15
+ # Install Python dependencies
16
+ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
17
+
18
+ # Copy the rest of the application
19
+ COPY . /code
20
+
21
+ # Expose the port the app runs on
22
+ EXPOSE 7860
23
+
24
+ # Command to run the application
25
+ CMD ["python", "app.py"]
README.md CHANGED
@@ -9,4 +9,209 @@ license: mit
9
  short_description: Text Tokenization using Byte-Pair Encoding (BPE)
10
  ---
11
 
12
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  short_description: Text Tokenization using Byte-Pair Encoding (BPE)
10
  ---
11
 
12
+
13
+ # Tokenization
14
+
15
+ While training an LLM, following steps are followed:
16
+ ![LLM Training](./assets/docs/LLMprocess.png)
17
+
18
+ - After the data collection and preprocessing, the data is tokenized i.e. it is converted into discrete tokens.
19
+ - After tokenization, embeddings are generated by transforming the tokens into numerical vectors for processing by the model.
20
+ - Below are the ways in which the data is represented and why unicode is used for tokenization.
21
+
22
+
23
+
24
+ [toc]
25
+
26
+
27
+
28
+ ## ASCII
29
+
30
+ ASCII (American Standard Code for Information Interchange) is a character encoding standard that uses 7 bits to represent characters, allowing for 128 unique symbols, including English letters, digits, and control characters. ASCII is limited in its ability to represent characters from other languages, which is why Unicode was developed to cover a broader range of characters.
31
+
32
+
33
+
34
+ ## Unicode
35
+
36
+ Unicode is a standardized system that defines a set of characters and their corresponding code points, allowing for the representation of text in multiple languages and scripts. As of now, Unicode encompasses roughly 150,000 characters across 161 scripts, including 3,790 emojis, which facilitates the encoding of diverse languages such as Hindi, Korean, and more
37
+
38
+
39
+ The different versions of UTF (Unicode Transformation Format) represent Unicode characters in binary data. The most common encodings are:
40
+
41
+ ### UTF-8:
42
+ A variable-length encoding that uses 1 to 4 bytes per character. It is the most widely used encoding on the web and can represent all Unicode characters. The first 128 characters (which correspond to ASCII) are encoded in one byte, while additional characters require more bytes.
43
+
44
+ ### UTF-16:
45
+ This encoding typically uses 2 bytes for most characters but can use 4 bytes for less common characters. It is often used in environments where memory is less of a concern.
46
+
47
+ ### UTF-32:
48
+ A fixed-length encoding that uses 4 bytes for every character, making it straightforward but less efficient in terms of space compared to UTF-8 and UTF-16.
49
+
50
+ ---
51
+
52
+
53
+ ## Tokens
54
+
55
+ - There are different ways in which tokens can be created using the data
56
+ - Character-level and word-level tokens are less commonly used in Large Language Models (LLMs) like GPT due to specific limitations that make them less efficient and less effective for most language modeling tasks compared to subword tokenization techniques. Here’s why:
57
+
58
+
59
+ ### 1. Character-Level Tokens
60
+ - **Advantages**:
61
+ - Simple to implement.
62
+ - Can handle any input text without encountering "unknown tokens" since every character is part of the vocabulary.
63
+ - Good for tasks requiring fine-grained control, like poetry or transliteration.
64
+
65
+ - **Disadvantages**:
66
+ - **Longer Sequences**: Representing text character by character results in significantly longer input sequences. For example, the word "language" requires 8 tokens instead of 1 or 2 with subword tokenization. Longer sequences increase computational costs and training time.
67
+ - **Loss of Semantics**: Characters individually don't carry much semantic meaning, so the model has to work harder to infer relationships and build contextual meaning over long sequences.
68
+ - **Inefficiency**: LLMs have a fixed input size for each sequence (e.g., 2048 tokens for GPT-3). Using character-level tokens wastes a lot of capacity on redundant or trivial information.
69
+
70
+
71
+
72
+ ### 2. Word-Level Tokens
73
+ - **Advantages**:
74
+ - More semantically meaningful than characters. Each token corresponds to a complete word, reducing sequence length.
75
+ - Simpler vocabulary compared to subword tokenization.
76
+
77
+ - **Disadvantages**:
78
+ - **Large Vocabulary**: Word-level tokenization leads to a very large vocabulary to cover all possible words in a language, especially for morphologically rich languages. This increases memory requirements and makes the model harder to train.
79
+ - **Out-of-Vocabulary (OOV) Words**: Unseen words during training cannot be represented, leading to issues with generalization. For example, new words, names, or typos will not be handled well.
80
+ - **Lack of Subword Information**: The model cannot exploit the shared structure of words (e.g., "run," "runner," "running"). This makes it less effective at generalizing patterns across related words.
81
+
82
+
83
+ ### 3. Why Subword Tokens Work Better
84
+ Subword tokenization techniques, such as Byte Pair Encoding (BPE), WordPiece, or Unigram Language Modeling, provide a middle ground:
85
+ - **Balanced Vocabulary**: The vocabulary size is smaller than word-level tokenization but larger than character-level tokenization.
86
+ - **Handles Rare and OOV Words**: New words or typos can be broken into meaningful subwords, allowing the model to still understand and process them (e.g., "unhappiness" → "un," "happi," "ness").
87
+ - **Efficient Sequence Length**: Subwords reduce sequence length compared to characters, improving computational efficiency without losing much semantic information.
88
+ - **Reusability**: Common prefixes, suffixes, and roots (e.g., "ing," "pre," "ly") are tokenized consistently, which aids in learning and generalization.
89
+
90
+
91
+
92
+
93
+ ### Summary
94
+ While character-level and word-level tokenization have their use cases, they are not ideal for LLMs due to inefficiency and limitations in vocabulary handling and semantic representation. Subword tokenization strikes the right balance by being computationally efficient, flexible, and effective for generalization.
95
+
96
+ ---
97
+
98
+
99
+
100
+ ## Regex
101
+
102
+ - In order to create tokens, regex is used to identify the patterns in the data.
103
+ - Regular expressions (regex) play a key role in subword tokenization processes like Byte Pair Encoding (BPE), WordPiece, and Unigram Language Modeling, as they help define and extract meaningful patterns from text. Here's why regex is commonly used in these processes:
104
+
105
+ ### 1. Splitting and Preprocessing Text
106
+ Regex is highly efficient for text preprocessing, which is a crucial first step in subword tokenization. It is used to:
107
+
108
+ - Normalize Text: Remove special characters, extra spaces, or unwanted symbols.
109
+ - Split Text into Basic Units: Regex can split text into initial units, such as words, whitespace-separated tokens, or even characters, which serve as the foundation for creating subword vocabularies.
110
+ - Example: Splitting "Hello, world!" into ["Hello", ",", "world", "!"].
111
+
112
+ ### 2. Identifying Subword Patterns
113
+ Regex allows the tokenization algorithm to recognize subword units based on patterns:
114
+
115
+ - Breaking Words into Prefixes, Roots, and Suffixes: Regex can match patterns like "un-", "-ing", "-ly", etc., that are common subword components.
116
+ - Example: Matching re or ing in "repeating" using regex patterns like \bre or ing\b.
117
+ - Handling Non-Alphanumeric Characters: Regex makes it easy to handle punctuation, symbols, or digits by matching them as separate tokens.
118
+
119
+ ### 3. Constructing Subword Vocabularies
120
+ During vocabulary construction, regex helps:
121
+
122
+ - Counting Subword Frequencies: Regex can efficiently identify and count occurrences of subwords in a corpus, which is essential for frequency-based algorithms like BPE.
123
+ - Finding Merge Candidates: In BPE, regex identifies pairs of adjacent tokens (e.g., lo and ve in love) to determine which pair should be merged into a single token.
124
+
125
+ ### 4. Tokenizing New Text
126
+ When applying subword tokenization to new text, regex helps in:
127
+
128
+ - Matching Known Subword Units: Regex is used to break down words into subwords that exist in the pre-trained vocabulary.
129
+ - Example: Tokenizing "unhappiness" into ["un", "happi", "ness"] using regex patterns to match vocabulary entries.
130
+ - Handling OOV Cases: Regex can break unknown words into smaller subunits that still make sense semantically or phonetically.
131
+
132
+ ### 5. Efficiency and Flexibility
133
+ Regex is both:
134
+
135
+ - Fast: Regex libraries are optimized for text pattern matching, making them suitable for large-scale tokenization tasks.
136
+ - Flexible: Regex can be easily customized for different languages, tokenization rules, or specific needs (e.g., handling emojis, URLs, or hashtags).
137
+
138
+
139
+
140
+ ## Regex for New Language
141
+
142
+ - Designing a regex for tokenizing a new language requires careful consideration of linguistic, syntactic, and practical factors.
143
+ - Each language has unique characteristics such as writing systems, grammar rules, and punctuation usage that must be addressed. Below are the key factors to consider:
144
+
145
+ ### 1. Writing System and Script
146
+ - Character Set: Identify the script used in the language (e.g., Latin, Cyrillic, Devanagari, Arabic, etc.).
147
+ - Regex should include Unicode ranges for the characters in the language.
148
+ - Example: For Hindi (Devanagari script), use [\u0900-\u097F] to match characters.
149
+ - Diacritics: Consider combining characters like accents or tone markers.
150
+ - Example: In French, regex should account for é, è, ê, etc.
151
+
152
+ ### 2. Word Boundaries
153
+ - Word Separation: Determine how words are separated. Most languages use spaces, but some (e.g., Chinese, Japanese, Thai) do not.
154
+ - For space-separated languages: \b (word boundary) is useful.
155
+ - For languages without spaces: Define rules for splitting text based on known word patterns or syllables.
156
+
157
+ ### 3. Morphology
158
+ - Agglutinative or Inflected Forms: Languages like Turkish or Finnish have long words with multiple morphemes. Regex should consider splitting based on suffixes, prefixes, or infixes.
159
+ - Example: Use patterns like - or \w+ for handling hyphenated or compound words.
160
+ - Compound Words: German or Dutch often forms compound words. You might need regex to separate components intelligently.
161
+
162
+ ### 4. Special Characters
163
+ - Punctuation: Define how punctuation marks are handled (e.g., splitting them as separate tokens or keeping them attached to words).
164
+ - Example: Tokenizing "Hello, world!" might involve a regex like \w+|\S.
165
+ - Numerals: Decide how to tokenize numbers, especially if they include decimal points, commas, or currency symbols.
166
+ - Example: Use \d+(\.\d+)? to match integers and decimals.
167
+ - Currency, Dates, and Times: Handle specific patterns like $100, 2025-01-05, or 12:30 PM.
168
+
169
+ ### 5. Language-Specific Rules
170
+ - Elisions and Clitics: Handle contractions or shortened forms.
171
+ - Example: In French, "l'amour" should be split into ["l'", "amour"].
172
+ - Regex: \w+|\w+'\w+.
173
+ - Honorifics and Titles: Account for prefixes like "Mr.", "Dr.", or equivalents in other languages.
174
+
175
+ ### 6. Multilingual Considerations
176
+ - If the language frequently incorporates words or phrases from other languages (e.g., English borrowings in Japanese), the regex should accommodate mixed scripts or transliterations.
177
+ - Example: Tokenizing "コンピュータcomputer" in Japanese should handle both scripts appropriately.
178
+
179
+ ### 7. Whitespace and Line Breaks
180
+ - Whitespace Handling: Decide how to treat tabs, newlines, or multiple spaces.
181
+ - Regex like \s+ can be used to standardize whitespace.
182
+
183
+ ### 8. Efficiency
184
+ - Avoid overly complex regex patterns that could slow down tokenization for large texts. Break down tasks into smaller regex components if necessary.
185
+
186
+ ### 9. Non-Alphanumeric Symbols
187
+ - Consider language-specific symbols such as:
188
+ - Emojis or emoticons.
189
+ - Logograms or ideograms in Chinese.
190
+ - Phonetic annotations (e.g., furigana in Japanese).
191
+
192
+ ---
193
+
194
+
195
+
196
+ ## Byte Pair Encoding (BPE) Implementation
197
+
198
+ `dataset.txt`: Downloaded from [Link](https://ai4bharat.iitm.ac.in/datasets/sangraha)
199
+ `byte_pair_encoding.py`: Implementation of BPE
200
+ `tokenizer.json`: Saved tokens
201
+
202
+
203
+ ```bash
204
+ Token length: 31617
205
+ Ids length: 2045
206
+ Compression ratio: 15.4606X
207
+ ```
208
+
209
+
210
+
211
+ ### Usage
212
+
213
+ ```bash
214
+ $ python byte_pair_encoding.py
215
+ ```
216
+
217
+
app.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ FastAPI app to handle data processing for text data.
4
+
5
+ Author: Shilpaj Bhalerao
6
+ Date: Oct 29, 2024
7
+ """
8
+ # Standard imports
9
+ from fastapi import FastAPI, UploadFile, File, HTTPException
10
+ from fastapi.staticfiles import StaticFiles
11
+ from fastapi.templating import Jinja2Templates
12
+ from fastapi.responses import HTMLResponse
13
+ from fastapi import Request
14
+ from pydantic import BaseModel
15
+ import os
16
+ from pathlib import Path
17
+
18
+ # Local imports
19
+ from byte_pair_encoding import BPETokenizer
20
+
21
+ # Initialize FastAPI app
22
+ app = FastAPI()
23
+
24
+ # Mount static files
25
+ app.mount("/static", StaticFiles(directory="static"), name="static")
26
+
27
+ # Initialize templates
28
+ templates = Jinja2Templates(directory="templates")
29
+
30
+ # Add a request model for text processing
31
+ class TextRequest(BaseModel):
32
+ text: str
33
+
34
+
35
+ @app.get("/", response_class=HTMLResponse)
36
+ async def root(request: Request):
37
+ """Render the main page"""
38
+ return templates.TemplateResponse("index.html", {"request": request})
39
+
40
+
41
+ @app.post("/upload")
42
+ async def upload_file(file: UploadFile = File(...)):
43
+ """Handle file upload"""
44
+ content_type = file.content_type
45
+ content = await file.read()
46
+
47
+ try:
48
+ print(f"Received file: {file.filename}")
49
+
50
+ if content_type.startswith('text'):
51
+ print("Text file detected")
52
+ # Convert bytes to string
53
+ text = content.decode()
54
+ return {"type": "text", "text": text}
55
+ else:
56
+ print("Unsupported file type")
57
+ raise HTTPException(status_code=400, detail="Unsupported file type. Please upload a text file.")
58
+ except Exception as e:
59
+ print(f"Error: {str(e)}")
60
+ raise HTTPException(status_code=500, detail=str(e))
61
+
62
+
63
+ @app.post("/process")
64
+ async def process_data(file: UploadFile = File(...)):
65
+ """Process the uploaded text file by tokenizing it using BPE"""
66
+ content_type = file.content_type
67
+ content = await file.read()
68
+
69
+ if content_type.startswith('text'):
70
+ # Load tokenizer and process text
71
+ tokenizer = BPETokenizer.load("tokenizer.json")
72
+ text = content.decode()
73
+ tokens = tokenizer.encode(text)
74
+ return {"type": "text", "processed_data": tokens}
75
+ else:
76
+ raise HTTPException(status_code=400, detail="Unsupported file type. Please upload a text file.")
77
+
78
+
79
+ @app.get("/sample/{sample_number}")
80
+ async def get_sample(sample_number: int):
81
+ """Get sample text file content"""
82
+ try:
83
+ sample_path = Path(f"samples/sample{sample_number}.txt")
84
+ if not sample_path.exists():
85
+ raise HTTPException(status_code=404, detail="Sample file not found")
86
+
87
+ with open(sample_path, 'r', encoding='utf-8') as f:
88
+ text = f.read()
89
+ return {"type": "text", "text": text}
90
+ except Exception as e:
91
+ raise HTTPException(status_code=500, detail=str(e))
92
+
93
+
94
+ # Add this new route to handle direct text processing
95
+ @app.post("/process_text")
96
+ async def process_text(text_request: TextRequest):
97
+ """Process text directly without file upload"""
98
+ try:
99
+ # Load tokenizer and process text
100
+ tokenizer = BPETokenizer.load("tokenizer.json")
101
+ tokens = tokenizer.encode(text_request.text)
102
+ return {"type": "text", "processed_data": tokens}
103
+ except Exception as e:
104
+ raise HTTPException(status_code=500, detail=str(e))
105
+
106
+
107
+ # Add this new route to handle token decoding
108
+ @app.post("/decode_text")
109
+ async def decode_text(text_request: TextRequest):
110
+ """Decode the tokenized text back to original form"""
111
+ try:
112
+ # Load tokenizer and decode tokens
113
+ tokenizer = BPETokenizer.load("tokenizer.json")
114
+
115
+ # Clean and parse the token string
116
+ token_str = text_request.text.strip('[]').replace(' ', '') # Remove brackets and spaces
117
+ if not token_str:
118
+ raise ValueError("Empty token string")
119
+
120
+ # Split by comma and convert to integers
121
+ tokens = [int(t) for t in token_str.split(',') if t]
122
+
123
+ decoded_text = tokenizer.decode(tokens)
124
+ return {"type": "text", "decoded_text": decoded_text}
125
+ except ValueError as ve:
126
+ raise HTTPException(status_code=400, detail=f"Invalid token format: {str(ve)}")
127
+ except Exception as e:
128
+ raise HTTPException(status_code=500, detail=str(e))
129
+
130
+
131
+ if __name__ == "__main__":
132
+ import uvicorn
133
+ uvicorn.run(app, host="0.0.0.0", port=7860)
assets/docs/LLMprocess.png ADDED
byte_pair_encoding.py ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Byte Pair Encoding Tokenizer for Indian Languages
4
+ A simple implementation of BPE tokenizer with Marathi-specific preprocessing.
5
+ Author: Shilpaj Bhalerao
6
+ Date: 2025-01-05
7
+ """
8
+ # Standard Library Imports
9
+ import re
10
+
11
+ # Third Party Imports
12
+ from tqdm import tqdm
13
+
14
+
15
+ class BPETokenizer:
16
+ """
17
+ Byte Pair Encoding Tokenizer
18
+
19
+ :param vocab_size (int): Size of final vocabulary (including base bytes)
20
+ :param merges (dict): Dictionary of merge rules
21
+ :param vocab (dict): Dictionary mapping token IDs to their byte sequences
22
+ :param inverse_vocab (dict): Dictionary mapping byte sequences to token IDs
23
+ """
24
+
25
+ def __init__(self, vocab_size=1000, use_regex=False):
26
+ """
27
+ Initialize the tokenizer with desired vocabulary size.
28
+ """
29
+ self.vocab_size = vocab_size
30
+ self.merges = {}
31
+ self.len_of_ids = 0
32
+ self.len_raw_bytes = 0
33
+ self.vocab = {idx: bytes([idx]) for idx in range(256)}
34
+ self.inverse_vocab = {bytes([idx]): idx for idx in range(256)}
35
+ self.use_regex = use_regex
36
+
37
+ # Marathi tokenization regex pattern
38
+ self.marathi_regex = re.compile(
39
+ r"([\u0900-\u094F\u0951-\u097F]+|" # Marathi words and ligatures
40
+ r"[\u0966-\u096F]+|" # Marathi numerals (०-९)
41
+ r"\d+(?:\s[\u0900-\u097F]+)?|" # Arabic numerals with Marathi context
42
+ r"#[\w\u0900-\u097F]+|" # Hashtags
43
+ r"[\w\u0900-\u097F]+[''][\w\u0900-\u097F]+|" # Compound words with apostrophes
44
+ r"[\w\u0900-\u097F]+(?:-[\w\u0900-\u097F]+)*|" # Hyphenated words
45
+ r"[\w\u0900-\u097F]+\.[\w\u0900-\u097F]*|" # Abbreviations
46
+ r'\"[^\"]+\"|\'[^\']+\'|' # Quoted text
47
+ r"[\u0964\u0965.!?…]|" # Marathi punctuation
48
+ r"[^\s\u0900-\u097F]+)" # Non-Marathi symbols
49
+ )
50
+
51
+ def preprocess(self, text: str) -> str:
52
+ """
53
+ Preprocess Marathi text before tokenization.
54
+
55
+ :param text: Input Marathi text
56
+ :return: Preprocessed text with tokens separated by spaces
57
+ """
58
+ # Find all tokens using the Marathi regex
59
+ tokens = self.marathi_regex.findall(text)
60
+
61
+ # Join tokens with spaces
62
+ processed_text = ' '.join(tokens)
63
+
64
+ # Normalize whitespace
65
+ processed_text = ' '.join(processed_text.split())
66
+
67
+ return processed_text
68
+
69
+ def _get_stats(self, ids: list[int]) -> dict[tuple[int, int], int]:
70
+ """
71
+ Count frequency of adjacent pairs in sequence.
72
+
73
+ :param ids: list of integers
74
+ :return: dictionary of pairs and their frequencies
75
+ """
76
+ counts = {}
77
+ for pair in zip(ids, ids[1:]):
78
+ counts[pair] = counts.get(pair, 0) + 1
79
+ return counts
80
+
81
+ def _merge(self, ids: list[int], pair: tuple[int, int], idx: int) -> list[int]:
82
+ """
83
+ Replace all occurrences of pair with new token idx.
84
+
85
+ :param ids: list of integers
86
+ :param pair: tuple of integers
87
+ :param idx: integer
88
+ :return: list of integers
89
+ """
90
+ newids = []
91
+ i = 0
92
+ while i < len(ids):
93
+ if i < len(ids) - 1 and ids[i] == pair[0] and ids[i+1] == pair[1]:
94
+ newids.append(idx)
95
+ i += 2
96
+ else:
97
+ newids.append(ids[i])
98
+ i += 1
99
+ return newids
100
+
101
+ def train(self, text: str):
102
+ """
103
+ Train the BPE tokenizer on the given text.
104
+ :param text: Input text to train on
105
+ """
106
+ print("Training BPE tokenizer...")
107
+
108
+ # Preprocess text first
109
+ if self.use_regex:
110
+ text = self.preprocess(text)
111
+
112
+ # Convert text to bytes and get initial tokens
113
+ raw_bytes = text.encode("utf-8")
114
+ raw_bytes = list(map(int, raw_bytes)) # convert to integers
115
+ self.len_raw_bytes = len(raw_bytes)
116
+
117
+ # Calculate number of merges needed
118
+ num_merges = self.vocab_size - 256
119
+ ids = list(raw_bytes) # copy so we don't destroy the original list
120
+
121
+ # Perform merges
122
+ for i in tqdm(range(num_merges)):
123
+ stats = self._get_stats(ids)
124
+ if not stats:
125
+ break
126
+
127
+ # Find most frequent pair
128
+ pair = max(stats, key=stats.get)
129
+ idx = 256 + i
130
+
131
+ # Perform the merge
132
+ ids = self._merge(ids, pair, idx)
133
+ self.len_of_ids = len(ids)
134
+ self.merges[pair] = idx
135
+
136
+ # Update vocabulary
137
+ new_token = self.vocab[pair[0]] + self.vocab[pair[1]]
138
+ self.vocab[idx] = new_token
139
+ self.inverse_vocab[new_token] = idx
140
+
141
+ def encode(self, text: str) -> list[int]:
142
+ """
143
+ Encode text into token IDs.
144
+
145
+ :param text: Text to encode
146
+ :return: List of token IDs
147
+ """
148
+ # Preprocess if needed
149
+ if self.use_regex:
150
+ text = self.preprocess(text)
151
+
152
+ # Convert text to list of integers
153
+ tokens = list(text.encode("utf-8"))
154
+ while len(tokens) >= 2:
155
+ stats = self._get_stats(tokens)
156
+ pair = min(stats, key=lambda p: self.merges.get(p, float("inf")))
157
+ if pair not in self.merges:
158
+ break # nothing else can be merged
159
+ idx = self.merges[pair]
160
+ tokens = self._merge(tokens, pair, idx)
161
+ return tokens
162
+
163
+ def decode(self, ids: list[int]) -> str:
164
+ """
165
+ Decode token IDs back to text.
166
+
167
+ :param ids: List of token IDs
168
+ :return: Decoded text
169
+ """
170
+ tokens = b"".join(self.vocab[idx] for idx in ids)
171
+ return tokens.decode("utf-8", errors="replace")
172
+
173
+ def token_to_text(self, token_id: int) -> str:
174
+ """
175
+ Convert a single token ID to its text representation.
176
+
177
+ :param token_id: Token ID
178
+ :return: Text representation of the token
179
+ """
180
+ return self.vocab[token_id].decode("utf-8", errors="replace")
181
+
182
+ def save(self, path: str):
183
+ """
184
+ Save tokenizer state to file.
185
+
186
+ :param path: Path to save the file
187
+ """
188
+ import json
189
+ state = {
190
+ 'vocab_size': self.vocab_size,
191
+ 'merges': list(self.merges.items()), # Convert to list of tuples
192
+ 'vocab': {k: list(v) for k, v in self.vocab.items()} # Convert bytes to lists
193
+ }
194
+ with open(path, 'w') as f:
195
+ json.dump(state, f)
196
+
197
+ @classmethod
198
+ def load(cls, path: str):
199
+ """
200
+ Load tokenizer state from file.
201
+
202
+ :param path: Path to load the file
203
+ :return: Loaded tokenizer
204
+ """
205
+ import json
206
+ with open(path, 'r') as f:
207
+ state = json.load(f)
208
+
209
+ tokenizer = cls(vocab_size=state['vocab_size'])
210
+ # Convert lists back to tuples for the merge pairs
211
+ tokenizer.merges = {tuple(k): v for k, v in state['merges']}
212
+ tokenizer.vocab = {int(k): bytes(v) for k, v in state['vocab'].items()}
213
+ tokenizer.inverse_vocab = {v: k for k, v in tokenizer.vocab.items()}
214
+ return tokenizer
215
+
216
+ def get_vocab_size(self) -> int:
217
+ """
218
+ Get the size of the vocabulary.
219
+
220
+ :return: Size of the vocabulary
221
+ """
222
+ return len(self.vocab)
223
+
224
+ def get_compression_ratio(self, text: str) -> float:
225
+ """
226
+ Get the compression ratio of the text.
227
+
228
+ :param text: Input text
229
+ :return: Compression ratio (original_length / encoded_length)
230
+ """
231
+ # Preprocess if needed
232
+ if self.use_regex:
233
+ text = self.preprocess(text)
234
+
235
+ return round(self.len_raw_bytes / self.len_of_ids, 4)
236
+
237
+ def get_token_length(self, text: str) -> int:
238
+ """
239
+ Get the length of the tokenized text.
240
+
241
+ :param text: Input text
242
+ :return: Length of the tokenized text
243
+ """
244
+ return self.len_raw_bytes
245
+
246
+ def get_ids_length(self, text: str) -> int:
247
+ """
248
+ Get the length of the tokenized text.
249
+
250
+ :param text: Input text
251
+ :return: Length of the tokenized text
252
+ """
253
+ return self.len_of_ids
254
+
255
+ def is_encoded_equals_decoded(self, text: str) -> bool:
256
+ """
257
+ Check if encoding and decoding are consistent.
258
+
259
+ :param text: Input text
260
+ :return: True if consistent, False otherwise
261
+ """
262
+ encoded = self.encode(text)
263
+ decoded = self.decode(encoded)
264
+ return text == decoded
265
+
266
+
267
+ if __name__ == "__main__":
268
+
269
+ # Read text from file
270
+ with open("dataset.txt", "r") as file:
271
+ text = file.read()
272
+
273
+ # Initialize and train
274
+ tokenizer = BPETokenizer(vocab_size=3000)
275
+ tokenizer.train(text)
276
+
277
+ # Save and load
278
+ tokenizer.save("tokenizer.json")
279
+ loaded_tokenizer = BPETokenizer.load("tokenizer.json")
280
+
281
+ # Encode and decode
282
+ encoded = tokenizer.encode("या पुतळ्याच्या डोक्यावर अज्ञातांनी चप्पल ठेवल्याचे आढळून आले आहे.")
283
+ decoded = loaded_tokenizer.decode(encoded)
284
+
285
+ # Check consistency
286
+ print("Is encoded equals to loaded decoded? ", decoded == "या पुतळ्याच्या डोक्यावर अज्ञातांनी चप्पल ठेवल्याचे आढळून आले आहे.")
287
+
288
+ # Print vocab size
289
+ print(f"Vocab size: {tokenizer.get_vocab_size()}")
290
+
291
+ # Print token length
292
+ print(f"Token length: {tokenizer.get_token_length(text)}")
293
+
294
+ # Print ids length
295
+ print(f"Ids length: {tokenizer.get_ids_length(text)}")
296
+
297
+ # Print compression ratio
298
+ print(f"Compression ratio: {tokenizer.get_compression_ratio(text)}X")
dataset.txt ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ बहुचर्चित एचएएल एम्प्लॉईज सहकारी सोसायटीच्या २००१ ते २०११ या कालावधीत लेखा परीक्षण करताना कसूर केल्याच्या कारणावरून सहकार विभागाने लेखा परीक्षकांना कारणे दाखवा नोटीस बजावली आहे. या संदर्भात सोसायटीच्या सभासदांनी तीन वार्षिक सर्वसाधारण सभांत ठराव मंजूर करून लेखा परीक्षकांवर गुन्हे दाखल करण्याची मागणी सहकार खात्याकडे केली होती. एचएएल सोसायटीत २००१ ते २०१२ या काळात कोटय़वधी रुपयांचा गैरव्यवहार झाल्याचे निष्पन्न झाले आहे. या कार्यकाळात लेखा परीक्षकांनी कायद्याप्रमाणे लेखा परीक्षण करून वेळीच कारवाई केली असती तर भ्रष्टाचार झाला नसता आणि सोसायटी वाचली असती, असे सभासदांचे म्हणणे आहे. सभासदांनी लेखा परीक्षकांवर गुन्हे दाखल करण्याच्या केलेल्या ठरावाची अंमलबजावणी करावी यासाठी एचएएल सोसायटी नवनिर्माण कृती समितीचे समन्वयक प्रवीण तिदमे यांच्या नेतृत्वाखाली नोव्हेंबर महिन्यात जिल्हा उपनिबंधक कार्यालयासमोर उपोषणही केले होते. त्यानंतर जिल्हा विशेष लेखा परीक्षक वर्ग १ सहकारी संस्था यांनी लेखा परीक्षण अहवालाची छाननी केली. त्या पाश्र्वभूमीवर, तुषार बाजीराव पगार (नाशिक), डी. एम. बारस्कर (अहमदनगर), जयंत व्ही. कोळपकर अॅण्ड कंपनी (पुणे), बिपीन जैन (धुळे), सतीष बन्सीलाल संघवी (नाशिक) आणि एस. आर. करवा अॅण्ड कंपनी (नाशिकरोड) यांना कारणे दाखवा नोटिसा बजावल्या आहेत. याची माहिती कृती समितीने दिली. संबंधितांना पाठविलेल्या नोटिसीत लेखा परीक्षण छाननी अहवालात समोर आलेल्या गंभीर मुद्दय़ांचा उल्लेख सहकार विभागाने केला आहे. संचालक मंडळाने २००६ ते ११ या कालावधीत २६.२५ कोटी रुपयांची रक्कम पूर्वपरवानगी न घेता बँक ऑफ महाराष्ट्रमध्ये केलेल्या मुदतठेव गुंतवणुकीत १७ कोटींची अफरातफर व गैरव्यवहाराच्या आक्षेपावर लेखा परीक्षकांनी त्यांच्या अहवाल वर्षांत गुंतवणूक वा मुदत ठेव नूतनीकरणाबाबत कोणतेही शेरे नमूद नाहीत. २११.०१ लाख भागभांडवल परत केले. मात्र भागमूल्यांकनानुसार रक्कम परत करण्याबाबत शेरे नमूद नाहीत, लेखा परीक्षकांनी लेखा परीक्षणावेळी योग्यरीत्या तपासणी करून गुंतवणुकीची खात्री केली नाही, लेखा परीक्षणात तेरीजपत्रक जोडले नसल्याने किती भागभांडवल परत केले आहे याची रक्कम नमूद करता येत नाही अशा विविध बाबी नोटिसीत नमूद करण्यात आल्या आहेत. जिल्हा उपनिबंधकांनी लेखा परीक्षकांना नोटीस बजावत कारवाई सुरू केल्यामुळे सभासदांनी तिचे स्वागत केले आहे. पाच हजार कुटुंबांचा आर्थिक आधार असणारी सोसायटी पुनरुजीवित होईपर्यंत आमचा लढा सुरू राहणार असल्याचे सोसायटी नवनिर्माण कृती समितीने म्हटले आहे.
2
+
3
+ ट्युनिस : उत्तर आफ्रिकेतील ट्युनिशिया देशाची राजधानी. लोकसंख्या ६,८५,००० (१९६६). प्राचीन कार्थेजपासून सु.१५ किमी., भूमध्य समुद्राकाठी मोक्याच्या जागी, काहीशा उंच संयोगभूमीवर वसलेले हे शहर सु. १० किमी.वरील हल्क-अल् वाडी (ला गूलेट) या त्याच्या बंदराशी ७ मी. खोल खाडीने जोडलेले आहे. येथील हवामान भूमध्यसामुद्री असून वार्षिक सरासरी तपमान व पर्जन्य अनुक्रमे १७·७° से. व ३७·५ सेंमी. आहे. जुने ट्युनिस कसबा किल्ल्यापासून टेकडीच्या उतारावर वसले असून मदीना हा त्याचा मुख्य भाग आहे. आधुनिक ट्युनिस टेकडी व ट्युनिस सरोवर यांमधील सखल भागावर वसले आहे. येथे प्रशस्त रस्ते, हवेशीर घरे, उंच इमारती व आधुनिक सुखसोयी आहेत. जुन्या भागात अरुंद बोळ, एकमजली बिनखिडक्यांची चौकोनी घरे, 'सुक' नावाचे छपरबंद बाजार, अझ झैतूनासारख्या प्राचीन मशिदी, जुने मुस्लिम विद्यापीठ इ. आहेत. रोमन वास्तुशैलीची स्नानगृहे प्रसिद्ध आहेत. लोकवस्ती फ्रेंच, इटालियन आणि मुस्लिम अशी संमिश्र आहे. ट्युनिसभोवती ऑलिव्ह व इतर भूमध्यसामुद्री फळे व धान्ये पिकतात. गावात पीठगिरण्या, साबण, ऑलिव्ह तेल, फळे डबाबंद करणे, टिकविणे, व सुकविणे, मद्ये, कापड, गालिचे, सिमेंट, बांधकाम साहित्य, धातुशुद्धी, सुपरफॉस्फेटसारखे रासायनिक पदार्थ, खाणीसाठी स्फोटके, यंत्रे, अत्तरे, पादत्राणे, विणलेले कपडे, रेल्वे कर्मशाळा, वीजउद्योग, औष्णिक वीजकेंद्रे इ. कारखाने व उद्योग आहेत. ट्युनिसहून फॉस्फेट, लोहधातुके, फळे, खजूर, ऑलिव्ह तेल, कागदासाठी एस्पार्टो गवत, स्पंज, स्थानिक गालिचे, मातीची भांडी इ. निर्यात होतात. येथे आंतरराष्ट्रीय विमानतळ असून, हे देशातील व शेजारी देशांतील शहरांशी लोहमार्गांनी व सडकांनी जोडलेले आहे. दवाखाने, रुग्णालये, सांस्कृतिक केंद्रे, शाळा, ट्युनिस विद्यापीठ (१९१६), नगरपालिका इ. सोयी आहेत. येथील पर्यटन व्यवसाय वाढत आहे.
4
+
5
+ एखाद्याची अक्कल काढायची असल्यास, त्याची अक्कल घुटण्यात आहे काय? एखाद्याची अक्कल काढायची असल्यास, त्याची अक्कल घु��ण्यात आहे काय? असा शब्दप्रयोग सर्रास केला जातो किंवा कुणाला शरणागती पत्करण्यास भाग पाडले तरी 'त्याला गुडघे टेकायला लावले', असे आम्ही मोठ्या अभिमानाने सांगत असतो. तर असा हा 'घुटणा' म्हणजेच गुडघा मानवी शरीरातील अत्यंत महत्त्वाचा भाग. गुडघा निकामी झाला की माणसाचे चालणेच थांबते. अशा वेळी मग कृत्रिम गुडघा बसविण्याशिवाय दुसरा पर्याय त्याच्याकडे नसतो. एरवी या गुडघ्याच्या प्रत्यारोपणाचा अवाढव्य खर्च आणि रुग्णांची होणारी लुटमार बघितली की मग कुणाच्याही घुटण्यात आल्याशिवाय राहत नाही. मात्र यापुढे तशी गरज पडणार नाही. कारण केंद्र शासनाने आता गुडघे प्रत्यारोपण शस्त्रक्रियेसाठीच्या दरांवर नियंत्रण आणण्याचा निर्णय घेतला आहे. त्यामुळे या शस्त्रक्रियेवरील खर्च जवळपास ७० टक्क्यांनी कमी होण्याची शक्यता असून, समस्त गुडघाग्रस्तांसाठी ही आनंदाची वार्ता आहे. राष्टÑीय औषध दर नियंत्रण प्राधिकरणाने (एनपीपीए) गुडघ्यांच्या शस्त्रक्रियेमध्ये रुग्णांची होणारी लुबाडणूक थांबविण्याकरिता रुग्णालये, वितरक तसेच आयातदारांच्या नफेखोरीचे आकडे गेल्या आठवड्यात उघडकीस आणले होते. या शस्त्रक्रियेत तब्बल ३०० टक्क्यांहून अधिक नफा कमावला जात असल्याचे एनपीपीएने लक्षात आणून दिले आहे. मुख्य म्हणजे पंतप्रधान नरेंद्र मोदी यांनी स्वातंत्र्यदिनाच्या आपल्या भाषणात हृदयरुग्णांसाठीच्या स्टेंटस्प्रमाणे गुडघा प्रत्यारोपण शस्त्रक्रिया स्वस्त करण्याचा मुद्दा मांडला होता. त्यानंतर हालचालींना वेग आला. हा निर्णय निश्चितच स्वागतार्ह आणि रुग्णांना मोठा दिलासा देणारा आहे. अपघात, बदलती जीवनशैली, व्यायामाचा अभाव आदी कारणांमुळे आज अस्थिरोग आणि प्रामुख्याने गुडघ्यांचे आजार प्रचंड वाढले आहेत. देशात आजमितीस दीड ते दोन कोटी लोकांना गुडघा प्रत्यारोपणाची गरज आहे. परंतु केवळ सव्वा ते दीड लाखच शस्त्रक्रिया होत असतात. कारण यासाठी चार ते पाच लाख रुपये खर्च येत असल्याने अनेकदा रुग्णांना ते आर्थिकदृष्ट्या परवडत नसते. परंतु आता किमती घसरल्याने ते शक्य होणार आहे. केंद्र शासनाने यावर्षीच्या प्रारंभी नवे आरोग्य धोरण जाहीर केले होते. या धोरणात ज्या महत्त्वाच्या पैलूंवर लक्ष केंद्रित करण्यात आले त्यात जनतेला आरोग्यसेवेवर कराव्या लागणाºया खर्चात कपात प्रमुख हो���ी. त्यादिशेने वाटचाल सुरू झाली आहे, असे समजण्यास हरकत नाही.
6
+
7
+ नागपूरः राज्याचे विद्यमान अन्न व औषधी प्रशासन मंत्री संजय राठोड हे भाजप-शिवसेना सरकारमध्ये महसूल राज्यमंत्री असताना त्यांनी वाशिम जिल्ह्यातील कारंजा लाड येथील गायरानाची २५ कोटी रुपये किमतीची तब्बल १० एकर जमीन दोन व्यक्तींना वाटप केल्याचे नवे प्रकरण समोर आले. तत्कालीन जिल्हाधिकारी लक्ष्मीनारायण मिश्रा यांनी या जमिनीच्या प्रकरणात बनावट कागदपत्रे सादर करणाऱ्या व्यक्तींविरुद्ध फौजदारी गुन्हे दाखल करावेत आणि ही जमीन सरकारजमा करावी असे सुस्पष्ट आदेश दिले होते; पण ते डावलून राठोड यांनी काळी कारंजामधील पाच एकर जमीन ही युनूस अय्युब अन्सारी यांना, तर पाच एकर जमीन ही रोहित राधेश्याम लाहोटी यांना दिली. दोन्ही आदेश त्यांनी एकाच दिवशी म्हणजे ७ ऑगस्ट २०१९ रोजी पारित केले. 'लोकमत'ने मंगळवारी सावरगावची ५ एकर जमीन खासगी व्यक्तीच्या नावे केल्याचे प्रकरण उघडकीस आणले. या प्रकरणावर संजय राठोड यांचे दोन्ही मोबाइल स्विच ऑफ होते. मंत्रिमहोदयांची प्रकृती बरी नसल्याचे त्यांचे स्वीय सचिव म्हणाले. - बेकायदा जमीन वाटपप्रकरणी सोमवारी कामकाज रोखून धरणाऱ्या विरोधकांनी मंगळवारी मात्र या मुद्द्यावर मौन बाळगल्याने आश्चर्य व्यक्त केले जात आहे. - कृषिमंत्री अब्दुल सत्तार सभागृहात असूनही विरोधी पक्षाने त्यांच्या राजीनाम्याच्या मागणीला स्पर्श केला नाही. सत्तापक्ष आणि विरोधक यांच्यात या विषयावर काही समझौता तर झाला नाही ना, अशी चर्चाही विधानभवन परिसरात रंगली होती. सर्व ठळक बातम्यांसाठी जरूर वाचा महाराष्ट्रातील अव्वल मराठी वेबसाईट "लोकमत डॉट कॉम"
8
+
9
+ सोलापूर : निर्यातक्षम केळी तोडणे, ती व्यवस्थित ठेवणे आणि कंटेनरमध्ये भरणे आदी कामांमध्ये पश्चिम बंगालच्या मजुरांचे कौशल्य असून कोरोना साथीमुळे गावी गेलेल्या या मजुरांना जिल्ह्यात परत येण्यासाठी परवानगी द्यावी, अशी मागणी करमाळा येथील केळी निर्यातदारांनी केली आहे. हे कामगार राज्यात परत गेल्याने स्थानिक कामगारांना हे काम देण्यात आले; पण त्यांच्याकडून निर्यातक्षम प्रत राखण्यात अडचणी येत असल्याची कैफियत या निर्यातदारांनी व्हिडिओ कॉन्फरन्सद्वारे जिल्हाधिकाºयापुढे मांडली आहे. कोरोनाचा प्रादुर्भाव सुरू झाल्यानंतर करमाळा त��लुक्यातील कंदर, माळशिरस व माढा तालुक्यातील परराज्यातील कामगार रेल्वेची सुविधा उपलब्ध झाल्यानंतर आपल्या राज्यात परत गेले आहेत. परंतु कोरोना प्रादुर्भावाच्या सुरुवातीच्या टप्प्यामध्ये सोलापूरमधून अफगाणिस्थान, इराण, ओमान, सौदीअरेबिया व नेदरलॅण्ड या देशांमध्ये ५३८ मे. टनपर्यंत केळीची निर्यात झालेली आहे. परराज्यातील कामगार स्थलांतरित झाल्यानंतर स्थानिक कामगारांना निर्यात साखळीमध्ये घेऊन काम पुढे सुरू ठेवण्याचा प्रयत्न स्थानिक निर्यातदारांनी केलेला आहे. पण स्थानिक कामगारांकडून निर्यातक्षम प्रत राखण्यात अडचणी येत असल्याने निर्यातीवर परिणाम होत असल्याची तक्रार निर्यातदारांनी केली आहे. या पार्श्वभूमीवर जिल्हाधिकारी मिलिंद शंभरकर यांनी केळी निर्यातदारांशी व्हिडिओ कॉन्फरन्सद्वारे चर्चा केली. यामध्ये अजहर पठाण, अजित ओतारी, नीलेश काळे, किरण डोके, विष्णू पोळ या प्रतिनिधींनी भाग घेतला. निर्यातीमध्ये केळी काढणीपासून ते कंटेनरमध्ये भरेपर्यंत शक्यतो पश्चिम बंगालमधील कामगारांमार्फत सर्व प्रक्रिया पूर्ण केली जात होती. यामध्ये केळी झाडावरून उतरविणे, ती साफ करणे, केळीच्या फण्या वेगळ्या करणे, डंपिंग करणे, परत स्वच्छ करणे व हवाबंद प्लास्टिक बॅगमध्ये पॅक करून ती कर्टन बॉक्समध्ये ठेवणे व कंटेनरमध्ये भरणे अशी संपूर्ण प्रक्रिया करण्यास त्यांना दीड रुपया प्रति किलो मजुरी दिली जाते. हे कामगार दरवर्षी सणांदरम्यान मूळगावी परतात. त्यांच्या एका समूहामध्ये २० लोक असतात. प्रतिकिलोप्रमाणे मजुरी असल्याने पहाटेपासून केळीचे घड उतरविण्यापासून ते कंटेनरमध्ये भरण्यापर्यंत काम करण्याची त्यांची तयारी असते. पण स्थानिक कामगारांना वेळेचे बंधन व अंगावर घेऊन काम करण्याची तयारी नसल्याची अडचण होत असल्याच्या तक्रारी मांडल्या. त्यामुळे पश्चिम बंगालमधील कर्मचाºयांना परत बोलावण्यास परवानगी द्यावी, अशी मागणी केली. स्थानिक कामगार केळी निर्यात साखळीमध्ये काम करण्यास अकुशल आहेत. त्यांच्या कामाचे तास सकाळी १० ते सायंकाळी ६ पर्यंतच आहे. त्यांना प्रशिक्षित केल्यानंतर इतर निर्यातदारांकडे कामासाठी जाण्याचे प्रमाण जास्त आहे. प्रति किलोमागे मजुरी दरामध्ये वाढ करावी, अशी अपेक्षा असल्याने उत्पादन खर्चात वाढ होत आहे. कोरोना प्रादुर्भा��ामुळे पुणे-मुंबईसारख्या शहरातील परत आलेले कामगार या साखळीत काम करीत आहेत. कोरोना प्रादुर्भाव संपल्यानंतर पश्चिम बंगालचे कामगार कामावर येण्याची शक्यता आहे. स्थानिक कामगारांमार्फत निर्यातक्षम केळीची प्रत निर्यात साखळीमध्ये राखली जात नाही, असे व्यापाºयांचे म्हणणे आहे. जिल्ह्यातील केळी लागवडीच्या पट्ट्यामध्ये प्रगतिशील शेतकºयांच्या माध्यमातून स्थानिक कामगारांना प्रशिक्षित करण्याचे नियोजन आहे. सध्या परराज्याच्या कामगारांना परत केळी निर्यात पट्ट्यामध्ये आणून त्यांच्या समूहामध्ये स्थानिक कामगारांचा समावेश करण्यात येणार आहे. - रवींद्र माने,
10
+
11
+ महाराष्ट्र विधानसभा निवडणुकीसाठी (Maharashtra Assembly Election) येत्या 21 ऑक्टोबर रोजी सार्वजनिक व खाजगी क्षेत्रातील सर्व कंपन्यांच्या सर्व कर्मचाऱ्यांना सुट्टी जाहीर करण्यात आली आहे. राज्यात मतदानाचा टक्का वाढवण्यासाठी हा नियम असून त्यानुसार मिळणारी ही सुट्टी भरपगारी देण्यात येणार आहे. अगदीच अपवादात्मक स्थितीत जर का एखाद्या कंपनीला पूर्ण दिवसाची सुट्टी देणे शक्य नसेल तर संबंधित जिल्हाधिकाऱ्यांच्या परवानगीने मतदानासाठी कर्मचाऱ्यांना निदान दोन ते तीन तासांची भरपगारी सवलत देणे बंधनकारक असणार आहे. मात्र जर का एखादी कंपनी कर्मचाऱ्यांना सुट्टी किंवा सवलत देत नसेल तर मतदारांना जिल्हा कामगार अधिकाऱ्यांकडे थेट तक्रार नोंदविता येणार आहे. प्राप्त माहितीनुसार, मतदानाच्या दिवशी दरवेळेस राज्य आणि केंद्र सरकारची कार्यालये, निमशासकीय कार्यालये, महामंडळ ऑफिस, सार्वजनिक उपक्रम, बॅंका कामकाजासाठी बंद ठेवण्यात येतात. यानुसार मतदाराला मतदान वेळेत कधीही जाऊन आपले मत नोंदवता यावे यासाठी ही तरतूद आहे. मात्र जर का कंपनीने सुट्टी किंवा सवलत नाकारली तर साहजिकच पगार कापला जाईल या चिंतेने मतदान करणे टाळले जाईल. असे होऊ नये याकरिता संबंधित बाबतीत तक्रार आल्यास त्या कंपनीवर कायदेशीर कारवाई करण्यात येणार असल्याचे समजत आहे. मतदानाच्या दिवशी सुट्टी वा सवलतीबाबत तक्रार करायची झाल्यास, आपण प्रमुख सुविधाकार, बृहन्मुंबई महानगरपालिका व त्यांच्या अधिपत्याखालील महानगरपालिकेतील प्रभागनिहाय कार्यालय, राज्याचे कामगार आयुक्त कार्यालय, कामगार भवन, याठिकाणी संपर्क साधू शकता. याबाबत कामगार आयुक्त���ंनी पुष्टी केली आहे. महाराष्ट्र विधानसभा निवडणूक 2019: PwD App च्या मदतीने दिव्यांग मतदार घरबसल्या करू शकतील मतदार नोंदणी ते व्हिलचेअरसाठी विनंती. दरम्यान, 21 ऑक्टोबर रोजी घेण्यात येणाऱ्या निवडणुकीत मतदानाचा टक्का वाढावा याकरिता विविध जनजागृती कार्यक्रम, व शिबिरांच्या माध्यमातून जनतेला आवाहन करण्यात आले होते, याचे परिणाम मतदानाच्या दिवशीच समोर येतील.
inference.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Script to show tokens of the input text
4
+ """
5
+ # Local Imports
6
+ from byte_pair_encoding import BPETokenizer
7
+
8
+
9
+ if __name__ == "__main__":
10
+ tokenizer = BPETokenizer.load("tokenizer.json")
11
+ text = "या पुतळ्याच्या डोक्यावर अज्ञातांनी चप्पल ठेवल्याचे आढळून आले आहे."
12
+ # text = "સરળ ગુજરાતી બી પી ઇ ટોકનાઇઝર"
13
+ encoded = tokenizer.encode(text)
14
+ print(encoded)
15
+ print(tokenizer.decode(encoded))
16
+
17
+
requirements.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ flask
2
+ numpy
3
+ transformers
4
+ torch
5
+ gradio
6
+ tqdm
7
+ fastapi
8
+ uvicorn
9
+ python-multipart
10
+ jinja2
samples/sample1.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ मी आज सकाळी लवकर उठलो आणि बागेत फिरायला गेलो. सूर्य उगवत होता आणि पक्षी गात होते.
samples/sample2.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ माझ्या आजीने मला एक गोष्ट सांगितली: "जीवनात प्रामाणिक राहा, मेहनत करा आणि दुसऱ्यांना मदत करा."
samples/sample3.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ मुंबई ही महाराष्ट्राची आर्थिक राजधानी आहे. इथे अनेक उद्योग, कंपन्या आणि चित्रपट उद्योग आहे.
static/css/style.css ADDED
@@ -0,0 +1,778 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Move these keyframes to the top */
2
+ @keyframes gradientBG {
3
+ 0% { background-position: 0% 50%; }
4
+ 50% { background-position: 100% 50%; }
5
+ 100% { background-position: 0% 50%; }
6
+ }
7
+
8
+ @keyframes animate {
9
+ 0% { background-position: 0% 50%; }
10
+ 100% { background-position: 200% 50%; }
11
+ }
12
+
13
+ /* Reset and base styles */
14
+ * {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ /* Important: Set background color immediately on html */
21
+ html {
22
+ background: #000428;
23
+ }
24
+
25
+ /* Body styles with gradient */
26
+ body {
27
+ margin: 0;
28
+ padding: 20px;
29
+ min-height: 100vh;
30
+ width: 100%;
31
+ background: linear-gradient(-45deg, #000428, #004e92, #000428, #002454);
32
+ background-size: 400% 400%;
33
+ animation: gradientBG 15s ease infinite;
34
+ display: flex;
35
+ justify-content: center;
36
+ align-items: center;
37
+ color: white;
38
+ }
39
+
40
+ /* Add a mesh overlay */
41
+ body::before {
42
+ content: '';
43
+ position: fixed;
44
+ top: 0;
45
+ left: 0;
46
+ width: 100%;
47
+ height: 100%;
48
+ background-image:
49
+ linear-gradient(rgba(255,255,255,.05) 1px, transparent 1px),
50
+ linear-gradient(90deg, rgba(255,255,255,.05) 1px, transparent 1px);
51
+ background-size: 20px 20px;
52
+ pointer-events: none;
53
+ z-index: 1;
54
+ }
55
+
56
+ .container {
57
+ position: relative;
58
+ z-index: 2;
59
+ width: 90%;
60
+ min-width: 320px;
61
+ max-width: 1400px;
62
+ margin: 40px auto;
63
+ padding: 40px;
64
+ font-family: Arial, sans-serif;
65
+ background: rgba(10, 12, 25, 0.85);
66
+ backdrop-filter: blur(10px);
67
+ -webkit-backdrop-filter: blur(10px);
68
+ border-radius: 20px;
69
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.5);
70
+ display: flex;
71
+ flex-direction: column;
72
+ min-height: 85vh;
73
+ }
74
+
75
+ .btn {
76
+ background: linear-gradient(90deg, #4A00E0, #8E2DE2);
77
+ border: none;
78
+ color: white;
79
+ padding: 12px 30px;
80
+ border-radius: 50px;
81
+ font-family: 'Space Grotesk', sans-serif;
82
+ font-size: 1rem;
83
+ font-weight: 600;
84
+ margin: 1rem 0;
85
+ box-shadow: 0 4px 15px rgba(74, 0, 224, 0.3);
86
+ cursor: pointer;
87
+ transition: all 0.3s ease;
88
+ display: inline-block;
89
+ }
90
+
91
+ .btn:hover {
92
+ background: linear-gradient(90deg, #8E2DE2, #4A00E0);
93
+ transform: translateY(-2px);
94
+ box-shadow: 0 6px 20px rgba(74, 0, 224, 0.4);
95
+ }
96
+
97
+ .btn:active {
98
+ transform: translateY(1px);
99
+ }
100
+
101
+ .text-box {
102
+ border: 1px solid #ccc;
103
+ padding: 15px;
104
+ margin: 10px 0;
105
+ min-height: 150px;
106
+ max-height: 400px;
107
+ overflow-y: auto;
108
+ white-space: pre-wrap;
109
+ background-color: #f8f9fa;
110
+ border-radius: 5px;
111
+ background: rgba(15, 15, 25, 0.7);
112
+ backdrop-filter: blur(5px);
113
+ border: 1px solid rgba(255, 255, 255, 0.15);
114
+ color: #ffffff;
115
+ font-size: 1.1rem;
116
+ line-height: 1.6;
117
+ letter-spacing: 0.2px;
118
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
119
+ width: 100%;
120
+ }
121
+
122
+ .hidden {
123
+ display: none;
124
+ }
125
+
126
+ h1, h2 {
127
+ color: white;
128
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
129
+ }
130
+
131
+ #upload-section {
132
+ text-align: center;
133
+ padding: 40px 0;
134
+ }
135
+
136
+ /* Add these styles */
137
+ .canvas-container {
138
+ position: relative;
139
+ width: 100%;
140
+ height: 600px;
141
+ border: 1px solid #ccc;
142
+ border-radius: 5px;
143
+ overflow: hidden;
144
+ background-color: #f8f9fa;
145
+ }
146
+
147
+ .canvas-container canvas {
148
+ width: 100% !important;
149
+ height: 100% !important;
150
+ }
151
+
152
+ .plot-controls {
153
+ margin: 10px 0;
154
+ padding: 10px;
155
+ background-color: #f8f9fa;
156
+ border: 1px solid #ccc;
157
+ border-radius: 5px;
158
+ }
159
+
160
+ .plot-controls label {
161
+ display: block;
162
+ margin: 5px 0;
163
+ }
164
+
165
+ .plot-controls input[type="range"] {
166
+ width: 100%;
167
+ }
168
+
169
+ .pcl-stats {
170
+ position: absolute;
171
+ top: 10px;
172
+ left: 10px;
173
+ background: rgba(15, 15, 25, 0.9);
174
+ padding: 10px;
175
+ border-radius: 5px;
176
+ font-size: 12px;
177
+ pointer-events: none;
178
+ color: #ffffff;
179
+ font-weight: 500;
180
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
181
+ }
182
+
183
+ .pcl-stats p {
184
+ margin: 0;
185
+ padding: 2px 0;
186
+ color: #ffffff;
187
+ }
188
+
189
+ /* Add the font import at the top */
190
+ @import url('https://fonts.googleapis.com/css?family=Space%20Grotesk:700|Space%20Grotesk:400');
191
+
192
+ /* Add the custom properties */
193
+ :root {
194
+ --m: 2rem;
195
+ --button-bg: #141516;
196
+ --border-width: 3px;
197
+ --border-radius: 100px;
198
+ --glow-spread: 40px;
199
+ }
200
+
201
+ /* Update the gradient-btn class */
202
+ .gradient-btn {
203
+ position: relative;
204
+ padding: 1em 2em;
205
+ font-family: 'Space Grotesk', sans-serif;
206
+ font-size: var(--m);
207
+ font-weight: 500;
208
+ color: #fff;
209
+ background: var(--button-bg);
210
+ border: var(--border-width) solid transparent;
211
+ border-radius: var(--border-radius);
212
+ cursor: pointer;
213
+ overflow: hidden;
214
+ transition: all 0.3s ease;
215
+ }
216
+
217
+ .gradient-btn::before,
218
+ .gradient-btn::after {
219
+ content: '';
220
+ position: absolute;
221
+ inset: calc(-1 * var(--border-width));
222
+ border-radius: var(--border-radius);
223
+ background: linear-gradient(
224
+ 90deg,
225
+ #FF8A00,
226
+ #e52e71,
227
+ #FF8A00,
228
+ #e52e71
229
+ );
230
+ background-size: 300% 100%;
231
+ animation: moveGradient 2s linear infinite;
232
+ z-index: -2;
233
+ }
234
+
235
+ .gradient-btn::after {
236
+ filter: blur(var(--glow-spread));
237
+ opacity: 0.7;
238
+ z-index: -1;
239
+ }
240
+
241
+ .gradient-btn:hover::before,
242
+ .gradient-btn:hover::after {
243
+ animation: moveGradient 1s linear infinite;
244
+ }
245
+
246
+ @keyframes moveGradient {
247
+ 0% {
248
+ background-position: 0% 50%;
249
+ }
250
+ 100% {
251
+ background-position: 150% 50%;
252
+ }
253
+ }
254
+
255
+ /* Media query for responsive design */
256
+ @media screen and (max-width: 768px) {
257
+ :root {
258
+ --m: 1.5rem;
259
+ --border-width: 2px;
260
+ --glow-spread: 20px;
261
+ }
262
+ }
263
+
264
+ /* New button styles */
265
+ .glow-button {
266
+ position: relative;
267
+ width: 300px;
268
+ padding: 16px 32px;
269
+ font-family: 'Space Grotesk', sans-serif;
270
+ font-size: 24px;
271
+ color: #ffffff;
272
+ background: #141516;
273
+ border: none;
274
+ border-radius: 50px;
275
+ cursor: pointer;
276
+ overflow: hidden;
277
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.1);
278
+ font-weight: 600;
279
+ letter-spacing: 0.8px;
280
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
281
+ }
282
+
283
+ .glow-button::before {
284
+ content: '';
285
+ position: absolute;
286
+ left: -2px;
287
+ top: -2px;
288
+ right: -2px;
289
+ bottom: -2px;
290
+ border-radius: 50px;
291
+ background: linear-gradient(
292
+ 90deg,
293
+ #FF8A00,
294
+ #e52e71,
295
+ #FF8A00,
296
+ #e52e71
297
+ );
298
+ background-size: 300% 100%;
299
+ z-index: -2;
300
+ }
301
+
302
+ .glow-button::after {
303
+ content: '';
304
+ position: absolute;
305
+ inset: 2px;
306
+ border-radius: 48px;
307
+ background: #141516;
308
+ z-index: -1;
309
+ }
310
+
311
+ .glow-button:hover::before {
312
+ animation: borderRotate 2s linear infinite;
313
+ }
314
+
315
+ @keyframes borderRotate {
316
+ from {
317
+ background-position: 0% center;
318
+ }
319
+ to {
320
+ background-position: 200% center;
321
+ }
322
+ }
323
+
324
+ /* Update text colors and styles */
325
+ h1 {
326
+ color: #ffffff;
327
+ font-family: 'Space Grotesk', sans-serif;
328
+ font-size: 2.5rem;
329
+ font-weight: 700;
330
+ text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
331
+ letter-spacing: 0.5px;
332
+ }
333
+
334
+ h2 {
335
+ color: #e0e0ff;
336
+ font-family: 'Space Grotesk', sans-serif;
337
+ font-size: 1.8rem;
338
+ margin-top: 2rem;
339
+ margin-bottom: 1rem;
340
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
341
+ letter-spacing: 0.3px;
342
+ font-weight: 600;
343
+ background: linear-gradient(90deg, #ffffff, #e0e0ff);
344
+ -webkit-background-clip: text;
345
+ -webkit-text-fill-color: transparent;
346
+ display: inline-block;
347
+ }
348
+
349
+ /* Update container background for better contrast */
350
+ .container {
351
+ background: rgba(10, 12, 25, 0.85);
352
+ box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.5);
353
+ }
354
+
355
+ /* Update text-box for better readability */
356
+ .text-box {
357
+ background: rgba(15, 15, 25, 0.7);
358
+ border: 1px solid rgba(255, 255, 255, 0.15);
359
+ color: #E0E0FF !important;
360
+ font-size: 1.1rem;
361
+ line-height: 1.6;
362
+ letter-spacing: 0.2px;
363
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
364
+ font-family: 'Space Grotesk', sans-serif;
365
+ }
366
+
367
+ /* Update the text sections for better contrast */
368
+ #text-section h2,
369
+ #processed-section h2,
370
+ #augmented-section h2 {
371
+ position: relative;
372
+ padding-left: 0.5rem;
373
+ }
374
+
375
+ #text-section h2::before,
376
+ #processed-section h2::before,
377
+ #augmented-section h2::before {
378
+ content: '';
379
+ position: absolute;
380
+ left: -5px;
381
+ top: 50%;
382
+ transform: translateY(-50%);
383
+ width: 3px;
384
+ height: 70%;
385
+ background: linear-gradient(180deg, #FF8A00, #e52e71);
386
+ border-radius: 2px;
387
+ }
388
+
389
+ /* Add new styles for the reset button */
390
+ #reset-btn {
391
+ background: linear-gradient(90deg, #FF416C, #FF4B2B);
392
+ text-transform: uppercase;
393
+ letter-spacing: 1px;
394
+ box-shadow: 0 4px 15px rgba(255, 65, 108, 0.3);
395
+ margin: 2rem auto;
396
+ display: block;
397
+ width: fit-content;
398
+ }
399
+
400
+ #reset-btn:hover {
401
+ background: linear-gradient(90deg, #FF4B2B, #FF416C);
402
+ box-shadow: 0 6px 20px rgba(255, 65, 108, 0.4);
403
+ }
404
+
405
+ /* Update container to handle centered button */
406
+ .container {
407
+ display: flex;
408
+ flex-direction: column;
409
+ align-items: stretch;
410
+ min-height: 400px;
411
+ }
412
+
413
+ /* Style the Process Data and Augment Data buttons */
414
+ #process-btn, #decode-btn {
415
+ /* Remove all individual styles as they're handled by .btn class */
416
+ }
417
+
418
+ /* Update section headings */
419
+ h2 {
420
+ color: #E0E0FF !important;
421
+ font-family: 'Space Grotesk', sans-serif;
422
+ font-size: 1.8rem;
423
+ margin-top: 2rem;
424
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
425
+ font-weight: 600;
426
+ background: none;
427
+ -webkit-text-fill-color: #E0E0FF;
428
+ }
429
+
430
+ /* Description section styles */
431
+ .description-section {
432
+ text-align: center;
433
+ margin: 2rem auto;
434
+ max-width: 800px;
435
+ padding: 2rem;
436
+ background: rgba(255, 255, 255, 0.05);
437
+ border-radius: 15px;
438
+ backdrop-filter: blur(10px);
439
+ border: 1px solid rgba(255, 255, 255, 0.1);
440
+ }
441
+
442
+ .description-text {
443
+ color: #E0E0FF;
444
+ font-size: 1.2rem;
445
+ margin-bottom: 2rem;
446
+ font-family: 'Space Grotesk', sans-serif;
447
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
448
+ }
449
+
450
+ .supported-types {
451
+ display: grid;
452
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
453
+ gap: 1.5rem;
454
+ text-align: left;
455
+ }
456
+
457
+ .type-item {
458
+ padding: 1rem;
459
+ background: rgba(255, 255, 255, 0.05);
460
+ border-radius: 10px;
461
+ border: 1px solid rgba(255, 255, 255, 0.1);
462
+ transition: all 0.3s ease;
463
+ cursor: pointer;
464
+ }
465
+
466
+ .type-header {
467
+ display: flex;
468
+ flex-direction: column;
469
+ gap: 0.5rem;
470
+ }
471
+
472
+ .type-item:hover {
473
+ transform: translateY(-2px);
474
+ background: rgba(255, 255, 255, 0.08);
475
+ }
476
+
477
+ .type-title {
478
+ color: #ffffff;
479
+ font-size: 1.1rem;
480
+ font-weight: 600;
481
+ font-family: 'Space Grotesk', sans-serif;
482
+ }
483
+
484
+ .type-desc {
485
+ color: #E0E0FF;
486
+ font-size: 0.9rem;
487
+ opacity: 0.9;
488
+ font-family: 'Space Grotesk', sans-serif;
489
+ }
490
+
491
+ /* Sample buttons inside type-item */
492
+ .type-item .sample-buttons {
493
+ margin-top: 1rem;
494
+ padding-top: 1rem;
495
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
496
+ display: flex;
497
+ gap: 0.5rem;
498
+ justify-content: center;
499
+ }
500
+
501
+ .type-item .sample-btn {
502
+ padding: 0.5rem 1rem;
503
+ background: rgba(255, 255, 255, 0.1);
504
+ border: 1px solid rgba(255, 255, 255, 0.2);
505
+ border-radius: 8px;
506
+ color: #ffffff;
507
+ font-family: 'Space Grotesk', sans-serif;
508
+ cursor: pointer;
509
+ transition: all 0.3s ease;
510
+ }
511
+
512
+ .type-item .sample-btn:hover {
513
+ background: rgba(255, 255, 255, 0.2);
514
+ transform: translateY(-1px);
515
+ }
516
+
517
+ /* Animation for sample buttons */
518
+ @keyframes slideDown {
519
+ from {
520
+ opacity: 0;
521
+ transform: translateY(-10px);
522
+ }
523
+ to {
524
+ opacity: 1;
525
+ transform: translateY(0);
526
+ }
527
+ }
528
+
529
+ .sample-buttons.show {
530
+ display: flex;
531
+ animation: slideDown 0.3s ease-out;
532
+ }
533
+
534
+ /* Operation description styles */
535
+ .operation-description {
536
+ margin: 1rem 0;
537
+ padding: 1rem;
538
+ background: rgba(74, 0, 224, 0.1);
539
+ border-left: 4px solid #4A00E0;
540
+ border-radius: 0 8px 8px 0;
541
+ color: #E0E0FF;
542
+ font-family: 'Space Grotesk', sans-serif;
543
+ font-size: 0.95rem;
544
+ line-height: 1.5;
545
+ animation: slideDown 0.3s ease-out;
546
+ }
547
+
548
+ .operation-description ul {
549
+ margin: 0.5rem 0 0 1.2rem;
550
+ }
551
+
552
+ .operation-description li {
553
+ margin: 0.3rem 0;
554
+ }
555
+
556
+ @keyframes slideDown {
557
+ from {
558
+ opacity: 0;
559
+ transform: translateY(-10px);
560
+ }
561
+ to {
562
+ opacity: 1;
563
+ transform: translateY(0);
564
+ }
565
+ }
566
+
567
+ /* Add these styles to your existing CSS */
568
+ .sample-section {
569
+ text-align: center;
570
+ padding: 1rem 0;
571
+ }
572
+
573
+ .sample-section h3 {
574
+ color: #ffffff;
575
+ font-family: 'Space Grotesk', sans-serif;
576
+ margin-bottom: 1.5rem;
577
+ font-size: 1.3rem;
578
+ font-weight: 600;
579
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
580
+ }
581
+
582
+ .sample-buttons {
583
+ display: flex;
584
+ gap: 1.5rem;
585
+ justify-content: center;
586
+ margin: 1.5rem 0;
587
+ }
588
+
589
+ .sample-btn {
590
+ padding: 8px 16px;
591
+ background: linear-gradient(to bottom, #ffffff 0%, #f3f3f3 100%);
592
+ border: 1px solid #ccc;
593
+ border-radius: 4px;
594
+ color: #333333;
595
+ font-family: 'Space Grotesk', sans-serif;
596
+ font-size: 0.9rem;
597
+ font-weight: 400;
598
+ cursor: pointer;
599
+ transition: all 0.2s ease;
600
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
601
+ }
602
+
603
+ .sample-btn:hover {
604
+ background: linear-gradient(to bottom, #f3f3f3 0%, #e6e6e6 100%);
605
+ border-color: #adadad;
606
+ transform: translateY(0);
607
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
608
+ }
609
+
610
+ .sample-btn:active {
611
+ background: #e6e6e6;
612
+ border-color: #adadad;
613
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
614
+ transform: translateY(1px);
615
+ }
616
+
617
+ .sample-description {
618
+ color: #E0E0FF;
619
+ font-size: 0.9rem;
620
+ opacity: 0.8;
621
+ margin-top: 1rem;
622
+ }
623
+
624
+ /* Add these new styles */
625
+ .input-section {
626
+ display: flex;
627
+ flex-direction: column;
628
+ align-items: center;
629
+ gap: 1rem;
630
+ margin: 2rem 0;
631
+ }
632
+
633
+ .sample-section {
634
+ background: rgba(255, 255, 255, 0.1);
635
+ padding: 1.5rem;
636
+ border-radius: 8px;
637
+ }
638
+
639
+ .sample-section h3 {
640
+ color: #ffffff;
641
+ font-family: 'Space Grotesk', sans-serif;
642
+ margin-bottom: 1rem;
643
+ font-size: 1.2rem;
644
+ }
645
+
646
+ .sample-buttons {
647
+ display: flex;
648
+ gap: 0.5rem;
649
+ justify-content: center;
650
+ margin: 1rem 0;
651
+ }
652
+
653
+ .separator {
654
+ display: flex;
655
+ align-items: center;
656
+ text-align: center;
657
+ margin: 1rem 0;
658
+ }
659
+
660
+ .separator::before,
661
+ .separator::after {
662
+ content: '';
663
+ flex: 1;
664
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
665
+ margin: 0 1.5rem;
666
+ }
667
+
668
+ .separator span {
669
+ font-size: 1rem;
670
+ color: rgba(255, 255, 255, 0.6);
671
+ font-family: 'Space Grotesk', sans-serif;
672
+ text-transform: uppercase;
673
+ letter-spacing: 1px;
674
+ }
675
+
676
+ #upload-section {
677
+ margin-top: 1rem;
678
+ text-align: center;
679
+ }
680
+
681
+ /* Update existing styles */
682
+ .type-item {
683
+ cursor: default;
684
+ }
685
+
686
+ .type-item:hover {
687
+ transform: none;
688
+ }
689
+
690
+ /* New glow-on-hover effect for sample buttons */
691
+ .glow-on-hover {
692
+ /* Remove these styles as they're no longer needed */
693
+ }
694
+
695
+ /* Add styles for decode button */
696
+ /* #decode-btn {
697
+ background: linear-gradient(90deg, #4A00E0, #8E2DE2);
698
+ border: none;
699
+ color: white;
700
+ padding: 12px 30px;
701
+ border-radius: 50px;
702
+ font-weight: 600;
703
+ margin: 1rem 0;
704
+ box-shadow: 0 4px 15px rgba(74, 0, 224, 0.3);
705
+ }
706
+
707
+ #decode-btn:hover {
708
+ background: linear-gradient(90deg, #8E2DE2, #4A00E0);
709
+ transform: translateY(-2px);
710
+ box-shadow: 0 6px 20px rgba(74, 0, 224, 0.4);
711
+ } */
712
+
713
+ /* Update section styles to include decoded section */
714
+ #decoded-section {
715
+ margin-top: 2rem;
716
+ }
717
+
718
+ #decoded-section h2 {
719
+ color: #E0E0FF;
720
+ }
721
+
722
+ /* Style both Process Text and Decode Tokens buttons consistently */
723
+ #process-btn, #decode-btn {
724
+ background: linear-gradient(90deg, #4A00E0, #8E2DE2);
725
+ border: none;
726
+ color: white;
727
+ padding: 12px 30px;
728
+ border-radius: 50px;
729
+ font-family: 'Space Grotesk', sans-serif;
730
+ font-size: 1rem;
731
+ font-weight: 600;
732
+ margin: 1rem 0;
733
+ box-shadow: 0 4px 15px rgba(74, 0, 224, 0.3);
734
+ cursor: pointer;
735
+ transition: all 0.3s ease;
736
+ }
737
+
738
+ #process-btn:hover, #decode-btn:hover {
739
+ background: linear-gradient(90deg, #8E2DE2, #4A00E0);
740
+ transform: translateY(-2px);
741
+ box-shadow: 0 6px 20px rgba(74, 0, 224, 0.4);
742
+ }
743
+
744
+ #process-btn:active, #decode-btn:active {
745
+ transform: translateY(1px);
746
+ }
747
+
748
+ /* Create a new class specifically for these action buttons */
749
+ .action-btn {
750
+ background: linear-gradient(90deg, #4A00E0, #8E2DE2);
751
+ border: none;
752
+ color: white;
753
+ padding: 12px 30px;
754
+ border-radius: 50px;
755
+ font-family: 'Space Grotesk', sans-serif;
756
+ font-size: 1rem;
757
+ font-weight: 600;
758
+ margin: 1rem 0;
759
+ box-shadow: 0 4px 15px rgba(74, 0, 224, 0.3);
760
+ cursor: pointer;
761
+ transition: all 0.3s ease;
762
+ display: inline-block;
763
+ }
764
+
765
+ .action-btn:hover {
766
+ background: linear-gradient(90deg, #8E2DE2, #4A00E0);
767
+ transform: translateY(-2px);
768
+ box-shadow: 0 6px 20px rgba(74, 0, 224, 0.4);
769
+ }
770
+
771
+ .action-btn:active {
772
+ transform: translateY(1px);
773
+ }
774
+
775
+ /* Remove any individual button styles */
776
+ #process-btn, #decode-btn {
777
+ /* Remove all individual styles */
778
+ }
static/favicon.ico ADDED
static/js/script.js ADDED
@@ -0,0 +1,210 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ document.addEventListener('DOMContentLoaded', function() {
2
+ const fileInput = document.getElementById('file-input');
3
+ const uploadBtn = document.getElementById('upload-btn');
4
+ const processBtn = document.getElementById('process-btn');
5
+ const resetBtn = document.getElementById('reset-btn');
6
+
7
+ const uploadSection = document.getElementById('upload-section');
8
+ const textSection = document.getElementById('text-section');
9
+ const processedSection = document.getElementById('processed-section');
10
+
11
+ const originalData = document.getElementById('original-data');
12
+ const processedData = document.getElementById('processed-data');
13
+ const decodedSection = document.getElementById('decoded-section');
14
+ const decodedData = document.getElementById('decoded-data');
15
+ const decodeBtn = document.getElementById('decode-btn');
16
+
17
+ let currentText = ''; // Store the current text being processed
18
+ let isFromFile = false; // Track if text is from file upload or sample
19
+
20
+ function showProcessingDescription() {
21
+ const descriptionElement = document.getElementById('process-description');
22
+ const description = `
23
+ <strong>Processing Operations:</strong>
24
+ <ul>
25
+ <li>Tokenization of text using Byte Pair Encoding (BPE)</li>
26
+ <li>Conversion to numerical token IDs</li>
27
+ </ul>
28
+ `;
29
+
30
+ descriptionElement.innerHTML = description;
31
+ descriptionElement.classList.remove('hidden');
32
+ }
33
+
34
+ // Upload button click handler
35
+ uploadBtn.addEventListener('click', () => fileInput.click());
36
+
37
+ // File input change handler
38
+ fileInput.addEventListener('change', async (e) => {
39
+ const file = e.target.files[0];
40
+ if (file) {
41
+ // Clear previous data
42
+ originalData.innerHTML = '';
43
+ processedData.innerHTML = '';
44
+ decodedData.innerHTML = ''; // Clear decoded data
45
+
46
+ // Clear descriptions and hide sections
47
+ document.getElementById('process-description').innerHTML = '';
48
+ document.getElementById('process-description').classList.add('hidden');
49
+ processedSection.classList.add('hidden');
50
+ decodedSection.classList.add('hidden'); // Hide decoded section
51
+
52
+ const formData = new FormData();
53
+ formData.append('file', file);
54
+
55
+ try {
56
+ const response = await fetch('/upload', {
57
+ method: 'POST',
58
+ body: formData
59
+ });
60
+
61
+ if (!response.ok) {
62
+ const errorData = await response.json();
63
+ throw new Error(errorData.detail || 'Upload failed');
64
+ }
65
+
66
+ const data = await response.json();
67
+ currentText = data.text;
68
+ isFromFile = true;
69
+ originalData.textContent = currentText;
70
+
71
+ textSection.classList.remove('hidden');
72
+ resetBtn.classList.remove('hidden');
73
+ } catch (error) {
74
+ console.error('Error:', error);
75
+ alert('Error uploading file: ' + error.message);
76
+ resetBtn.classList.add('hidden');
77
+ }
78
+ } else {
79
+ resetBtn.classList.add('hidden');
80
+ }
81
+ });
82
+
83
+ // Process button click handler
84
+ processBtn.addEventListener('click', async () => {
85
+ if (!currentText) return;
86
+
87
+ try {
88
+ let response;
89
+ if (isFromFile) {
90
+ // Handle file upload case
91
+ const file = fileInput.files[0];
92
+ const formData = new FormData();
93
+ formData.append('file', file);
94
+ response = await fetch('/process', {
95
+ method: 'POST',
96
+ body: formData
97
+ });
98
+ } else {
99
+ // Handle sample text case
100
+ response = await fetch('/process_text', {
101
+ method: 'POST',
102
+ headers: {
103
+ 'Content-Type': 'application/json',
104
+ },
105
+ body: JSON.stringify({ text: currentText })
106
+ });
107
+ }
108
+
109
+ if (!response.ok) {
110
+ const errorData = await response.json();
111
+ throw new Error(errorData.detail || 'Processing failed');
112
+ }
113
+
114
+ const data = await response.json();
115
+ showProcessingDescription();
116
+ processedData.textContent = data.processed_data;
117
+
118
+ processedSection.classList.remove('hidden');
119
+ } catch (error) {
120
+ console.error('Error:', error);
121
+ alert('Error processing text: ' + error.message);
122
+ }
123
+ });
124
+
125
+ // Reset button handler
126
+ resetBtn.addEventListener('click', () => {
127
+ fileInput.value = '';
128
+ currentText = '';
129
+ isFromFile = false;
130
+
131
+ originalData.innerHTML = '';
132
+ processedData.innerHTML = '';
133
+
134
+ document.getElementById('process-description').innerHTML = '';
135
+ document.getElementById('process-description').classList.add('hidden');
136
+
137
+ textSection.classList.add('hidden');
138
+ processedSection.classList.add('hidden');
139
+
140
+ resetBtn.classList.add('hidden');
141
+ decodedData.innerHTML = '';
142
+ decodedSection.classList.add('hidden');
143
+ });
144
+
145
+ // Update sample button handlers
146
+ const sampleBtns = document.querySelectorAll('.sample-btn');
147
+ sampleBtns.forEach(button => {
148
+ button.addEventListener('click', () => {
149
+ const sampleNumber = button.getAttribute('data-sample');
150
+ loadSampleText(sampleNumber);
151
+ });
152
+ });
153
+
154
+ async function loadSampleText(sampleNumber) {
155
+ try {
156
+ const response = await fetch(`/sample/${sampleNumber}`);
157
+ if (!response.ok) {
158
+ throw new Error('Failed to load sample text');
159
+ }
160
+ const data = await response.json();
161
+
162
+ // Clear previous data
163
+ originalData.innerHTML = '';
164
+ processedData.innerHTML = '';
165
+ decodedData.innerHTML = ''; // Clear decoded data
166
+ document.getElementById('process-description').innerHTML = '';
167
+ document.getElementById('process-description').classList.add('hidden');
168
+ processedSection.classList.add('hidden');
169
+ decodedSection.classList.add('hidden'); // Hide decoded section
170
+
171
+ // Store and display the sample text
172
+ currentText = data.text;
173
+ isFromFile = false;
174
+ originalData.textContent = currentText;
175
+ textSection.classList.remove('hidden');
176
+ resetBtn.classList.remove('hidden');
177
+ } catch (error) {
178
+ console.error('Error:', error);
179
+ alert('Error loading sample text: ' + error.message);
180
+ }
181
+ }
182
+
183
+ // Update decode button handler
184
+ decodeBtn.addEventListener('click', async () => {
185
+ try {
186
+ // Get the processed text and clean it
187
+ const tokenText = processedData.textContent.trim();
188
+
189
+ const response = await fetch('/decode_text', {
190
+ method: 'POST',
191
+ headers: {
192
+ 'Content-Type': 'application/json',
193
+ },
194
+ body: JSON.stringify({ text: tokenText })
195
+ });
196
+
197
+ if (!response.ok) {
198
+ const errorData = await response.json();
199
+ throw new Error(errorData.detail || 'Decoding failed');
200
+ }
201
+
202
+ const data = await response.json();
203
+ decodedData.textContent = data.decoded_text;
204
+ decodedSection.classList.remove('hidden');
205
+ } catch (error) {
206
+ console.error('Error:', error);
207
+ alert('Error decoding text: ' + error.message);
208
+ }
209
+ });
210
+ });
templates/index.html ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Text Tokenization</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;700&display=swap" rel="stylesheet">
10
+ <link rel="stylesheet" href="{{ url_for('static', path='/css/style.css') }}">
11
+ <link rel="icon" type="image/x-icon" href="{{ url_for('static', path='/favicon.ico') }}">
12
+ </head>
13
+ <body style="background: #000428;">
14
+ <div class="container">
15
+ <h1 style="text-align: center; margin: 2rem 0; color: #ffffff; text-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);">
16
+ Tokenization
17
+ </h1>
18
+
19
+ <!-- Description Section -->
20
+ <div class="description-section">
21
+ <p class="description-text">
22
+ Text tokenization using Byte Pair Encoding (BPE). Supports Indian language.
23
+ </p>
24
+ <div class="sample-section">
25
+ <h3>Try with samples:</h3>
26
+ <div class="sample-buttons">
27
+ <button class="sample-btn" data-sample="1">Sample 1</button>
28
+ <button class="sample-btn" data-sample="2">Sample 2</button>
29
+ <button class="sample-btn" data-sample="3">Sample 3</button>
30
+ </div>
31
+ <div class="separator">
32
+ <span>or</span>
33
+ </div>
34
+ </div>
35
+ </div>
36
+
37
+ <!-- File Upload Section -->
38
+ <div id="upload-section">
39
+ <input type="file" id="file-input" accept=".txt" style="display: none;">
40
+ <button id="upload-btn" class="glow-button">Upload Text File</button>
41
+ </div>
42
+
43
+ <!-- Text Display Section -->
44
+ <div id="text-section" class="hidden">
45
+ <h2>Original Text:</h2>
46
+ <div id="original-data" class="text-box"></div>
47
+ <button id="process-btn" class="action-btn">Encode Text</button>
48
+ <div id="process-description" class="operation-description hidden"></div>
49
+ </div>
50
+
51
+ <!-- Processed Data Section -->
52
+ <div id="processed-section" class="hidden">
53
+ <h2>Tokens:</h2>
54
+ <div id="processed-data" class="text-box"></div>
55
+ <button id="decode-btn" class="action-btn">Decode Tokens</button>
56
+ </div>
57
+
58
+ <!-- Decoded Data Section -->
59
+ <div id="decoded-section" class="hidden">
60
+ <h2>Decoded Text:</h2>
61
+ <div id="decoded-data" class="text-box"></div>
62
+ </div>
63
+
64
+ <!-- Reset Button -->
65
+ <button id="reset-btn" class="btn hidden">Reset</button>
66
+ </div>
67
+
68
+ <script src="{{ url_for('static', path='/js/script.js') }}"></script>
69
+ </body>
70
+ </html>
tokenization.ipynb ADDED
@@ -0,0 +1,2020 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "# Import text from dataset.txt\n",
10
+ "with open('dataset.txt', 'r') as file:\n",
11
+ " text = file.read()"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 2,
17
+ "metadata": {},
18
+ "outputs": [
19
+ {
20
+ "data": {
21
+ "text/plain": [
22
+ "'बहुचर्चित एचएएल एम्प्लॉईज सहकारी सोसायटीच्या २००१ ते २०११ या कालावधीत लेखा परीक्षण करताना कसूर केल्याच्या कारणावरून सहकार विभागाने लेखा परीक्षकांना कारणे दाखवा नोटीस बजावली आहे. या संदर्भात सोसायटीच्या सभासदांनी तीन वार्षिक सर्वसाधारण सभांत ठराव मंजूर करून लेखा परीक्षकांवर गुन्हे दाखल करण्याची मागणी सहकार खात्याकडे केली होती. एचएएल सोसायटीत २००१ ते २०१२ या काळात कोटय़वधी रुपयांचा गैरव्यवहार झाल्याचे निष्पन्न झाले आहे. या कार्यकाळात लेखा परीक्षकांनी कायद्याप्रमाणे लेखा परीक्षण करून वेळीच कारवाई केली असती तर भ्रष्टाचार झाला नसता आणि सोसायटी वाचली असती, असे सभासदांचे म्हणणे आहे. सभासदांनी लेखा परीक्षकांवर गुन्हे दाखल करण्याच्या केलेल्या ठरावाची अंमलबजावणी करावी यासाठी एचएएल सोसायटी नवनिर्माण कृती समितीचे समन्वयक प्रवीण तिदमे यांच्या नेतृत्वाखाली नोव्हेंबर महिन्यात जिल्हा उपनिबंधक कार्यालयासमोर उपोषणही केले होते. त्यानंतर जिल्हा विशेष लेखा परीक्षक वर्ग १ सहकारी संस्था यांनी लेखा परीक्षण अहवालाची छाननी केली. त्या पाश्र्वभूमीवर, तुषार बाजीराव पगार (नाशिक), डी. एम. बारस्कर (अहमदनगर), जयंत व्ही. कोळपकर अॅण्ड कंपनी (पुणे), बिपीन जैन (धुळे), सतीष बन्सीलाल संघवी (नाशिक) आणि एस. आर. करवा अॅण्ड कंपनी (नाशिकरोड) यांना कारणे दाखवा नोटिसा बजावल्या आहेत. याची माहिती कृती समितीने दिली. संबंधितांना पाठविलेल्या नोटिसीत लेखा परीक्षण छाननी अहवालात समोर आलेल्या गंभीर मुद्दय़ांचा उल्लेख सहकार विभागाने केला आहे. संचालक मंडळाने २००६ ते ११ या कालावधीत २६.२५ कोटी रुपयांची रक्कम पूर्वपरवानगी न घेता बँक ऑफ महाराष्ट्रमध्ये केलेल्या मुदतठेव गुंतवणुकीत १७ कोटींची अफरातफर व गैरव्यवहाराच्या आक्षेपावर लेखा परीक्षकांनी त्यांच्या अहवाल वर्षांत गुंतवणूक वा मुदत ठेव नूतनीकरणाबाबत कोणतेही शेरे नमूद नाहीत. २११.०१ लाख भागभांडवल परत केले. मात्र भागमूल्यांकनानुसार रक्कम परत करण्याबाबत शेरे नमूद नाहीत, लेखा परीक्षकांनी लेखा परीक्षणावेळी योग्यरीत्या तपासणी करून गुंतवणु���ीची खात्री केली नाही, लेखा परीक्षणात तेरीजपत्रक जोडले नसल्याने किती भागभांडवल परत केले आहे याची रक्कम नमूद करता येत नाही अशा विविध बाबी नोटिसीत नमूद करण्यात आल्या आहेत. जिल्हा उपनिबंधकांनी लेखा परीक्षकांना नोटीस बजावत कारवाई सुरू केल्यामुळे सभासदांनी तिचे स्वागत केले आहे. पाच हजार कुटुंबांचा आर्थिक आधार असणारी सोसायटी पुनरुजीवित होईपर्यंत आमचा लढा सुरू राहणार असल्याचे सोसायटी नवनिर्माण कृती समितीने म्हटले आहे.\\n\\nट्युनिस : उत्तर आफ्रिकेतील ट्युनिशिया देशाची राजधानी. लोकसंख्या ६,८५,००० (१९६६). प्राचीन कार्थेजपासून सु.१५ किमी., भूमध्य समुद्राकाठी मोक्याच्या जागी, काहीशा उंच संयोगभूमीवर वसलेले हे शहर सु. १० किमी.वरील हल्क-अल् वाडी (ला गूलेट) या त्याच्या बंदराशी ७ मी. खोल खाडीने जोडलेले आहे. येथील हवामान भूमध्यसामुद्री असून वार्षिक सरासरी तपमान व पर्जन्य अनुक्रमे १७·७° से. व ३७·५ सेंमी. आहे. जुने ट्युनिस कसबा किल्ल्यापासून टेकडीच्या उतारावर वसले असून मदीना हा त्याचा मुख्य भाग आहे. आधुनिक ट्युनिस टेकडी व ट्युनिस सरोवर यांमधील सखल भागावर वसले आहे. येथे प्रशस्त रस्ते, हवेशीर घरे, उंच इमारती व आधुनिक सुखसोयी आहेत. जुन्या भागात अरुंद बोळ, एकमजली बिनखिडक्यांची चौकोनी घरे, \\'सुक\\' नावाचे छपरबंद बाजार, अझ झैतूनासारख्या प्राचीन मशिदी, जुने मुस्लिम विद्यापीठ इ. आहेत. रोमन वास्तुशैलीची स्नानगृहे प्रसिद्ध आहेत. लोकवस्ती फ्रेंच, इटालियन आणि मुस्लिम अशी संमिश्र आहे. ट्युनिसभोवती ऑलिव्ह व इतर भूमध्यसामुद्री फळे व धान्ये पिकतात. गावात पीठगिरण्या, साबण, ऑलिव्ह तेल, फळे डबाबंद करणे, टिकविणे, व सुकविणे, मद्ये, कापड, गालिचे, सिमेंट, बांधकाम साहित्य, धातुशुद्धी, सुपरफॉस्फेटसारखे रासायनिक पदार्थ, खाणीसाठी स्फोटके, यंत्रे, अत्तरे, पादत्राणे, विणलेले कपडे, रेल्वे कर्मशाळा, वीजउद्योग, औष्णिक वीजकेंद्रे इ. कारखाने व उद्योग आहेत. ट्युनिसहून फॉस्फेट, लोहधातुके, फळे, खजूर, ऑलिव्ह तेल, कागदासाठी एस्पार्टो गवत, स्पंज, स्थानिक गालिचे, मातीची भांडी इ. निर्यात होतात. येथे आंतरराष्ट्रीय विमानतळ असून, हे देशातील व शेजारी देशांतील शहरांशी लोहमार्गांनी व सडकांनी जोडलेले आहे. दवाखाने, रुग्णालये, सांस्कृतिक केंद्रे, शाळा, ट्युनिस विद्यापीठ (१९१६), नगरपालिका इ. सोयी आहेत. येथील पर्यटन व्यवसाय वाढत आहे.\\n\\nएखाद्याची अक्कल काढायची असल्यास, त्याची अक्कल घुटण्यात आहे काय? एखाद्याची अक्कल काढायची असल्यास, त्याची अक्कल घुटण्यात आहे काय? असा शब्दप्रयोग सर्रास केला जातो किंवा कुणाला शरणागती पत्करण्यास भाग पाडले तरी \\'त्याला गुडघे टेकायला लावले\\', असे आम्ही मोठ्या अभिमानाने सांगत असतो. तर असा हा \\'घुटणा\\' म्हणजेच गुडघा मानवी शरीरातील अत्यंत महत्त्वाचा भाग. गुडघा निकामी झाला की माणसाचे चालणेच थांबते. अशा वेळी मग कृत्रिम गुडघा बसविण्याशिवाय दुसरा पर्याय त्याच्याकडे नसतो. एरवी या गुडघ्याच्या प्रत्यारोपणाचा अवाढव्य खर्च आणि रुग्णांची होणारी लुटमार बघितली की मग कुणाच्याही घुटण्यात आल्याशिवाय राहत नाही. मात्र यापुढे तशी गरज पडणार नाही. कारण केंद्र शासनाने आता गुडघे प्रत्यारोपण शस्त्रक्रियेसाठीच्या दरांवर नियंत्रण आणण्याचा निर्णय घेतला आहे. त्यामुळे या शस्त्रक्रियेवरील खर्च जवळपास ७० टक्क्यांनी कमी होण्याची शक्यता असून, समस्त गुडघाग्रस्तांसाठी ही आनंदाची वार्ता आहे. राष्टÑीय औषध दर नियंत्रण प्राधिकरणाने (एनपीपीए) गुडघ्यांच्या शस्त्रक्रियेमध्ये रुग्णांची होणारी लुबाडणूक थांबविण्याकरिता रुग्णालये, वितरक तसेच आयातदारांच्या नफेखोरीचे आकडे गेल्या आठवड्यात उघडकीस आणले होते. या शस्त्रक्रियेत तब्बल ३०० टक्क्यांहून अधिक नफा कमावला जात असल्याचे एनपीपीएने लक्षात आणून दिले आहे. मुख्य म्हणजे पंतप्रधान नरेंद्र मोदी यांनी स्वातंत्र्यदिनाच्या आपल्या भाषणात हृदयरुग्णांसाठीच्या स्टेंटस्प्रमाणे गुडघा प्रत्यारोपण शस्त्रक्रिया स्वस्त करण्याचा मुद्दा मांडला होता. त्यानंतर हालचालींना वेग आला. हा निर्णय निश्चितच स्वागतार्ह आणि रुग्णांना मोठा दिलासा देणारा आहे. अपघात, बदलती जीवनशैली, व्यायामाचा अभाव आदी कारणांमुळे आज अस्थिरोग आणि प्रामुख्याने गुडघ्यांचे आजार प्रचंड वाढले आहेत. देशात आजमितीस दीड ते दोन कोटी लोकांना गुडघा प्रत्यारोपणाची गरज आहे. परंतु केवळ सव्वा ते दीड लाखच शस्त्रक्रिया होत असतात. कारण यासाठी चार ते पाच लाख रुपये खर्च येत असल्याने अनेकदा रुग्णांना ते आर्थिकदृष्ट्या परवडत नसते. परंतु आता किमती घसरल्याने ते शक्य होणार आहे. केंद्र शासनाने यावर्षीच्या प्रारंभी न���े आरोग्य धोरण जाहीर केले होते. या धोरणात ज्या महत्त्वाच्या पैलूंवर लक्ष केंद्रित करण्यात आले त्यात जनतेला आरोग्यसेवेवर कराव्या लागणाºया खर्चात कपात प्रमुख होती. त्यादिशेने वाटचाल सुरू झाली आहे, असे समजण्यास हरकत नाही.\\n\\nनागपूरः राज्याचे विद्यमान अन्न व औषधी प्रशासन मंत्री संजय राठोड हे भाजप-शिवसेना सरकारमध्ये महसूल राज्यमंत्री असताना त्यांनी वाशिम जिल्ह्यातील कारंजा लाड येथील गायरानाची २५ कोटी रुपये किमतीची तब्बल १० एकर जमीन दोन व्यक्तींना वाटप केल्याचे नवे प्रकरण समोर आले. तत्कालीन जिल्हाधिकारी लक्ष्मीनारायण मिश्रा यांनी या जमिनीच्या प्रकरणात बनावट कागदपत्रे सादर करणाऱ्या व्यक्तींविरुद्ध फौजदारी गुन्हे दाखल करावेत आणि ही जमीन सरकारजमा करावी असे सुस्पष्ट आदेश दिले होते; पण ते डावलून राठोड यांनी काळी कारंजामधील पाच एकर जमीन ही युनूस अय्युब अन्सारी यांना, तर पाच एकर जमीन ही रोहित राधेश्याम लाहोटी यांना दिली. दोन्ही आदेश त्यांनी एकाच दिवशी म्हणजे ७ ऑगस्ट २०१९ रोजी पारित केले. \\'लोकमत\\'ने मंगळवारी सावरगावची ५ एकर जमीन खासगी व्यक्तीच्या नावे केल्याचे प्रकरण उघडकीस आणले. या प्रकरणावर संजय राठोड यांचे दोन्ही मोबाइल स्विच ऑफ होते. मंत्रिमहोदयांची प्रकृती बरी नसल्याचे त्यांचे स्वीय सचिव म्हणाले. - बेकायदा जमीन वाटपप्रकरणी सोमवारी कामकाज रोखून धरणाऱ्या विरोधकांनी मंगळवारी मात्र या मुद्द्यावर मौन बाळगल्याने आश्चर्य व्यक्त केले जात आहे. - कृषिमंत्री अब्दुल सत्तार सभागृहात असूनही विरोधी पक्षाने त्यांच्या राजीनाम्याच्या मागणीला स्पर्श केला नाही. सत्तापक्ष आणि विरोधक यांच्यात या विषयावर काही समझौता तर झाला नाही ना, अशी चर्चाही विधानभवन परिसरात रंगली होती. सर्व ठळक बातम्यांसाठी जरूर वाचा महाराष्ट्रातील अव्वल मराठी वेबसाईट \"लोकमत डॉट कॉम\"\\n\\nसोलापूर : निर्यातक्षम केळी तोडणे, ती व्यवस्थित ठेवणे आणि कंटेनरमध्ये भरणे आदी कामांमध्ये पश्चिम बंगालच्या मजुरांचे कौशल्य असून कोरोना साथीमुळे गावी गेलेल्या या मजुरांना जिल्ह्यात परत येण्यासाठी परवानगी द्यावी, अशी मागणी करमाळा येथील केळी निर्यातदारांनी केली आहे. हे कामगार राज्यात परत गेल्याने स्थानिक कामगारांना हे काम देण्यात आले; पण त्यांच्याकडून निर्यातक्षम प्रत राखण्यात अडचणी येत असल्याची कैफियत या निर्यातदारांनी व्हिडिओ कॉन्फरन्सद्वारे जिल्हाधिकाºयापुढे मांडली आहे. कोरोनाचा प्रादुर्भाव सुरू झाल्यानंतर करमाळा तालुक्यातील कंदर, माळशिरस व माढा तालुक्यातील परराज्यातील कामगार रेल्वेची सुविधा उपलब्ध झाल्यानंतर आपल्या राज्यात परत गेले आहेत. परंतु कोरोना प्रादुर्भावाच्या सुरुवातीच्या टप्प्यामध्ये सोलापूरमधून अफगाणिस्थान, इराण, ओमान, सौदीअरेबिया व नेदरलॅण्ड या देशांमध्ये ५३८ मे. टनपर्यंत केळीची निर्यात झालेली आहे. परराज्यातील कामगार स्थलांतरित झाल्यानंतर स्थानिक कामगारांना निर्यात साखळीमध्ये घेऊन काम पुढे सुरू ठेवण्याचा प्रयत्न स्थानिक निर्यातदारांनी केलेला आहे. पण स्थानिक कामगारांकडून निर्यातक्षम प्रत राखण्यात अडचणी येत असल्याने निर्यातीवर परिणाम होत असल्याची तक्रार निर्यातदारांनी केली आहे. या पार्श्वभूमीवर जिल्हाधिकारी मिलिंद शंभरकर यांनी केळी निर्यातदारांशी व्हिडिओ कॉन्फरन्सद्वारे चर्चा केली. यामध्ये अजहर पठाण, अजित ओतारी, नीलेश काळे, किरण डोके, विष्णू पोळ या प्रतिनिधींनी भाग घेतला. निर्यातीमध्ये केळी काढणीपासून ते कंटेनरमध्ये भरेपर्यंत शक्यतो पश्चिम बंगालमधील कामगारांमार्फत सर्व प्रक्रिया पूर्ण केली जात होती. यामध्ये केळी झाडावरून उतरविणे, ती साफ करणे, केळीच्या फण्या वेगळ्या करणे, डंपिंग करणे, परत स्वच्छ करणे व हवाबंद प्लास्टिक बॅगमध्ये पॅक करून ती कर्टन बॉक्समध्ये ठेवणे व कंटेनरमध्ये भरणे अशी संपूर्ण प्रक्रिया करण्यास त्यांना दीड रुपया प्रति किलो मजुरी दिली जाते. हे कामगार दरवर्षी सणांदरम्यान मूळगावी परतात. त्यांच्या एका समूहामध्ये २० लोक असतात. प्रतिकिलोप्रमाणे मजुरी असल्याने पहाटेपासून केळीचे घड उतरविण्यापासून ते कंटेनरमध्ये भरण्यापर्यंत काम करण्याची त्यांची तयारी असते. पण स्थानिक कामगारांना वेळेचे बंधन व अंगावर घेऊन काम करण्याची तयारी नसल्याची अडचण होत असल्याच्या तक्रारी मांडल्या. त्यामुळे पश्चिम बंगालमधील कर्मचाºयांना परत बोलावण्यास परवानगी द्यावी, अशी मागणी केली. स्थानिक कामगार केळी निर्यात साखळीमध्ये काम करण्यास अकुशल आहेत. त्यांच्या कामाचे तास सकाळी १० ते सायंकाळी ६ पर्यंतच आहे. त्यांना प्रशिक्षित केल्यानंतर इतर निर्यातदारांकडे कामासाठी जाण्याचे प्रमाण जास्त आहे. प्रति किलोमागे मजुरी दरामध्ये वाढ करावी, अशी अपेक्षा असल्याने उत्पादन खर्चात वाढ होत आहे. कोरोना प्रादुर्भावामुळे पुणे-मुंबईसारख्या शहरातील परत आलेले कामगार या साखळीत काम करीत आहेत. कोरोना प्रादुर्भाव संपल्यानंतर पश्चिम बंगालचे कामगार कामावर येण्याची शक्यता आहे. स्थानिक कामगारांमार्फत निर्यातक्षम केळीची प्रत निर्यात साखळीमध्ये राखली जात नाही, असे व्यापाºयांचे म्हणणे आहे. जिल्ह्यातील केळी लागवडीच्या पट्ट्यामध्ये प्रगतिशील शेतकºयांच्या माध्यमातून स्थानिक कामगारांना प्रशिक्षित करण्याचे नियोजन आहे. सध्या परराज्याच्या कामगारांना परत केळी निर्यात पट्ट्यामध्ये आणून त्यांच्या समूहामध्ये स्थानिक कामगारांचा समावेश करण्यात येणार आहे. - रवींद्र माने,\\n'"
23
+ ]
24
+ },
25
+ "execution_count": 2,
26
+ "metadata": {},
27
+ "output_type": "execute_result"
28
+ }
29
+ ],
30
+ "source": [
31
+ "text"
32
+ ]
33
+ },
34
+ {
35
+ "cell_type": "code",
36
+ "execution_count": 3,
37
+ "metadata": {},
38
+ "outputs": [],
39
+ "source": [
40
+ "tokens = text.encode(\"utf-8\") # raw bytes\n",
41
+ "tokens = list(map(int, tokens)) # convert to a list of integers in range 0..255 for convenience"
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "code",
46
+ "execution_count": 4,
47
+ "metadata": {},
48
+ "outputs": [
49
+ {
50
+ "name": "stdout",
51
+ "output_type": "stream",
52
+ "text": [
53
+ "tokens length: 27038\n",
54
+ "ids length: 3776\n",
55
+ "compression ratio: 7.16X\n"
56
+ ]
57
+ }
58
+ ],
59
+ "source": [
60
+ "def get_stats(ids: list[int]) -> dict[tuple[int, int], int]:\n",
61
+ " \"\"\"\n",
62
+ " Get the frequency of each pair of tokens in the list\n",
63
+ " :param ids: list of integers\n",
64
+ " :return: dictionary of pairs and their frequencies\n",
65
+ " \"\"\"\n",
66
+ " counts = {}\n",
67
+ " for pair in zip(ids, ids[1:]):\n",
68
+ " counts[pair] = counts.get(pair, 0) + 1\n",
69
+ " return counts\n",
70
+ "\n",
71
+ "\n",
72
+ "def merge(ids: list[int], pair: tuple[int, int], idx: int) -> list[int]:\n",
73
+ " \"\"\"\n",
74
+ " Merge the pair of tokens into a new token\n",
75
+ " :param ids: list of integers\n",
76
+ " :param pair: tuple of integers\n",
77
+ " :param idx: integer\n",
78
+ " :return: list of integers\n",
79
+ " \"\"\"\n",
80
+ " newids = []\n",
81
+ " i = 0\n",
82
+ " \n",
83
+ " while i < len(ids):\n",
84
+ " if i < len(ids) - 1 and ids[i] == pair[0] and ids[i+1] == pair[1]:\n",
85
+ " newids.append(idx)\n",
86
+ " i += 2\n",
87
+ " else:\n",
88
+ " newids.append(ids[i])\n",
89
+ " i += 1\n",
90
+ " return newids\n",
91
+ "\n",
92
+ "# ---\n",
93
+ "vocab_size = 1000 # the desired final vocabulary size\n",
94
+ "num_merges = vocab_size - 256\n",
95
+ "ids = list(tokens) # copy so we don't destroy the original list\n",
96
+ "\n",
97
+ "merges = {} # (int, int) -> int\n",
98
+ "for i in range(num_merges):\n",
99
+ " stats = get_stats(ids)\n",
100
+ " pair = max(stats, key=stats.get)\n",
101
+ " idx = 256 + i\n",
102
+ " # print(f\"merging {pair} into a new token {idx}\")\n",
103
+ " ids = merge(ids, pair, idx)\n",
104
+ " merges[pair] = idx\n",
105
+ "\n",
106
+ "print(\"tokens length:\", len(tokens))\n",
107
+ "print(\"ids length:\", len(ids))\n",
108
+ "print(f\"compression ratio: {len(tokens) / len(ids):.2f}X\")"
109
+ ]
110
+ },
111
+ {
112
+ "cell_type": "code",
113
+ "execution_count": 5,
114
+ "metadata": {},
115
+ "outputs": [],
116
+ "source": [
117
+ "def encode(text):\n",
118
+ " # given a string, return list of integers (the tokens)\n",
119
+ " tokens = list(text.encode(\"utf-8\"))\n",
120
+ " while len(tokens) >= 2:\n",
121
+ " stats = get_stats(tokens)\n",
122
+ " pair = min(stats, key=lambda p: merges.get(p, float(\"inf\")))\n",
123
+ " if pair not in merges:\n",
124
+ " break # nothing else can be merged\n",
125
+ " idx = merges[pair]\n",
126
+ " tokens = merge(tokens, pair, idx)\n",
127
+ " return tokens\n",
128
+ "\n",
129
+ "vocab = {idx: bytes([idx]) for idx in range(256)}\n",
130
+ "for (p0, p1), idx in merges.items():\n",
131
+ " vocab[idx] = vocab[p0] + vocab[p1]\n",
132
+ "\n",
133
+ "def decode(ids):\n",
134
+ " # given ids (list of integers), return Python string\n",
135
+ " tokens = b\"\".join(vocab[idx] for idx in ids)\n",
136
+ " text = tokens.decode(\"utf-8\", errors=\"replace\")\n",
137
+ " return text\n"
138
+ ]
139
+ },
140
+ {
141
+ "cell_type": "code",
142
+ "execution_count": 6,
143
+ "metadata": {},
144
+ "outputs": [
145
+ {
146
+ "name": "stdout",
147
+ "output_type": "stream",
148
+ "text": [
149
+ "True\n"
150
+ ]
151
+ }
152
+ ],
153
+ "source": [
154
+ "text2 = decode(encode(text))\n",
155
+ "print(text2 == text)"
156
+ ]
157
+ },
158
+ {
159
+ "cell_type": "code",
160
+ "execution_count": 7,
161
+ "metadata": {},
162
+ "outputs": [
163
+ {
164
+ "name": "stdout",
165
+ "output_type": "stream",
166
+ "text": [
167
+ "0: \u0000\n",
168
+ "1: \u0001\n",
169
+ "2: \u0002\n",
170
+ "3: \u0003\n",
171
+ "4: \u0004\n",
172
+ "5: \u0005\n",
173
+ "6: \u0006\n",
174
+ "7: \u0007\n",
175
+ "8:\n",
176
+ "9: \t\n",
177
+ "10: \n",
178
+ "\n",
179
+ "11: \u000b\n",
180
+ "12: \f\n",
181
+ "13: \n",
182
+ "14: \u000e\n",
183
+ "15: \u000f\n",
184
+ "16: \u0010\n",
185
+ "17: \u0011\n",
186
+ "18: \u0012\n",
187
+ "19: \u0013\n",
188
+ "20: \u0014\n",
189
+ "21: \u0015\n",
190
+ "22: \u0016\n",
191
+ "23: \u0017\n",
192
+ "24: \u0018\n",
193
+ "25: \u0019\n",
194
+ "26: \u001a\n",
195
+ "27: \u001b\n",
196
+ "28: \u001c\n",
197
+ "29: \u001d\n",
198
+ "30: \u001e\n",
199
+ "31: \u001f\n",
200
+ "32: \n",
201
+ "33: !\n",
202
+ "34: \"\n",
203
+ "35: #\n",
204
+ "36: $\n",
205
+ "37: %\n",
206
+ "38: &\n",
207
+ "39: '\n",
208
+ "40: (\n",
209
+ "41: )\n",
210
+ "42: *\n",
211
+ "43: +\n",
212
+ "44: ,\n",
213
+ "45: -\n",
214
+ "46: .\n",
215
+ "47: /\n",
216
+ "48: 0\n",
217
+ "49: 1\n",
218
+ "50: 2\n",
219
+ "51: 3\n",
220
+ "52: 4\n",
221
+ "53: 5\n",
222
+ "54: 6\n",
223
+ "55: 7\n",
224
+ "56: 8\n",
225
+ "57: 9\n",
226
+ "58: :\n",
227
+ "59: ;\n",
228
+ "60: <\n",
229
+ "61: =\n",
230
+ "62: >\n",
231
+ "63: ?\n",
232
+ "64: @\n",
233
+ "65: A\n",
234
+ "66: B\n",
235
+ "67: C\n",
236
+ "68: D\n",
237
+ "69: E\n",
238
+ "70: F\n",
239
+ "71: G\n",
240
+ "72: H\n",
241
+ "73: I\n",
242
+ "74: J\n",
243
+ "75: K\n",
244
+ "76: L\n",
245
+ "77: M\n",
246
+ "78: N\n",
247
+ "79: O\n",
248
+ "80: P\n",
249
+ "81: Q\n",
250
+ "82: R\n",
251
+ "83: S\n",
252
+ "84: T\n",
253
+ "85: U\n",
254
+ "86: V\n",
255
+ "87: W\n",
256
+ "88: X\n",
257
+ "89: Y\n",
258
+ "90: Z\n",
259
+ "91: [\n",
260
+ "92: \\\n",
261
+ "93: ]\n",
262
+ "94: ^\n",
263
+ "95: _\n",
264
+ "96: `\n",
265
+ "97: a\n",
266
+ "98: b\n",
267
+ "99: c\n",
268
+ "100: d\n",
269
+ "101: e\n",
270
+ "102: f\n",
271
+ "103: g\n",
272
+ "104: h\n",
273
+ "105: i\n",
274
+ "106: j\n",
275
+ "107: k\n",
276
+ "108: l\n",
277
+ "109: m\n",
278
+ "110: n\n",
279
+ "111: o\n",
280
+ "112: p\n",
281
+ "113: q\n",
282
+ "114: r\n",
283
+ "115: s\n",
284
+ "116: t\n",
285
+ "117: u\n",
286
+ "118: v\n",
287
+ "119: w\n",
288
+ "120: x\n",
289
+ "121: y\n",
290
+ "122: z\n",
291
+ "123: {\n",
292
+ "124: |\n",
293
+ "125: }\n",
294
+ "126: ~\n",
295
+ "127: \n",
296
+ "128: �\n",
297
+ "129: �\n",
298
+ "130: �\n",
299
+ "131: �\n",
300
+ "132: �\n",
301
+ "133: �\n",
302
+ "134: �\n",
303
+ "135: �\n",
304
+ "136: �\n",
305
+ "137: �\n",
306
+ "138: �\n",
307
+ "139: �\n",
308
+ "140: �\n",
309
+ "141: �\n",
310
+ "142: �\n",
311
+ "143: �\n",
312
+ "144: �\n",
313
+ "145: �\n",
314
+ "146: �\n",
315
+ "147: �\n",
316
+ "148: �\n",
317
+ "149: �\n",
318
+ "150: �\n",
319
+ "151: �\n",
320
+ "152: �\n",
321
+ "153: �\n",
322
+ "154: �\n",
323
+ "155: �\n",
324
+ "156: �\n",
325
+ "157: �\n",
326
+ "158: �\n",
327
+ "159: �\n",
328
+ "160: �\n",
329
+ "161: �\n",
330
+ "162: �\n",
331
+ "163: �\n",
332
+ "164: �\n",
333
+ "165: �\n",
334
+ "166: �\n",
335
+ "167: �\n",
336
+ "168: �\n",
337
+ "169: �\n",
338
+ "170: �\n",
339
+ "171: �\n",
340
+ "172: �\n",
341
+ "173: �\n",
342
+ "174: �\n",
343
+ "175: �\n",
344
+ "176: �\n",
345
+ "177: �\n",
346
+ "178: �\n",
347
+ "179: �\n",
348
+ "180: �\n",
349
+ "181: �\n",
350
+ "182: �\n",
351
+ "183: �\n",
352
+ "184: �\n",
353
+ "185: �\n",
354
+ "186: �\n",
355
+ "187: �\n",
356
+ "188: �\n",
357
+ "189: �\n",
358
+ "190: �\n",
359
+ "191: �\n",
360
+ "192: �\n",
361
+ "193: �\n",
362
+ "194: �\n",
363
+ "195: �\n",
364
+ "196: �\n",
365
+ "197: �\n",
366
+ "198: �\n",
367
+ "199: �\n",
368
+ "200: �\n",
369
+ "201: �\n",
370
+ "202: �\n",
371
+ "203: �\n",
372
+ "204: �\n",
373
+ "205: �\n",
374
+ "206: �\n",
375
+ "207: �\n",
376
+ "208: �\n",
377
+ "209: �\n",
378
+ "210: �\n",
379
+ "211: �\n",
380
+ "212: �\n",
381
+ "213: �\n",
382
+ "214: �\n",
383
+ "215: �\n",
384
+ "216: �\n",
385
+ "217: �\n",
386
+ "218: �\n",
387
+ "219: �\n",
388
+ "220: �\n",
389
+ "221: �\n",
390
+ "222: �\n",
391
+ "223: �\n",
392
+ "224: �\n",
393
+ "225: �\n",
394
+ "226: �\n",
395
+ "227: �\n",
396
+ "228: �\n",
397
+ "229: �\n",
398
+ "230: �\n",
399
+ "231: �\n",
400
+ "232: �\n",
401
+ "233: �\n",
402
+ "234: �\n",
403
+ "235: �\n",
404
+ "236: �\n",
405
+ "237: �\n",
406
+ "238: �\n",
407
+ "239: �\n",
408
+ "240: �\n",
409
+ "241: �\n",
410
+ "242: �\n",
411
+ "243: �\n",
412
+ "244: �\n",
413
+ "245: �\n",
414
+ "246: �\n",
415
+ "247: �\n",
416
+ "248: �\n",
417
+ "249: �\n",
418
+ "250: �\n",
419
+ "251: �\n",
420
+ "252: �\n",
421
+ "253: �\n",
422
+ "254: �\n",
423
+ "255: �\n",
424
+ "256: �\n",
425
+ "257: �\n",
426
+ "258: �\n",
427
+ "259: ा\n",
428
+ "260: ा�\n",
429
+ "261: ्\n",
430
+ "262: ्�\n",
431
+ "263: े\n",
432
+ "264: ी\n",
433
+ "265: र\n",
434
+ "266: ्य\n",
435
+ "267: ��\n",
436
+ "268: ि\n",
437
+ "269: ी �\n",
438
+ "270: ा �\n",
439
+ "271: ल\n",
440
+ "272: त\n",
441
+ "273: क\n",
442
+ "274: े �\n",
443
+ "275: ्या�\n",
444
+ "276: ण\n",
445
+ "277: ु\n",
446
+ "278: ो\n",
447
+ "279: क\n",
448
+ "280: स\n",
449
+ "281: न\n",
450
+ "282: ार\n",
451
+ "283: म\n",
452
+ "284: ं�\n",
453
+ "285: ्र\n",
454
+ "286: व\n",
455
+ "287: ां�\n",
456
+ "288: ह\n",
457
+ "289: . �\n",
458
+ "290: , �\n",
459
+ "291: े�\n",
460
+ "292: ु�\n",
461
+ "293: ्या �\n",
462
+ "294: ध\n",
463
+ "295: स\n",
464
+ "296: य\n",
465
+ "297: ू�\n",
466
+ "298: �र\n",
467
+ "299: ेल\n",
468
+ "300: �ह\n",
469
+ "301: ात\n",
470
+ "302: च\n",
471
+ "303: ो�\n",
472
+ "304: �हे\n",
473
+ "305: �्र\n",
474
+ "306: ाव\n",
475
+ "307: ान\n",
476
+ "308: ाम\n",
477
+ "309: र �\n",
478
+ "310: क्�\n",
479
+ "311: द\n",
480
+ "312: ्यात\n",
481
+ "313: त �\n",
482
+ "314: ाल\n",
483
+ "315: ांन\n",
484
+ "316: रण\n",
485
+ "317: ्याच\n",
486
+ "318: िक\n",
487
+ "319: ग\n",
488
+ "320: �स\n",
489
+ "321: श\n",
490
+ "322: र्�\n",
491
+ "323: ्ह\n",
492
+ "324: ाच\n",
493
+ "325: प\n",
494
+ "326: ंत\n",
495
+ "327: ज\n",
496
+ "328: व\n",
497
+ "329: ास\n",
498
+ "330: ून\n",
499
+ "331: क्ष\n",
500
+ "332: ाग\n",
501
+ "333: ड\n",
502
+ "334: �\n",
503
+ "335: ील\n",
504
+ "336: ध्य\n",
505
+ "337: �हे. �\n",
506
+ "338: �ि\n",
507
+ "339: ी क\n",
508
+ "340: स्�\n",
509
+ "341: आ\n",
510
+ "342: े, �\n",
511
+ "343: े क\n",
512
+ "344: ाय\n",
513
+ "345: ीच\n",
514
+ "346: िल\n",
515
+ "347: ०\n",
516
+ "348: त\n",
517
+ "349: �ा �\n",
518
+ "350: म\n",
519
+ "351: ी स\n",
520
+ "352: �ो\n",
521
+ "353: ्व\n",
522
+ "354: ाह\n",
523
+ "355: ्यां�\n",
524
+ "356: र\n",
525
+ "357: ब\n",
526
+ "358: ुन\n",
527
+ "359: �िर\n",
528
+ "360: �िर्यात\n",
529
+ "361: ा पर\n",
530
+ "362: भ\n",
531
+ "363: ाख\n",
532
+ "364: ीन\n",
533
+ "365: ्यान\n",
534
+ "366: गार\n",
535
+ "367: िम\n",
536
+ "368: ध्ये �\n",
537
+ "369: ट\n",
538
+ "370: �े�\n",
539
+ "371: ू\n",
540
+ "372: ंद\n",
541
+ "373: करण\n",
542
+ "374: ांच\n",
543
+ "375: ेळ\n",
544
+ "376: ाठ\n",
545
+ "377: ित\n",
546
+ "378: घ\n",
547
+ "379: ामगार\n",
548
+ "380: �ेख\n",
549
+ "381: ी म\n",
550
+ "382: ी. �\n",
551
+ "383: ्थ\n",
552
+ "384: अ\n",
553
+ "385: ळ\n",
554
+ "386: १\n",
555
+ "387: �ेखा पर\n",
556
+ "388: �ेखा परी\n",
557
+ "389: �ेखा परीक्ष\n",
558
+ "390: केल\n",
559
+ "391: प\n",
560
+ "392: ांना �\n",
561
+ "393: ाण\n",
562
+ "394: ी व\n",
563
+ "395: े स\n",
564
+ "396: े. �\n",
565
+ "397: ाज\n",
566
+ "398: पर\n",
567
+ "399: ब\n",
568
+ "400: ोट\n",
569
+ "401: ाळ\n",
570
+ "402: ्ट\n",
571
+ "403: ृ\n",
572
+ "404: िय\n",
573
+ "405: स्त\n",
574
+ "406: कर\n",
575
+ "407: ी त\n",
576
+ "408: �ोत\n",
577
+ "409: ष\n",
578
+ "410: ी अ\n",
579
+ "411: िस\n",
580
+ "412: �हेत\n",
581
+ "413: �ु�\n",
582
+ "414: ग\n",
583
+ "415: ्यांच\n",
584
+ "416: ुर\n",
585
+ "417: �सल\n",
586
+ "418: ेश\n",
587
+ "419: क्र\n",
588
+ "420: े आ\n",
589
+ "421: ुड\n",
590
+ "422: ुडघ\n",
591
+ "423: कामगार\n",
592
+ "424: ए\n",
593
+ "425: २\n",
594
+ "426: े द\n",
595
+ "427: ीच्या �\n",
596
+ "428: ार �\n",
597
+ "429: �ाल\n",
598
+ "430: ी, �\n",
599
+ "431: ी न\n",
600
+ "432: ज\n",
601
+ "433: (\n",
602
+ "434: आण\n",
603
+ "435: �हेत. �\n",
604
+ "436: फ\n",
605
+ "437: ह\n",
606
+ "438: त्�\n",
607
+ "439: ोन\n",
608
+ "440: ्थान\n",
609
+ "441: ्थानिक\n",
610
+ "442: श\n",
611
+ "443: मध्ये �\n",
612
+ "444: या �\n",
613
+ "445: ा क\n",
614
+ "446: िल्ह\n",
615
+ "447: य\n",
616
+ "448: क्क\n",
617
+ "449: ेव\n",
618
+ "450: न\n",
619
+ "451: �ाग\n",
620
+ "452: िव\n",
621
+ "453: दार\n",
622
+ "454: ाद\n",
623
+ "455: ्ण\n",
624
+ "456: ाढ\n",
625
+ "457: द\n",
626
+ "458: ा प्र\n",
627
+ "459: ंग\n",
628
+ "460: केळ\n",
629
+ "461: र्च\n",
630
+ "462: ॉ\n",
631
+ "463: साय\n",
632
+ "464: ्याच्या �\n",
633
+ "465: �ेखा परीक्षक\n",
634
+ "466: ै\n",
635
+ "467: ्याचे �\n",
636
+ "468: न्�\n",
637
+ "469: े आहे. �\n",
638
+ "470: कार\n",
639
+ "471: े म\n",
640
+ "472: ी य\n",
641
+ "473: प्र\n",
642
+ "474: ोड\n",
643
+ "475: ोग\n",
644
+ "476: वि\n",
645
+ "477: ्युन\n",
646
+ "478: ोक\n",
647
+ "479: ख\n",
648
+ "480: ंत्र\n",
649
+ "481: ी ज\n",
650
+ "482: ्यास\n",
651
+ "483: क्रिय\n",
652
+ "484: ्थानिक कामगार\n",
653
+ "485: ए\n",
654
+ "486: ोसाय\n",
655
+ "487: ोसायट\n",
656
+ "488: २०\n",
657
+ "489: ार्�\n",
658
+ "490: ाध\n",
659
+ "491: ून �\n",
660
+ "492: ीत\n",
661
+ "493: ी र\n",
662
+ "494: �सत\n",
663
+ "495: ता �\n",
664
+ "496: ृत\n",
665
+ "497: ी केल\n",
666
+ "498: ्यानंत\n",
667
+ "499: �ि\n",
668
+ "500: १\n",
669
+ "501: ुक\n",
670
+ "502: ाब\n",
671
+ "503: मू�\n",
672
+ "504: ले �\n",
673
+ "505: ा स\n",
674
+ "506: �हे.\n",
675
+ "507: ्युनिस\n",
676
+ "508: �े\n",
677
+ "509: ंद्र\n",
678
+ "510: ुग\n",
679
+ "511: ुग्ण\n",
680
+ "512: �ुडघ\n",
681
+ "513: कार\n",
682
+ "514: �ेखा परीक्षण\n",
683
+ "515: ूर\n",
684
+ "516: ा न\n",
685
+ "517: ीस\n",
686
+ "518: ंज\n",
687
+ "519: १�\n",
688
+ "520: ्हण\n",
689
+ "521: ेल्या �\n",
690
+ "522: र ज\n",
691
+ "523: ाश\n",
692
+ "524: ूम\n",
693
+ "525: , स\n",
694
+ "526: आणि\n",
695
+ "527: ठ\n",
696
+ "528: ्यांच्या �\n",
697
+ "529: करण\n",
698
+ "530: को\n",
699
+ "531: ांड\n",
700
+ "532: ेत �\n",
701
+ "533: ुट\n",
702
+ "534: ्यंत\n",
703
+ "535: त्त\n",
704
+ "536: ाड\n",
705
+ "537: ेथ\n",
706
+ "538: �सून\n",
707
+ "539: �्युनिस\n",
708
+ "540: आहे. �\n",
709
+ "541: ौ\n",
710
+ "542: े व\n",
711
+ "543: े प\n",
712
+ "544: विण\n",
713
+ "545: ाप\n",
714
+ "546: ेंद्र\n",
715
+ "547: ी ल\n",
716
+ "548: ण्यात\n",
717
+ "549: �श\n",
718
+ "550: �ण\n",
719
+ "551: स्त्र\n",
720
+ "552: स्त्रक्रिय\n",
721
+ "553: श्�\n",
722
+ "554: श्च\n",
723
+ "555: ्यातील\n",
724
+ "556: मीन\n",
725
+ "557: �िर्यातदार\n",
726
+ "558: ित �\n",
727
+ "559: ारण\n",
728
+ "560: ावर\n",
729
+ "561: वि\n",
730
+ "562: े दाख\n",
731
+ "563: ावल\n",
732
+ "564: र्भ\n",
733
+ "565: राव\n",
734
+ "566: �र �\n",
735
+ "567: ागण\n",
736
+ "568: �ड\n",
737
+ "569: कोट\n",
738
+ "570: ुप\n",
739
+ "571: ुपय\n",
740
+ "572: झाल\n",
741
+ "573: ात �\n",
742
+ "574: ांनी �\n",
743
+ "575: ाठी �\n",
744
+ "576: नि\n",
745
+ "577: ेत\n",
746
+ "578: ें�\n",
747
+ "579: ा उ\n",
748
+ "580: ीव\n",
749
+ "581: ी.\n",
750
+ "582: ॅ\n",
751
+ "583: ंप\n",
752
+ "584: �ुद\n",
753
+ "585: ्द\n",
754
+ "586: ा आहे. �\n",
755
+ "587: घ\n",
756
+ "588: ाष\n",
757
+ "589: ीं�\n",
758
+ "590: र व\n",
759
+ "591: ल\n",
760
+ "592: भाग\n",
761
+ "593: सल\n",
762
+ "594: ा व\n",
763
+ "595: ुरू\n",
764
+ "596: उ\n",
765
+ "597: िश\n",
766
+ "598: ुद\n",
767
+ "599: ख\n",
768
+ "600: �ेथ\n",
769
+ "601: ्याप\n",
770
+ "602: ा त\n",
771
+ "603: ांम\n",
772
+ "604: े,\n",
773
+ "605: ी द\n",
774
+ "606: ्याची अ\n",
775
+ "607: त्या�\n",
776
+ "608: ेच\n",
777
+ "609: ्यांन\n",
778
+ "610: ्याने �\n",
779
+ "611: º\n",
780
+ "612: ºय\n",
781
+ "613: �्रकरण\n",
782
+ "614: जुर\n",
783
+ "615: कोर\n",
784
+ "616: कोरोन\n",
785
+ "617: काम\n",
786
+ "618: ्प\n",
787
+ "619: सह\n",
788
+ "620: सहकार\n",
789
+ "621: ्या\n",
790
+ "622: ते\n",
791
+ "623: ीत �\n",
792
+ "624: ी आहे. �\n",
793
+ "625: सोसायट\n",
794
+ "626: भास\n",
795
+ "627: भासद\n",
796
+ "628: र्व\n",
797
+ "629: ांत\n",
798
+ "630: करण्याच\n",
799
+ "631: े केल\n",
800
+ "632: �ोती. �\n",
801
+ "633: ़\n",
802
+ "634: रव\n",
803
+ "635: ्यव\n",
804
+ "636: �्रम\n",
805
+ "637: �्रमाण\n",
806
+ "638: ी असत\n",
807
+ "639: र्म\n",
808
+ "640: ी सम\n",
809
+ "641: �ह\n",
810
+ "642: िन\n",
811
+ "643: ंध\n",
812
+ "644: �ोते. �\n",
813
+ "645: , त\n",
814
+ "646: ), �\n",
815
+ "647: ी (\n",
816
+ "648: ुण\n",
817
+ "649: न्स\n",
818
+ "650: र आ\n",
819
+ "651: ६\n",
820
+ "652: ५\n",
821
+ "653: पर\n",
822
+ "654: ानग\n",
823
+ "655: ाष्ट\n",
824
+ "656: ७\n",
825
+ "657: रात\n",
826
+ "658: ाच्या �\n",
827
+ "659: �ेव\n",
828
+ "660: ी श\n",
829
+ "661: मूद\n",
830
+ "662: ात्र\n",
831
+ "663: पास\n",
832
+ "664: ीची �\n",
833
+ "665: �ाह\n",
834
+ "666: आल\n",
835
+ "667: �िल्ह\n",
836
+ "668: �ुळ\n",
837
+ "669: िच\n",
838
+ "670: णार\n",
839
+ "671: ी प\n",
840
+ "672: णार �\n",
841
+ "673: \n",
842
+ "\n",
843
+ "\n",
844
+ "674: ा द\n",
845
+ "675: ोल\n",
846
+ "676: लेल\n",
847
+ "677: सर\n",
848
+ "678: धील\n",
849
+ "679: डक\n",
850
+ "680: '\n",
851
+ "681: शि\n",
852
+ "682: ्ध\n",
853
+ "683: ात. �\n",
854
+ "684: द्य\n",
855
+ "685: �ुग्ण\n",
856
+ "686: केंद्र\n",
857
+ "687: ्याची अक्क\n",
858
+ "688: ्याची अक्कल\n",
859
+ "689: गुडघ\n",
860
+ "690: ाचा �\n",
861
+ "691: त्यार\n",
862
+ "692: त्यारो�\n",
863
+ "693: त्यारोपण\n",
864
+ "694: ी ग\n",
865
+ "695: ण्याच\n",
866
+ "696: र्ण\n",
867
+ "697: क्य\n",
868
+ "698: ाधिक\n",
869
+ "699: पी\n",
870
+ "700: �ोत �\n",
871
+ "701: ाºय\n",
872
+ "702: ाट\n",
873
+ "703: एक\n",
874
+ "704: एकर ज\n",
875
+ "705: एकर जमीन\n",
876
+ "706: ्यक्�\n",
877
+ "707: ्यक्त\n",
878
+ "708: ्याम\n",
879
+ "709: �िर्यातक्ष\n",
880
+ "710: �िर्यातक्षम\n",
881
+ "711: ंटे\n",
882
+ "712: ंटेन\n",
883
+ "713: ंटेनर\n",
884
+ "714: ंटेनरमध्ये �\n",
885
+ "715: ंटेनरमध्ये भ\n",
886
+ "716: श्चिम\n",
887
+ "717: श्चिम ब\n",
888
+ "718: श्चिम बंग\n",
889
+ "719: श्चिम बंगाल\n",
890
+ "720: परत �\n",
891
+ "721: �िर्यातदारांन\n",
892
+ "722: े कामगार\n",
893
+ "723: ्थानिक कामगारांना �\n",
894
+ "724: ा प्राद\n",
895
+ "725: ा प्रादु\n",
896
+ "726: ा प्रादुर्भ\n",
897
+ "727: ा प्रादुर्भाव\n",
898
+ "728: ाखळ\n",
899
+ "729: ून त\n",
900
+ "730: �र्च\n",
901
+ "731: �च\n",
902
+ "732: �चए\n",
903
+ "733: �चएए\n",
904
+ "734: �चएएल\n",
905
+ "735: ्ल\n",
906
+ "736: २००\n",
907
+ "737: या क\n",
908
+ "738: ्याच्या क\n",
909
+ "739: भाग\n",
910
+ "740: ाने �\n",
911
+ "741: ांनी त\n",
912
+ "742: ांवर �\n",
913
+ "743: ुन्ह\n",
914
+ "744: ुन्हे दाख\n",
915
+ "745: ुन्हे दाखल\n",
916
+ "746: ी मागण\n",
917
+ "747: ्याकड\n",
918
+ "748: ी रुपय\n",
919
+ "749: ांनी क\n",
920
+ "750: ाई\n",
921
+ "751: ष्ट\n",
922
+ "752: �ण\n",
923
+ "753: �से स\n",
924
+ "754: ासाठी �\n",
925
+ "755: ी नव\n",
926
+ "756: कृत\n",
927
+ "757: ी समित\n",
928
+ "758: ण त\n",
929
+ "759: ांच्या �\n",
930
+ "760: ोव\n",
931
+ "761: जिल्ह\n",
932
+ "762: ा उप\n",
933
+ "763: मो\n",
934
+ "764: हव\n",
935
+ "765: हवाल\n",
936
+ "766: भूम\n",
937
+ "767: भूमीव\n",
938
+ "768: नाश\n",
939
+ "769: नाशिक\n",
940
+ "770: अ\n",
941
+ "771: ोळ\n",
942
+ "772: ॅण\n",
943
+ "773: ॅण्�\n",
944
+ "774: ॅण्ड\n",
945
+ "775: ुळ\n",
946
+ "776: ोट���स\n",
947
+ "777: ी. स\n",
948
+ "778: ंब\n",
949
+ "779: ंभ\n",
950
+ "780: �ुद्द\n",
951
+ "781: ंच\n",
952
+ "782: क्कम\n",
953
+ "783: वानग\n",
954
+ "784: ऑ\n",
955
+ "785: ाष्ट्र\n",
956
+ "786: मध्य\n",
957
+ "787: गु\n",
958
+ "788: गुंत\n",
959
+ "789: गुंतव\n",
960
+ "790: गुंतवण\n",
961
+ "791: ावर �\n",
962
+ "792: र्ष\n",
963
+ "793: े न\n",
964
+ "794: नाह\n",
965
+ "795: लाख\n",
966
+ "796: परत\n",
967
+ "797: सार\n",
968
+ "798: ोग्य\n",
969
+ "799: री\n",
970
+ "800: त्र\n",
971
+ "801: केले �\n",
972
+ "802: करण्यात\n",
973
+ "803: सुरू\n",
974
+ "804: ्यामुळ\n",
975
+ "805: ागत\n",
976
+ "806: ा ल\n",
977
+ "807: �सल्याच\n",
978
+ "808: ट\n",
979
+ "809: धान\n",
980
+ "810: ००\n",
981
+ "811: १९\n",
982
+ "812: �ूम\n",
983
+ "813: �ूमध्य\n",
984
+ "814: ुद्र\n",
985
+ "815: १०\n",
986
+ "816: ी �\n",
987
+ "817: �ेथील\n",
988
+ "818: मान\n",
989
+ "819: ७�\n",
990
+ "820: �ुन\n",
991
+ "821: �ेक\n",
992
+ "822: े प्र\n",
993
+ "823: इ\n",
994
+ "824: ुख\n",
995
+ "825: �क\n",
996
+ "826: ली �\n",
997
+ "827: ी घ\n",
998
+ "828: ाचे �\n",
999
+ "829: ुस्�\n",
1000
+ "830: ीठ\n",
1001
+ "831: ोम\n",
1002
+ "832: न व\n",
1003
+ "833: ुश\n",
1004
+ "834: ैल\n",
1005
+ "835: आहेत. �\n",
1006
+ "836: �ल\n",
1007
+ "837: �लिव\n",
1008
+ "838: �लिव्ह\n",
1009
+ "839: �ळ\n",
1010
+ "840: विणे, �\n",
1011
+ "841: ा, �\n",
1012
+ "842: �ष\n",
1013
+ "843: ोह\n",
1014
+ "844: ीय\n",
1015
+ "845: ांस\n",
1016
+ "846: वाढ\n",
1017
+ "847: ी असल\n",
1018
+ "848: ुटण्यात\n",
1019
+ "849: ा ज\n",
1020
+ "850: . त\n",
1021
+ "851: म्हण\n",
1022
+ "852: खर्च\n",
1023
+ "853: ांची �\n",
1024
+ "854: ुढ\n",
1025
+ "855: ासन\n",
1026
+ "856: शस्त्रक्रिय\n",
1027
+ "857: �र\n",
1028
+ "858: �िय\n",
1029
+ "859: �स्त्रक्रिय\n",
1030
+ "860: रक\n",
1031
+ "861: वड\n",
1032
+ "862: ्यानंतर �\n",
1033
+ "863: ींन\n",
1034
+ "864: स्व\n",
1035
+ "865: �ाम\n",
1036
+ "866: ीड\n",
1037
+ "867: �रंत\n",
1038
+ "868: �रंतु\n",
1039
+ "869: �सल्याने �\n",
1040
+ "870: कराव\n",
1041
+ "871: ण्यास\n",
1042
+ "872: राज\n",
1043
+ "873: राठ\n",
1044
+ "874: राठोड\n",
1045
+ "875: वार\n",
1046
+ "876: -\n",
1047
+ "877: रो\n",
1048
+ "878: रोध\n",
1049
+ "879: �्यांच्या �\n",
1050
+ "880: कॉ\n",
1051
+ "881: ि क\n",
1052
+ "882: ंटेनरमध्ये भरण\n",
1053
+ "883: ्यात परत �\n",
1054
+ "884: ी, अश\n",
1055
+ "885: केळी �\n",
1056
+ "886: �िर्यातदारांनी केल\n",
1057
+ "887: े काम\n",
1058
+ "888: �ाख\n",
1059
+ "889: डच\n",
1060
+ "890: डचण\n",
1061
+ "891: राज\n",
1062
+ "892: कोरोना प्रादुर्भाव\n",
1063
+ "893: ्यामध्ये �\n",
1064
+ "894: स्थानिक कामगारांना �\n",
1065
+ "895: �िर्यात स\n",
1066
+ "896: �िर्यात साखळ\n",
1067
+ "897: �िर्यात साखळी\n",
1068
+ "898: होत �\n",
1069
+ "899: �्रत\n",
1070
+ "900: ई\n",
1071
+ "901: सहकारी स\n",
1072
+ "902: २००१\n",
1073
+ "903: २००१ ते\n",
1074
+ "904: २००१ ते २०\n",
1075
+ "905: ११\n",
1076
+ "906: या काल\n",
1077
+ "907: या कालाव\n",
1078
+ "908: या कालावध\n",
1079
+ "909: ीत लेखा परीक्षण\n",
1080
+ "910: सहकार वि\n",
1081
+ "911: सहकार विभाग\n",
1082
+ "912: �ेखा परीक्षकांना �\n",
1083
+ "913: �ारण\n",
1084
+ "914: �ारणे दाख\n",
1085
+ "915: �ारणे दाखव\n",
1086
+ "916: �ारणे दाखवा न\n",
1087
+ "917: ोटीस\n",
1088
+ "918: ोटीस ब\n",
1089
+ "919: ोटीस बज\n",
1090
+ "920: ी आहे. या �\n",
1091
+ "921: ीच्या स\n",
1092
+ "922: भासदांनी त\n",
1093
+ "923: वार्�\n",
1094
+ "924: वार्ष\n",
1095
+ "925: वार्षिक\n",
1096
+ "926: सर्व\n",
1097
+ "927: ठ\n",
1098
+ "928: �ेखा परीक्षकांवर �\n",
1099
+ "929: �ेखा परीक्षकांवर ग\n",
1100
+ "930: �ेखा परीक्षकांव�� गुन्हे दाखल\n",
1101
+ "931: �चएएल सोसायट\n",
1102
+ "932: य़\n",
1103
+ "933: ी रुपयांच\n",
1104
+ "934: ा ग\n",
1105
+ "935: ैरव\n",
1106
+ "936: ैरव्यव\n",
1107
+ "937: ैरव्यवह\n",
1108
+ "938: ार झाल\n",
1109
+ "939: न्न\n",
1110
+ "940: काळ\n",
1111
+ "941: ायद\n",
1112
+ "942: �्रमाणे �\n",
1113
+ "943: कारव\n",
1114
+ "944: कारवाई\n",
1115
+ "945: �णि\n",
1116
+ "946: ांचे म\n",
1117
+ "947: ांचे म्हण\n",
1118
+ "948: ांचे म्हणण\n",
1119
+ "949: ांचे म्हणणे आहे. �\n",
1120
+ "950: ेलेल्या �\n",
1121
+ "951: ंम\n",
1122
+ "952: लब\n",
1123
+ "953: णी क\n",
1124
+ "954: ी नवनि\n",
1125
+ "955: ी नवनिर्म\n",
1126
+ "956: ी नवनिर्माण\n",
1127
+ "957: ी नवनिर्माण कृत\n",
1128
+ "958: ी नवनिर्माण कृती समित\n",
1129
+ "959: वी\n",
1130
+ "960: िद\n",
1131
+ "961: े य\n",
1132
+ "962: ांच्या न\n",
1133
+ "963: ा उपनि\n",
1134
+ "964: ा उपनिब\n",
1135
+ "965: ा उपनिबंध\n",
1136
+ "966: ा उपनिबंधक\n",
1137
+ "967: र जिल्ह\n",
1138
+ "968: ा य\n",
1139
+ "969: ा यांनी �\n",
1140
+ "970: �ान\n",
1141
+ "971: �ानन\n",
1142
+ "972: ्वभूमीव\n",
1143
+ "973: ार ब\n",
1144
+ "974: �र\n",
1145
+ "975: गर\n",
1146
+ "976: �ॅण्ड\n",
1147
+ "977: �ॅण्ड क\n",
1148
+ "978: �ॅण्ड कंप\n",
1149
+ "979: �ॅण्ड कंपन\n",
1150
+ "980: �ॅण्ड कंपनी (\n",
1151
+ "981: ुणे\n",
1152
+ "982: सं�\n",
1153
+ "983: �र\n",
1154
+ "984: ा ब\n",
1155
+ "985: ्या आहेत. �\n",
1156
+ "986: ाहित\n",
1157
+ "987: समो\n",
1158
+ "988: समोर आ\n",
1159
+ "989: समोर आल\n",
1160
+ "990: ीर �\n",
1161
+ "991: ल्�\n",
1162
+ "992: ंड\n",
1163
+ "993: ाने\n",
1164
+ "994: ५ कोट\n",
1165
+ "995: ी रक्कम\n",
1166
+ "996: ऑफ\n",
1167
+ "997: मह\n",
1168
+ "998: ाराष्ट्र\n",
1169
+ "999: गुंतवणुक\n"
1170
+ ]
1171
+ }
1172
+ ],
1173
+ "source": [
1174
+ "for token_id in vocab:\n",
1175
+ " print(f\"{token_id}: {vocab[token_id].decode('utf-8', errors='replace')}\")\n"
1176
+ ]
1177
+ },
1178
+ {
1179
+ "cell_type": "code",
1180
+ "execution_count": 8,
1181
+ "metadata": {},
1182
+ "outputs": [
1183
+ {
1184
+ "name": "stdout",
1185
+ "output_type": "stream",
1186
+ "text": [
1187
+ "0: \u0000\n",
1188
+ "1: \u0001\n",
1189
+ "2: \u0002\n",
1190
+ "3: \u0003\n",
1191
+ "4: \u0004\n",
1192
+ "5: \u0005\n",
1193
+ "6: \u0006\n",
1194
+ "7: \u0007\n",
1195
+ "8:\n",
1196
+ "9: \t\n",
1197
+ "10: \n",
1198
+ "\n",
1199
+ "11: \u000b\n",
1200
+ "12: \f\n",
1201
+ "13: \n",
1202
+ "14: \u000e\n",
1203
+ "15: \u000f\n",
1204
+ "16: \u0010\n",
1205
+ "17: \u0011\n",
1206
+ "18: \u0012\n",
1207
+ "19: \u0013\n",
1208
+ "20: \u0014\n",
1209
+ "21: \u0015\n",
1210
+ "22: \u0016\n",
1211
+ "23: \u0017\n",
1212
+ "24: \u0018\n",
1213
+ "25: \u0019\n",
1214
+ "26: \u001a\n",
1215
+ "27: \u001b\n",
1216
+ "28: \u001c\n",
1217
+ "29: \u001d\n",
1218
+ "30: \u001e\n",
1219
+ "31: \u001f\n",
1220
+ "32: \n",
1221
+ "33: !\n",
1222
+ "34: \"\n",
1223
+ "35: #\n",
1224
+ "36: $\n",
1225
+ "37: %\n",
1226
+ "38: &\n",
1227
+ "39: '\n",
1228
+ "40: (\n",
1229
+ "41: )\n",
1230
+ "42: *\n",
1231
+ "43: +\n",
1232
+ "44: ,\n",
1233
+ "45: -\n",
1234
+ "46: .\n",
1235
+ "47: /\n",
1236
+ "48: 0\n",
1237
+ "49: 1\n",
1238
+ "50: 2\n",
1239
+ "51: 3\n",
1240
+ "52: 4\n",
1241
+ "53: 5\n",
1242
+ "54: 6\n",
1243
+ "55: 7\n",
1244
+ "56: 8\n",
1245
+ "57: 9\n",
1246
+ "58: :\n",
1247
+ "59: ;\n",
1248
+ "60: <\n",
1249
+ "61: =\n",
1250
+ "62: >\n",
1251
+ "63: ?\n",
1252
+ "64: @\n",
1253
+ "65: A\n",
1254
+ "66: B\n",
1255
+ "67: C\n",
1256
+ "68: D\n",
1257
+ "69: E\n",
1258
+ "70: F\n",
1259
+ "71: G\n",
1260
+ "72: H\n",
1261
+ "73: I\n",
1262
+ "74: J\n",
1263
+ "75: K\n",
1264
+ "76: L\n",
1265
+ "77: M\n",
1266
+ "78: N\n",
1267
+ "79: O\n",
1268
+ "80: P\n",
1269
+ "81: Q\n",
1270
+ "82: R\n",
1271
+ "83: S\n",
1272
+ "84: T\n",
1273
+ "85: U\n",
1274
+ "86: V\n",
1275
+ "87: W\n",
1276
+ "88: X\n",
1277
+ "89: Y\n",
1278
+ "90: Z\n",
1279
+ "91: [\n",
1280
+ "92: \\\n",
1281
+ "93: ]\n",
1282
+ "94: ^\n",
1283
+ "95: _\n",
1284
+ "96: `\n",
1285
+ "97: a\n",
1286
+ "98: b\n",
1287
+ "99: c\n",
1288
+ "100: d\n",
1289
+ "101: e\n",
1290
+ "102: f\n",
1291
+ "103: g\n",
1292
+ "104: h\n",
1293
+ "105: i\n",
1294
+ "106: j\n",
1295
+ "107: k\n",
1296
+ "108: l\n",
1297
+ "109: m\n",
1298
+ "110: n\n",
1299
+ "111: o\n",
1300
+ "112: p\n",
1301
+ "113: q\n",
1302
+ "114: r\n",
1303
+ "115: s\n",
1304
+ "116: t\n",
1305
+ "117: u\n",
1306
+ "118: v\n",
1307
+ "119: w\n",
1308
+ "120: x\n",
1309
+ "121: y\n",
1310
+ "122: z\n",
1311
+ "123: {\n",
1312
+ "124: |\n",
1313
+ "125: }\n",
1314
+ "126: ~\n",
1315
+ "127: \n",
1316
+ "128: <byte 128>\n",
1317
+ "129: <byte 129>\n",
1318
+ "130: <byte 130>\n",
1319
+ "131: <byte 131>\n",
1320
+ "132: <byte 132>\n",
1321
+ "133: <byte 133>\n",
1322
+ "134: <byte 134>\n",
1323
+ "135: <byte 135>\n",
1324
+ "136: <byte 136>\n",
1325
+ "137: <byte 137>\n",
1326
+ "138: <byte 138>\n",
1327
+ "139: <byte 139>\n",
1328
+ "140: <byte 140>\n",
1329
+ "141: <byte 141>\n",
1330
+ "142: <byte 142>\n",
1331
+ "143: <byte 143>\n",
1332
+ "144: <byte 144>\n",
1333
+ "145: <byte 145>\n",
1334
+ "146: <byte 146>\n",
1335
+ "147: <byte 147>\n",
1336
+ "148: <byte 148>\n",
1337
+ "149: <byte 149>\n",
1338
+ "150: <byte 150>\n",
1339
+ "151: <byte 151>\n",
1340
+ "152: <byte 152>\n",
1341
+ "153: <byte 153>\n",
1342
+ "154: <byte 154>\n",
1343
+ "155: <byte 155>\n",
1344
+ "156: <byte 156>\n",
1345
+ "157: <byte 157>\n",
1346
+ "158: <byte 158>\n",
1347
+ "159: <byte 159>\n",
1348
+ "160: <byte 160>\n",
1349
+ "161: <byte 161>\n",
1350
+ "162: <byte 162>\n",
1351
+ "163: <byte 163>\n",
1352
+ "164: <byte 164>\n",
1353
+ "165: <byte 165>\n",
1354
+ "166: <byte 166>\n",
1355
+ "167: <byte 167>\n",
1356
+ "168: <byte 168>\n",
1357
+ "169: <byte 169>\n",
1358
+ "170: <byte 170>\n",
1359
+ "171: <byte 171>\n",
1360
+ "172: <byte 172>\n",
1361
+ "173: <byte 173>\n",
1362
+ "174: <byte 174>\n",
1363
+ "175: <byte 175>\n",
1364
+ "176: <byte 176>\n",
1365
+ "177: <byte 177>\n",
1366
+ "178: <byte 178>\n",
1367
+ "179: <byte 179>\n",
1368
+ "180: <byte 180>\n",
1369
+ "181: <byte 181>\n",
1370
+ "182: <byte 182>\n",
1371
+ "183: <byte 183>\n",
1372
+ "184: <byte 184>\n",
1373
+ "185: <byte 185>\n",
1374
+ "186: <byte 186>\n",
1375
+ "187: <byte 187>\n",
1376
+ "188: <byte 188>\n",
1377
+ "189: <byte 189>\n",
1378
+ "190: <byte 190>\n",
1379
+ "191: <byte 191>\n",
1380
+ "192: <byte 192>\n",
1381
+ "193: <byte 193>\n",
1382
+ "194: <byte 194>\n",
1383
+ "195: <byte 195>\n",
1384
+ "196: <byte 196>\n",
1385
+ "197: <byte 197>\n",
1386
+ "198: <byte 198>\n",
1387
+ "199: <byte 199>\n",
1388
+ "200: <byte 200>\n",
1389
+ "201: <byte 201>\n",
1390
+ "202: <byte 202>\n",
1391
+ "203: <byte 203>\n",
1392
+ "204: <byte 204>\n",
1393
+ "205: <byte 205>\n",
1394
+ "206: <byte 206>\n",
1395
+ "207: <byte 207>\n",
1396
+ "208: <byte 208>\n",
1397
+ "209: <byte 209>\n",
1398
+ "210: <byte 210>\n",
1399
+ "211: <byte 211>\n",
1400
+ "212: <byte 212>\n",
1401
+ "213: <byte 213>\n",
1402
+ "214: <byte 214>\n",
1403
+ "215: <byte 215>\n",
1404
+ "216: <byte 216>\n",
1405
+ "217: <byte 217>\n",
1406
+ "218: <byte 218>\n",
1407
+ "219: <byte 219>\n",
1408
+ "220: <byte 220>\n",
1409
+ "221: <byte 221>\n",
1410
+ "222: <byte 222>\n",
1411
+ "223: <byte 223>\n",
1412
+ "224: <byte 224>\n",
1413
+ "225: <byte 225>\n",
1414
+ "226: <byte 226>\n",
1415
+ "227: <byte 227>\n",
1416
+ "228: <byte 228>\n",
1417
+ "229: <byte 229>\n",
1418
+ "230: <byte 230>\n",
1419
+ "231: <byte 231>\n",
1420
+ "232: <byte 232>\n",
1421
+ "233: <byte 233>\n",
1422
+ "234: <byte 234>\n",
1423
+ "235: <byte 235>\n",
1424
+ "236: <byte 236>\n",
1425
+ "237: <byte 237>\n",
1426
+ "238: <byte 238>\n",
1427
+ "239: <byte 239>\n",
1428
+ "240: <byte 240>\n",
1429
+ "241: <byte 241>\n",
1430
+ "242: <byte 242>\n",
1431
+ "243: <byte 243>\n",
1432
+ "244: <byte 244>\n",
1433
+ "245: <byte 245>\n",
1434
+ "246: <byte 246>\n",
1435
+ "247: <byte 247>\n",
1436
+ "248: <byte 248>\n",
1437
+ "249: <byte 249>\n",
1438
+ "250: <byte 250>\n",
1439
+ "251: <byte 251>\n",
1440
+ "252: <byte 252>\n",
1441
+ "253: <byte 253>\n",
1442
+ "254: <byte 254>\n",
1443
+ "255: <byte 255>\n",
1444
+ "259: ा\n",
1445
+ "261: ्\n",
1446
+ "263: े\n",
1447
+ "264: ी\n",
1448
+ "265: र\n",
1449
+ "266: ्य\n",
1450
+ "268: ि\n",
1451
+ "271: ल\n",
1452
+ "272: त\n",
1453
+ "273: क\n",
1454
+ "276: ण\n",
1455
+ "277: ु\n",
1456
+ "278: ो\n",
1457
+ "279: क\n",
1458
+ "280: स\n",
1459
+ "281: न\n",
1460
+ "282: ार\n",
1461
+ "283: म\n",
1462
+ "285: ्र\n",
1463
+ "286: व\n",
1464
+ "288: ह\n",
1465
+ "294: ध\n",
1466
+ "295: स\n",
1467
+ "296: य\n",
1468
+ "299: ेल\n",
1469
+ "301: ात\n",
1470
+ "302: च\n",
1471
+ "306: ाव\n",
1472
+ "307: ान\n",
1473
+ "308: ाम\n",
1474
+ "311: द\n",
1475
+ "312: ्यात\n",
1476
+ "314: ाल\n",
1477
+ "315: ांन\n",
1478
+ "316: रण\n",
1479
+ "317: ्याच\n",
1480
+ "318: िक\n",
1481
+ "319: ग\n",
1482
+ "321: श\n",
1483
+ "323: ्ह\n",
1484
+ "324: ाच\n",
1485
+ "325: प\n",
1486
+ "326: ंत\n",
1487
+ "327: ज\n",
1488
+ "328: व\n",
1489
+ "329: ास\n",
1490
+ "330: ून\n",
1491
+ "331: क्ष\n",
1492
+ "332: ाग\n",
1493
+ "333: ड\n",
1494
+ "335: ील\n",
1495
+ "336: ध्य\n",
1496
+ "339: ी क\n",
1497
+ "341: आ\n",
1498
+ "343: े क\n",
1499
+ "344: ाय\n",
1500
+ "345: ीच\n",
1501
+ "346: िल\n",
1502
+ "347: ०\n",
1503
+ "348: त\n",
1504
+ "350: म\n",
1505
+ "351: ी स\n",
1506
+ "353: ्व\n",
1507
+ "354: ाह\n",
1508
+ "356: र\n",
1509
+ "357: ब\n",
1510
+ "358: ुन\n",
1511
+ "361: ा पर\n",
1512
+ "362: भ\n",
1513
+ "363: ाख\n",
1514
+ "364: ीन\n",
1515
+ "365: ्यान\n",
1516
+ "366: गार\n",
1517
+ "367: िम\n",
1518
+ "369: ट\n",
1519
+ "371: ू\n",
1520
+ "372: ंद\n",
1521
+ "373: करण\n",
1522
+ "374: ांच\n",
1523
+ "375: ेळ\n",
1524
+ "376: ाठ\n",
1525
+ "377: ित\n",
1526
+ "378: घ\n",
1527
+ "379: ामगार\n",
1528
+ "381: ी म\n",
1529
+ "383: ्थ\n",
1530
+ "384: अ\n",
1531
+ "385: ळ\n",
1532
+ "386: १\n",
1533
+ "390: केल\n",
1534
+ "391: प\n",
1535
+ "393: ाण\n",
1536
+ "394: ी व\n",
1537
+ "395: े स\n",
1538
+ "397: ाज\n",
1539
+ "398: पर\n",
1540
+ "399: ब\n",
1541
+ "400: ोट\n",
1542
+ "401: ाळ\n",
1543
+ "402: ्ट\n",
1544
+ "403: ृ\n",
1545
+ "404: िय\n",
1546
+ "405: स्त\n",
1547
+ "406: कर\n",
1548
+ "407: ी त\n",
1549
+ "409: ष\n",
1550
+ "410: ी अ\n",
1551
+ "411: िस\n",
1552
+ "414: ग\n",
1553
+ "415: ्यांच\n",
1554
+ "416: ुर\n",
1555
+ "418: ेश\n",
1556
+ "419: क्र\n",
1557
+ "420: े आ\n",
1558
+ "421: ुड\n",
1559
+ "422: ुडघ\n",
1560
+ "423: कामगार\n",
1561
+ "424: ए\n",
1562
+ "425: २\n",
1563
+ "426: े द\n",
1564
+ "431: ी न\n",
1565
+ "432: ज\n",
1566
+ "433: (\n",
1567
+ "434: आण\n",
1568
+ "436: फ\n",
1569
+ "437: ह\n",
1570
+ "439: ोन\n",
1571
+ "440: ्थान\n",
1572
+ "441: ्थानिक\n",
1573
+ "442: श\n",
1574
+ "445: ा क\n",
1575
+ "446: िल्ह\n",
1576
+ "447: य\n",
1577
+ "448: क्क\n",
1578
+ "449: ेव\n",
1579
+ "450: न\n",
1580
+ "452: िव\n",
1581
+ "453: दार\n",
1582
+ "454: ाद\n",
1583
+ "455: ्ण\n",
1584
+ "456: ाढ\n",
1585
+ "457: द\n",
1586
+ "458: ा प्र\n",
1587
+ "459: ंग\n",
1588
+ "460: केळ\n",
1589
+ "461: र्च\n",
1590
+ "462: ॉ\n",
1591
+ "463: साय\n",
1592
+ "466: ै\n",
1593
+ "470: कार\n",
1594
+ "471: े म\n",
1595
+ "472: ी य\n",
1596
+ "473: प्र\n",
1597
+ "474: ोड\n",
1598
+ "475: ोग\n",
1599
+ "476: वि\n",
1600
+ "477: ्युन\n",
1601
+ "478: ोक\n",
1602
+ "479: ख\n",
1603
+ "480: ंत्र\n",
1604
+ "481: ी ज\n",
1605
+ "482: ्यास\n",
1606
+ "483: क्रिय\n",
1607
+ "484: ्थानिक कामगार\n",
1608
+ "485: ए\n",
1609
+ "486: ोसाय\n",
1610
+ "487: ोसायट\n",
1611
+ "488: २०\n",
1612
+ "490: ाध\n",
1613
+ "492: ीत\n",
1614
+ "493: ी र\n",
1615
+ "496: ृत\n",
1616
+ "497: ी केल\n",
1617
+ "498: ्यानंत\n",
1618
+ "500: १\n",
1619
+ "501: ुक\n",
1620
+ "502: ाब\n",
1621
+ "505: ा स\n",
1622
+ "507: ्युनिस\n",
1623
+ "509: ंद्र\n",
1624
+ "510: ुग\n",
1625
+ "511: ुग्ण\n",
1626
+ "513: कार\n",
1627
+ "515: ूर\n",
1628
+ "516: ा न\n",
1629
+ "517: ीस\n",
1630
+ "518: ंज\n",
1631
+ "520: ्हण\n",
1632
+ "522: र ज\n",
1633
+ "523: ाश\n",
1634
+ "524: ूम\n",
1635
+ "525: , स\n",
1636
+ "526: आणि\n",
1637
+ "527: ठ\n",
1638
+ "529: करण\n",
1639
+ "530: को\n",
1640
+ "531: ांड\n",
1641
+ "533: ुट\n",
1642
+ "534: ्यंत\n",
1643
+ "535: त्त\n",
1644
+ "536: ाड\n",
1645
+ "537: ेथ\n",
1646
+ "541: ौ\n",
1647
+ "542: े व\n",
1648
+ "543: े प\n",
1649
+ "544: विण\n",
1650
+ "545: ाप\n",
1651
+ "546: ेंद्र\n",
1652
+ "547: ी ल\n",
1653
+ "548: ण्यात\n",
1654
+ "551: स्त्र\n",
1655
+ "552: स्त्रक्रिय\n",
1656
+ "554: श्च\n",
1657
+ "555: ्यातील\n",
1658
+ "556: मीन\n",
1659
+ "559: ारण\n",
1660
+ "560: ावर\n",
1661
+ "561: वि\n",
1662
+ "562: े दाख\n",
1663
+ "563: ावल\n",
1664
+ "564: र्भ\n",
1665
+ "565: राव\n",
1666
+ "567: ागण\n",
1667
+ "569: कोट\n",
1668
+ "570: ुप\n",
1669
+ "571: ुपय\n",
1670
+ "572: झाल\n",
1671
+ "576: नि\n",
1672
+ "577: ेत\n",
1673
+ "579: ा उ\n",
1674
+ "580: ीव\n",
1675
+ "581: ी.\n",
1676
+ "582: ॅ\n",
1677
+ "583: ंप\n",
1678
+ "585: ्द\n",
1679
+ "587: घ\n",
1680
+ "588: ाष\n",
1681
+ "590: र व\n",
1682
+ "591: ल\n",
1683
+ "592: भाग\n",
1684
+ "593: सल\n",
1685
+ "594: ा व\n",
1686
+ "595: ुरू\n",
1687
+ "596: उ\n",
1688
+ "597: िश\n",
1689
+ "598: ुद\n",
1690
+ "599: ख\n",
1691
+ "601: ्याप\n",
1692
+ "602: ा त\n",
1693
+ "603: ांम\n",
1694
+ "604: े,\n",
1695
+ "605: ी द\n",
1696
+ "606: ्याची अ\n",
1697
+ "608: ेच\n",
1698
+ "609: ्यांन\n",
1699
+ "611: º\n",
1700
+ "612: ºय\n",
1701
+ "614: जुर\n",
1702
+ "615: कोर\n",
1703
+ "616: कोर��न\n",
1704
+ "617: काम\n",
1705
+ "618: ्प\n",
1706
+ "619: सह\n",
1707
+ "620: सहकार\n",
1708
+ "621: ्या\n",
1709
+ "622: ते\n",
1710
+ "625: सोसायट\n",
1711
+ "626: भास\n",
1712
+ "627: भासद\n",
1713
+ "628: र्व\n",
1714
+ "629: ांत\n",
1715
+ "630: करण्याच\n",
1716
+ "631: े केल\n",
1717
+ "633: ़\n",
1718
+ "634: रव\n",
1719
+ "635: ्यव\n",
1720
+ "638: ी असत\n",
1721
+ "639: र्म\n",
1722
+ "640: ी सम\n",
1723
+ "642: िन\n",
1724
+ "643: ंध\n",
1725
+ "645: , त\n",
1726
+ "647: ी (\n",
1727
+ "648: ुण\n",
1728
+ "649: न्स\n",
1729
+ "650: र आ\n",
1730
+ "651: ६\n",
1731
+ "652: ५\n",
1732
+ "653: पर\n",
1733
+ "654: ानग\n",
1734
+ "655: ाष्ट\n",
1735
+ "656: ७\n",
1736
+ "657: रात\n",
1737
+ "660: ी श\n",
1738
+ "661: मूद\n",
1739
+ "662: ात्र\n",
1740
+ "663: पास\n",
1741
+ "666: आल\n",
1742
+ "669: िच\n",
1743
+ "670: णार\n",
1744
+ "671: ी प\n",
1745
+ "673: \n",
1746
+ "\n",
1747
+ "\n",
1748
+ "674: ा द\n",
1749
+ "675: ोल\n",
1750
+ "676: लेल\n",
1751
+ "677: सर\n",
1752
+ "678: धील\n",
1753
+ "679: डक\n",
1754
+ "680: '\n",
1755
+ "681: शि\n",
1756
+ "682: ्ध\n",
1757
+ "684: द्य\n",
1758
+ "686: केंद्र\n",
1759
+ "687: ्याची अक्क\n",
1760
+ "688: ्याची अक्कल\n",
1761
+ "689: गुडघ\n",
1762
+ "691: त्यार\n",
1763
+ "693: त्यारोपण\n",
1764
+ "694: ी ग\n",
1765
+ "695: ण्याच\n",
1766
+ "696: र्ण\n",
1767
+ "697: क्य\n",
1768
+ "698: ाधिक\n",
1769
+ "699: पी\n",
1770
+ "701: ाºय\n",
1771
+ "702: ाट\n",
1772
+ "703: एक\n",
1773
+ "704: एकर ज\n",
1774
+ "705: एकर जमीन\n",
1775
+ "707: ्यक्त\n",
1776
+ "708: ्याम\n",
1777
+ "711: ंटे\n",
1778
+ "712: ंटेन\n",
1779
+ "713: ंटेनर\n",
1780
+ "715: ंटेनरमध्ये भ\n",
1781
+ "716: श्चिम\n",
1782
+ "717: श्चिम ब\n",
1783
+ "718: श्चिम बंग\n",
1784
+ "719: श्चिम बंगाल\n",
1785
+ "722: े कामगार\n",
1786
+ "724: ा प्राद\n",
1787
+ "725: ा प्रादु\n",
1788
+ "726: ा प्रादुर्भ\n",
1789
+ "727: ा प्रादुर्भाव\n",
1790
+ "728: ाखळ\n",
1791
+ "729: ून त\n",
1792
+ "735: ्ल\n",
1793
+ "736: २००\n",
1794
+ "737: या क\n",
1795
+ "738: ्याच्या क\n",
1796
+ "739: भाग\n",
1797
+ "741: ांनी त\n",
1798
+ "743: ुन्ह\n",
1799
+ "744: ुन्हे दाख\n",
1800
+ "745: ुन्हे दाखल\n",
1801
+ "746: ी मागण\n",
1802
+ "747: ्याकड\n",
1803
+ "748: ी रुपय\n",
1804
+ "749: ांनी क\n",
1805
+ "750: ाई\n",
1806
+ "751: ष्ट\n",
1807
+ "755: ी नव\n",
1808
+ "756: कृत\n",
1809
+ "757: ी समित\n",
1810
+ "758: ण त\n",
1811
+ "760: ोव\n",
1812
+ "761: जिल्ह\n",
1813
+ "762: ा उप\n",
1814
+ "763: मो\n",
1815
+ "764: हव\n",
1816
+ "765: हवाल\n",
1817
+ "766: भूम\n",
1818
+ "767: भूमीव\n",
1819
+ "768: नाश\n",
1820
+ "769: नाशिक\n",
1821
+ "770: अ\n",
1822
+ "771: ोळ\n",
1823
+ "772: ॅण\n",
1824
+ "774: ॅण्ड\n",
1825
+ "775: ुळ\n",
1826
+ "776: ोटिस\n",
1827
+ "777: ी. स\n",
1828
+ "778: ंब\n",
1829
+ "779: ंभ\n",
1830
+ "781: ंच\n",
1831
+ "782: क्कम\n",
1832
+ "783: वानग\n",
1833
+ "784: ऑ\n",
1834
+ "785: ाष्ट्र\n",
1835
+ "786: मध्य\n",
1836
+ "787: गु\n",
1837
+ "788: गुंत\n",
1838
+ "789: गुंतव\n",
1839
+ "790: गुंतवण\n",
1840
+ "792: र्ष\n",
1841
+ "793: े न\n",
1842
+ "794: नाह\n",
1843
+ "795: लाख\n",
1844
+ "796: परत\n",
1845
+ "797: सार\n",
1846
+ "798: ोग्य\n",
1847
+ "799: री\n",
1848
+ "800: त्र\n",
1849
+ "802: करण्यात\n",
1850
+ "803: सुरू\n",
1851
+ "804: ्यामुळ\n",
1852
+ "805: ागत\n",
1853
+ "806: ा ल\n",
1854
+ "808: ट\n",
1855
+ "809: धान\n",
1856
+ "810: ००\n",
1857
+ "811: १९\n",
1858
+ "814: ुद्र\n",
1859
+ "815: १०\n",
1860
+ "818: मान\n",
1861
+ "822: े प्र\n",
1862
+ "823: इ\n",
1863
+ "824: ुख\n",
1864
+ "827: ी घ\n",
1865
+ "830: ीठ\n",
1866
+ "831: ोम\n",
1867
+ "832: न व\n",
1868
+ "833: ुश\n",
1869
+ "834: ैल\n",
1870
+ "843: ोह\n",
1871
+ "844: ीय\n",
1872
+ "845: ांस\n",
1873
+ "846: वाढ\n",
1874
+ "847: ी असल\n",
1875
+ "848: ुटण्यात\n",
1876
+ "849: ा ज\n",
1877
+ "850: . त\n",
1878
+ "851: म्हण\n",
1879
+ "852: खर्च\n",
1880
+ "854: ुढ\n",
1881
+ "855: ासन\n",
1882
+ "856: शस्त्रक्रिय\n",
1883
+ "860: रक\n",
1884
+ "861: वड\n",
1885
+ "863: ींन\n",
1886
+ "864: स्व\n",
1887
+ "866: ीड\n",
1888
+ "870: कराव\n",
1889
+ "871: ण्यास\n",
1890
+ "872: राज\n",
1891
+ "873: राठ\n",
1892
+ "874: राठोड\n",
1893
+ "875: वार\n",
1894
+ "876: -\n",
1895
+ "877: रो\n",
1896
+ "878: रोध\n",
1897
+ "880: कॉ\n",
1898
+ "881: ि क\n",
1899
+ "882: ंटेनरमध्ये भरण\n",
1900
+ "884: ी, अश\n",
1901
+ "887: े काम\n",
1902
+ "889: डच\n",
1903
+ "890: डचण\n",
1904
+ "891: राज\n",
1905
+ "892: कोरोना प्रादुर्भाव\n",
1906
+ "900: ई\n",
1907
+ "901: सहकारी स\n",
1908
+ "902: २००१\n",
1909
+ "903: २००१ ते\n",
1910
+ "904: २००१ ते २०\n",
1911
+ "905: ११\n",
1912
+ "906: या काल\n",
1913
+ "907: या कालाव\n",
1914
+ "908: या कालावध\n",
1915
+ "909: ीत लेखा परीक्षण\n",
1916
+ "910: सहकार वि\n",
1917
+ "911: सहकार विभाग\n",
1918
+ "917: ोटीस\n",
1919
+ "918: ोटीस ब\n",
1920
+ "919: ोटीस बज\n",
1921
+ "921: ीच्या स\n",
1922
+ "922: भासदांनी त\n",
1923
+ "924: वार्ष\n",
1924
+ "925: वार्षिक\n",
1925
+ "926: सर्व\n",
1926
+ "927: ठ\n",
1927
+ "932: य़\n",
1928
+ "933: ी रुपयांच\n",
1929
+ "934: ा ग\n",
1930
+ "935: ैरव\n",
1931
+ "936: ैरव्यव\n",
1932
+ "937: ैरव्यवह\n",
1933
+ "938: ार झाल\n",
1934
+ "939: न्न\n",
1935
+ "940: काळ\n",
1936
+ "941: ायद\n",
1937
+ "943: कारव\n",
1938
+ "944: कारवाई\n",
1939
+ "946: ांचे म\n",
1940
+ "947: ांचे म्हण\n",
1941
+ "948: ांचे म्हणण\n",
1942
+ "951: ंम\n",
1943
+ "952: लब\n",
1944
+ "953: णी क\n",
1945
+ "954: ी नवनि\n",
1946
+ "955: ी नवनिर्म\n",
1947
+ "956: ी नवनिर्माण\n",
1948
+ "957: ी नवनिर्माण कृत\n",
1949
+ "958: ी नवनिर्माण कृती समित\n",
1950
+ "959: वी\n",
1951
+ "960: िद\n",
1952
+ "961: े य\n",
1953
+ "962: ांच्या न\n",
1954
+ "963: ा उपनि\n",
1955
+ "964: ा उपनिब\n",
1956
+ "965: ा उपनिबंध\n",
1957
+ "966: ा उपनिबंधक\n",
1958
+ "967: र जिल्ह\n",
1959
+ "968: ा य\n",
1960
+ "972: ्वभूमीव\n",
1961
+ "973: ार ब\n",
1962
+ "975: गर\n",
1963
+ "981: ुणे\n",
1964
+ "984: ा ब\n",
1965
+ "986: ाहित\n",
1966
+ "987: समो\n",
1967
+ "988: समोर आ\n",
1968
+ "989: समोर आल\n",
1969
+ "992: ंड\n",
1970
+ "993: ाने\n",
1971
+ "994: ५ कोट\n",
1972
+ "995: ी रक्कम\n",
1973
+ "996: ऑफ\n",
1974
+ "997: मह\n",
1975
+ "998: ाराष्ट्र\n",
1976
+ "999: गुंतवणुक\n"
1977
+ ]
1978
+ }
1979
+ ],
1980
+ "source": [
1981
+ "# Print the vocab's values in devanagari\n",
1982
+ "for idx, value in vocab.items():\n",
1983
+ " try:\n",
1984
+ " print(f\"{idx}: {value.decode('utf-8')}\")\n",
1985
+ " except UnicodeDecodeError:\n",
1986
+ " # Handle single bytes that aren't valid UTF-8\n",
1987
+ " if len(value) == 1:\n",
1988
+ " print(f\"{idx}: <byte {value[0]}>\")"
1989
+ ]
1990
+ },
1991
+ {
1992
+ "cell_type": "code",
1993
+ "execution_count": null,
1994
+ "metadata": {},
1995
+ "outputs": [],
1996
+ "source": []
1997
+ }
1998
+ ],
1999
+ "metadata": {
2000
+ "kernelspec": {
2001
+ "display_name": "Python 3",
2002
+ "language": "python",
2003
+ "name": "python3"
2004
+ },
2005
+ "language_info": {
2006
+ "codemirror_mode": {
2007
+ "name": "ipython",
2008
+ "version": 3
2009
+ },
2010
+ "file_extension": ".py",
2011
+ "mimetype": "text/x-python",
2012
+ "name": "python",
2013
+ "nbconvert_exporter": "python",
2014
+ "pygments_lexer": "ipython3",
2015
+ "version": "3.11.11"
2016
+ }
2017
+ },
2018
+ "nbformat": 4,
2019
+ "nbformat_minor": 2
2020
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:131414a77a054d1f78c7e8716779f2c2746a642cc4b18912ce1d4d0aa18bd0fa
3
+ size 48260675