razdel基于俄罗斯句子和单词令牌化的系统。
> >> 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支持Python 3.7+和PYPY 3。
$ pip install razdel材料在俄罗斯:
不幸的是,将文本分为句子和令牌不是单一的正确方法。例如,一个人可能会拆分«Как же так?! Захар...» — воскликнут Пронин.分为三个句子["«Как же так?!", "Захар...»", "— воскликнут Пронин."]而razdel将其分为两个["«Как же так?!", "Захар...» — воскликнут Пронин."] 。哪种归因是代币器的正确方法т.е. ?一个人可能会分为т.|е. , razdel分裂为т|.|е|. 。
razdel试图模仿这4个数据集:Syntagrus,Opencorpora,Gicrya和RNC。这些数据集主要包括新闻和小说。 razdel规则针对TH(类型的文本)进行了优化。图书馆在社交媒体,科学文章,法律文件等前沿上的表现可能更糟。
我们测量绝对数量的错误数。在令牌化任务中,有很多琐碎的情况。例如,发чуть-чуть?!不是非旅行,可以将其分成чуть|-|чуть|?|!虽然正确的令牌化чуть-чуть|?! ,这样的例子很少见。绝大多数情况都是微不足道的,例如в 5 часов ...即使是通过Python python str.split in в| |5| |часов| |...由于所有segmenators的琐碎案例的总体质量很高,因此很难比较审查的99.33%,99.95%和99.88%和99.8%和99.8%的审查,因此我们报告了错误的绝对数量。
errors - 每1000个令牌/句子的错误数。例如,考虑etalon segtion是что-то|? ,预测是что|-|то? ,错误的错误数为3:1 то? + 2额外分配что|-|то 。
time - 处理整个数据酶的秒。
spacy_tokenize , aatimofeev和其他A在Naeval/sement/models.py中定义的有关模型的链接,请参见Naeval注册表。表是在Naeval/sement/main.ipynb中计算的。
| 语料库 | 语法 | 吉克里亚 | RNC | |||||
|---|---|---|---|---|---|---|---|---|
| 错误 | 时间 | 错误 | 时间 | 错误 | 时间 | 错误 | 时间 | |
| re.findall( w+| d+| p+) | 24 | 0.5 | 16 | 0.5 | 19 | 0.4 | 60 | 0.4 |
| 空间 | 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 |
| 我的系统 | 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 |
| 语料库 | 语法 | 吉克里亚 | RNC | |||||
|---|---|---|---|---|---|---|---|---|
| 错误 | 时间 | 错误 | 时间 | 错误 | 时间 | 错误 | 时间 | |
| 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 |
开发环境
python -m venv ~ /.venvs/natasha-razdel
source ~ /.venvs/natasha-razdel/bin/activate
pip install -r requirements/dev.txt
pip install -e .测试
make test
make int # 2000 integration tests发布
# Update setup.py version
git commit -am ' Up version '
git tag v0.5.0
git push
git push --tags mystem syntag错误
# see naeval/data
cat syntag_tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl diff --show moses_tokenize | less非旅行令牌测试
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.txt更新集成测试
cd tests/data/
pv sents.txt | razdel-ctl up sentenize > t ; mv t sents.txt razdel和moses差异
cat data/ * _tokens.txt | razdel-ctl sample 1000 | razdel-ctl gen | razdel-ctl up tokenize | razdel-ctl diff moses_tokenize | less razdel性能
cat data/ * _tokens.txt | razdel-ctl sample 10000 | pv -l | razdel-ctl gen | razdel-ctl diff tokenize | wc -l