Système basé sur razdel -Rule pour la phrase russe et la tokenisation des mots.
> >> from razdel import tokenize
> >> tokens = list ( tokenize ( 'Кружка-термос на 0.5л (50/64 см³, 516;...)' ))
> >> tokens
[ Substring ( 0 , 13 , 'Кружка-термос' ),
Substring ( 14 , 16 , 'на' ),
Substring ( 17 , 20 , '0.5' ),
Substring ( 20 , 21 , 'л' ),
Substring ( 22 , 23 , '(' )
...]
>> > [ _ . text for _ in tokens ]
[ 'Кружка-термос' , 'на' , '0.5' , 'л' , '(' , '50/64' , 'см³' , ',' , '516' , ';' , '...' , ')' ] > >> from razdel import sentenize
> >> text = '''
... - "Так в чем же дело?" - "Не ра-ду-ют".
... И т. д. и т. п. В общем, вся газета
... '''
> >> list ( sentenize ( text ))
[ Substring ( 1 , 23 , '- "Так в чем же дело?"' ),
Substring ( 24 , 40 , '- "Не ра-ду-ют".' ),
Substring ( 41 , 56 , 'И т. д. и т. п.' ),
Substring ( 57 , 76 , 'В общем, вся газета' )] razdel prend en charge Python 3.7+ et Pypy 3.
$ pip install razdelLes matériaux sont en russe:
Malheureusement, il est pas un moyen correct de diviser le texte en phrases et en jetons. Par exemple, on peut diviser «Как же так?! Захар...» — воскликнут Пронин. En trois phrases ["«Как же так?!", "Захар...»", "— воскликнут Пронин."] Tandis que razdel le divise en deux ["«Как же так?!", "Захар...» — воскликнут Пронин."] . Quelle sera la bonne façon de tokenizer, т.е. ? On peut se diviser en т.|е. , razdel se divise en т|.|е|. .
razdel essaie d'imiter la ségtion de ces 4 ensembles de données: Syntagrus, OpenCorporca, Gicrya et RNC. Ces ensembles de données consistent principalement en des nouvelles et de la fiction. Les règles razdel sont optimisées pour les types de textes. La bibliothèque peut performer moins sur des otomaines comme les médias sociaux, les articles scientifiques, les documents juridiques.
Nous mesurons le nombre absolu d'erreurs. Il y a beaucoup de cas triviaux dans la tâche de tokenisation. Par exemple, le texte чуть-чуть?! N'est pas non traduit, on peut le diviser чуть|-|чуть|?|! Tandis que la tokenisation correcte est чуть-чуть|?! , De tels exemples sont rares. La grande majorité des cas sont triviaux, par exemple le texte в 5 часов ... est correctement tokenisé même via Python natif str.split в| |5| |часов| |... En raison du grand nombre de cas triviaux, la qualité globale de tous les ségmenteurs est élevé, il est difficile de comparer la différence entre pour l'examen 99,33%, 99,95% et 99,88%, et 99,8%, et 99,8%, nous rapportons donc le nombre absolu d'erreurs.
errors - Nombre d'erreurs par 1000 jetons / sentences. Par exemple, considérez la ségtion d'Etalon est что-то|? , La prédiction est что|-|то? , Le nombre d'erreurs est 3: 1 pour la scission manquante то? + 2 pour plus de divise что|-|то .
time - secondes prises pour traiter une base de données entière.
spacy_tokenize , aatimofeev et autres un défini dans Naeval / segment / modèles.py, pour les liens vers les modèles, voir le registre naeval. Les tableaux sont calculés dans Naeval / segment / main.ipynb.
| Corpus | Syntag | Gicrya | RNC | |||||
|---|---|---|---|---|---|---|---|---|
| Erreurs | Temps | Erreurs | Temps | Erreurs | Temps | Erreurs | Temps | |
| Re.findall ( w + | d + | p +) | 24 | 0,5 | 16 | 0,5 | 19 | 0.4 | 60 | 0.4 |
| Espace | 26 | 6.2 | 13 | 5.8 | 14 | 4.1 | 32 | 3.9 |
| nltk.word_tokenize | 60 | 3.4 | 256 | 3.3 | 75 | 2.7 | 199 | 2.9 |
| Mystère | 23 | 5.0 | 15 | 4.7 | 19 | 3.7 | 14 | 3.9 |
| Mosestokizer | 11 | 2.1 | 8 | 1.9 | 15 | 1.6 | 16 | 1.7 |
| Segtok.word_tokenize | 16 | 2.3 | 8 | 2.3 | 14 | 1.8 | 9 | 1.8 |
| Aatimofeev / spatial_russian_tokenizer | 17 | 48.7 | 4 | 51.1 | 5 | 39.5 | 20 | 52.2 |
| Koziev / Rutokedizer | 15 | 1.1 | 8 | 1.0 | 23 | 0.8 | 68 | 0.9 |
| Razdel.tokenise | 9 | 2.9 | 9 | 2.8 | 3 | 2.0 | 16 | 2.2 |
| Corpus | Syntag | Gicrya | RNC | |||||
|---|---|---|---|---|---|---|---|---|
| Erreurs | Temps | Erreurs | Temps | Erreurs | Temps | Erreurs | Temps | |
| Re.split ([.?! ...]) | 114 | 0.9 | 53 | 0.6 | 63 | 0.7 | 130 | 1.0 |
| segtok.split_single | 106 | 17.8 | 36 | 13.4 | 1001 | 1.1 | 912 | 2.8 |
| Mosestokizer | 238 | 8.9 | 182 | 5.7 | 80 | 6.4 | 287 | 7.4 |
| nltk.sent_tokenize | 92 | 10.1 | 36 | 5.3 | 44 | 5.6 | 183 | 8.9 |
| Deeppavlov / RusentTokenize | 57 | 10.9 | 10 | 7.9 | 56 | 6.8 | 119 | 7.0 |
| Razdel.entensize | 52 | 6.1 | 7 | 3.9 | 72 | 4.5 | 59 | 7.5 |
Dev Env
python -m venv ~ /.venvs/natasha-razdel
source ~ /.venvs/natasha-razdel/bin/activate
pip install -r requirements/dev.txt
pip install -e .Test
make test
make int # 2000 integration testsLibérer
# Update setup.py version
git commit -am ' Up version '
git tag v0.5.0
git push
git push --tags Erreurs mystem sur syntag
# see naeval/data
cat syntag_tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl diff --show moses_tokenize | lessTests de jeton non traviques
pv data/ * _tokens.txt | razdel-ctl gen --recall | razdel-ctl diff space_tokenize > tests.txt
pv data/ * _tokens.txt | razdel-ctl gen --precision | razdel-ctl diff re_tokenize >> tests.txtMettre à jour les tests d'intégration
cd tests/data/
pv sents.txt | razdel-ctl up sentenize > t ; mv t sents.txt razdel et moses Diff
cat data/ * _tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl up tokenize | razdel-ctl diff moses_tokenize | less razdel Performance
cat data/ * _tokens.txt | razdel-ctl sample 10000 | pv -l | razdel-ctl gen | razdel-ctl diff tokenize | wc -l