Sistema baseado em barra razdel para frases russas e tokenização de palavras.
> >> 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 suporta Python 3.7+ e Pypy 3.
$ pip install razdelOs materiais estão em russo:
Infelizmente, não é uma maneira correta única de dividir o texto em frases e tokens. Por exemplo, pode -se dividir «Как же так?! Захар...» — воскликнут Пронин. Em três frases ["«Как же так?!", "Захар...»", "— воскликнут Пронин."] Enquanto razdel a divide em dois ["«Как же так?!", "Захар...» — воскликнут Пронин."] . Qual é a maneira correta do tokenizador т.е. ,? Pode -se dividir em т.|е. , razdel se divide em т|.|е|. .
razdel tenta imitar a segção desses 4 conjuntos de dados: Syntagrus, OpenCorpora, Gicrya e RNC. Esses conjuntos de dados consistem principalmente em notícias e ficção. As regras razdel são otimizadas para os tipos de textos. A biblioteca pode ter um desempenho pior em otomains, como mídia social, artigos científicos, documentos legais.
Medimos o número absoluto de erros. Existem muitos casos triviais na tarefa de tokenização. Por exemplo, texto чуть-чуть?! Não é não-transmitido, pode-se dividi-lo em чуть|-|чуть|?|! Enquanto a tokenização correta é чуть-чуть|?! , Esses exemplos são raros. A grande maioria dos casos é trivial, por exemplo, texto в 5 часов ... é tokenizada corretamente, mesmo via python nativo str.split в| |5| |часов| |... Devido ao grande número de casos triviais, a qualidade geral de todos os segmenadores é alta, é difícil comparar diferenciar entre o Examlpe 99,33%, 99,95%e 99,88%e 99,8%e 99,8%, por isso relatamos o número absoluto de erros.
errors - Número de erros por 1000 tokens/sentenças. Por exemplo, considere o Etalon Segtion é что-то|? , Previsão é что|-|то? , O número de erros é 3: 1 para a falta de divisão то? + 2 Para divisões extras что|-|то .
time - segundos levados para processar inteiros.
spacy_tokenize , aatimofeev e outros definidos em Naeval/segmento/models.py, para links para modelos Consulte o Registro Naeval. As tabelas são calculadas em Naeval/segmento/main.ipynb.
| Corpora | Syntag | Gicrya | Rnc | |||||
|---|---|---|---|---|---|---|---|---|
| Erros | Tempo | Erros | Tempo | Erros | Tempo | Erros | Tempo | |
| Re.findall ( w+| d+| p+) | 24 | 0,5 | 16 | 0,5 | 19 | 0,4 | 60 | 0,4 |
| Espaço | 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 |
| Mystem | 23 | 5.0 | 15 | 4.7 | 19 | 3.7 | 14 | 3.9 |
| Mosestokenizer | 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/space_russian_tokenizer | 17 | 48.7 | 4 | 51.1 | 5 | 39.5 | 20 | 52.2 |
| Koziev/RutoKenizer | 15 | 1.1 | 8 | 1.0 | 23 | 0,8 | 68 | 0,9 |
| Razdel.tokenize | 9 | 2.9 | 9 | 2.8 | 3 | 2.0 | 16 | 2.2 |
| Corpora | Syntag | Gicrya | Rnc | |||||
|---|---|---|---|---|---|---|---|---|
| Erros | Tempo | Erros | Tempo | Erros | Tempo | Erros | Tempo | |
| 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 |
| Mosestokenizer | 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.Sentenize | 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 .Teste
make test
make int # 2000 integration testsLiberar
# Update setup.py version
git commit -am ' Up version '
git tag v0.5.0
git push
git push --tags Erros do mystem no syntag
# see naeval/data
cat syntag_tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl diff --show moses_tokenize | lessTestes de token não viajantes
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.txtAtualize testes de integração
cd tests/data/
pv sents.txt | razdel-ctl up sentenize > t ; mv t sents.txt razdel e moses Diff
cat data/ * _tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl up tokenize | razdel-ctl diff moses_tokenize | less Performance razdel
cat data/ * _tokens.txt | razdel-ctl sample 10000 | pv -l | razdel-ctl gen | razdel-ctl diff tokenize | wc -l