NLP工具包,包括标记化、序列标记等。
naivenlp的Python项目详细描述
naivenlp
NLP常用工具包。
主要包含以下模块:
Installation
pip install -U naivenlp
Install extra dependencies:
pip install pycorrector pip install git+https://github.com/kpu/kenlm.git
Tokenizers
Tokenizer
的作用是分词, 同时具有把词语映射到ID的功能。
naivenlp.tokenizers
模块包含以下Tokenizer
实现:
JiebaTokenizer
,继承自VocabBasedTokenizer
,分词使用jieba
CustomTokenizer
,继承自VocabBasedTokenizer
,基于词典文件的Tokenizer
,包装tokenize_fn
自定义函数来实现各种自定义的Tokenizer
TransformerTokenizer
,继承自VocabBasedTokenizer
,用于Transformer
模型分词BertTokenizer
,继承自VocabBasedTokenizer
,用于BERT
模型分词
JiebaTokenizer的使用
分词过程使用jieba
。
fromnaivenlp.tokenizersimportJiebaTokenizertokenizer=JiebaTokenizer(vocab_file='vocab.txt',pad_token='[PAD]',unk_token='[UNK]',bos_token='[BOS]',eos_token='[EOS]',)tokenizer.tokenize('hello world!',mode=0,hmm=True)tokenizer.encode('hello world!',add_bos=False,add_eos=False)
CustomTokenizer的使用
方便用户自定义分词过程。
以使用baidu/lac
来分词为例。
pip install lac
fromnaivenlp.tokenizersimportCustomTokenizerfromLACimportLAClac=LAC(mode='seg')deflac_tokenize(text,**kwargs):returnlac.run(text)tokenizer=CustomTokenizer(vocab_file='vocab.txt',tokenize_fn=lac_tokenize,pad_token='[PAD]',unk_token='[UNK]',bos_token='[BOS]',eos_token='[EOS]',)tokenizer.tokenize('hello world!')tokenizer.encode('hello world!',add_bos=False,add_eos=False)
BasicTokenizer的使用
这个分词器的使用很简单。不需要词典。它会根据空格来分词。它有以下功能:
- 按照空格和特殊字符分词
- 根据设置,决定是否大小写转换
- 根据设置,切分汉字,按照字的粒度分词
fromnaivenlp.tokenizersimportBasicTokenizertokenizer=BasicTokenizer(do_lower_case=True,tokenize_chinese_chars=True)tokenizer.tokenize('hello world, 你好世界')
WordpieceTokenizer的使用
Wordpiece
是一种分词算法,具体请自己查询相关文档。
WordpieceTokenizer
需要传入一个词典map。
fromnaivenlp.tokenizersimportWordpieceTokenizertokenizer=WordpieceTokenizer(vocab=vocab,unk_token='[UNK]')tokenizer.tokenize('hello world, 你好世界')
TransformerTokenizer的使用
fromnaivenlp.tokenizersimportTransformerTokenizertokenizer=TransformerTokenizer(vocab_file='vocab.txt')tokenizer.tokenize('Hello World, 你好世界')tokenizer.encode('Hello World, 你好世界',add_bos=False,add_eos=False)
BertTokenizer的使用
fromnaivenlp.tokenizersimportBertTokenizertokenizer=BertTokenizer(vocab_file='vocab.txt',cls_token='[CLS]',sep_token='[SEP]',mask_token='[MASK]')tokenizer.tokenize('Hello World, 你好世界')tokenizer.encode('Hello World, 你好世界',add_bos=False,add_eos=False)
Correctors
文本纠错,包括传统的n-gram语言模型和词典的方式,也可以使用基于深度学习的方法。
n-gram语言模型和词典纠错
这里的KenLMCorrector
是对 shibing624/pycorrector 项目的包装。
fromnaivenlp.correctorsimportKenLMCorrectorc=KenLMCorrector()texts=['软件开发工成师','少先队员因该为老人让坐',]fortextintexts:print(c.correct(text))
可以得到纠错结果:
('软件开发工程师', [('工成师', '工程师', 4, 7)])('少先队员应该为老人让座', [('因该', '应该', 4, 6), ('坐', '座', 10, 11)])
基于深度学习的纠错
主要是利用seq2seq
模型完成纠错。例如:
RNN
+Attention
传统的seq2seq
模型Transformer
模型
模型的训练使用 OpenNMT-tf 库,训练方法请到此项目的文档查看。
以下是使用Transformer
模型的示例:
>>> from naivenlp.correctors import TransformerCorrector >>> SAVED_MODEL='/models/correction_models/transformer-step-2000'# 此处换成你自己训练的模型,SavedModel格式 >>> corrector= TransformerCorrector(SAVED_MODEL) >>> result, prob= corrector.correct('我最近每天晚上都会拧着鼻子去喝30cc的醋了。') >>> print('result: ', result) result: 我最近每天晚上都会拧着鼻子去喝30cc的醋。 >>> print(' prob: ', prob) prob: -6.088574 >>>
Similarity
多种字符串相似度的度量。是对luozhouyang/python-string-similarity的包装。
>>> import naivenlp >>> a='ACCTTTDEX' >>> b='CGGTTEEXX' >>> naivenlp.cosine_distance(a, b)1.0 >>> naivenlp.cosine_similarity(a, b)1.0 >>> naivenlp.jaccard_distance(a, b)1.0 >>> naivenlp.jaccard_similarity(a, b)0.0 >>> naivenlp.levenshtein_distance(a, b)5 >>> naivenlp.levenshtein_distance_normalized(a, b)0.5555555555555556 >>> naivenlp.levenshtein_similarity(a, b)0.4444444444444444 >>> naivenlp.weighted_levenshtein_distance(a, b)5.0 >>> naivenlp.damerau_distance(a, b)5 >>> naivenlp.lcs_distance(a, b)8 >>> naivenlp.lcs_length(a, b)5 >>> naivenlp.sorense_dice_distance(a, b)1.0 >>> naivenlp.sorense_dice_similarity(a, b)0.0 >>> naivenlp.optimal_string_alignment_distance(a, b)5 >>>
Structures
常用的数据结构实现。
目前支持:
- 字典树Trie
Trie的使用
>>> import naivenlp >>> trie= naivenlp.Trie() >>> trie.put('上海市浦东新区') >>> trie.show() . +----上 | +----海 || +----市 ||| +----浦 |||| +----东 ||||| +----新 |||||| +----区 >>> trie.put('上海市黄浦区') >>> trie.show() . +----上 | +----海 || +----市 ||| +----浦 |||| +----东 ||||| +----新 |||||| +----区 ||| +----黄 |||| +----浦 ||||| +----区 >>> >>> for r in trie.keys_with_prefix('上海市'): ... print(r) ... ['上', '海', '市', '浦', '东', '新', '区']['上', '海', '市', '黄', '浦', '区'] >>>
Utils
常用文本操作:
naivenlp.q2b(s)
全角转半角naivenlp.b2q(s)
半角转全角naivenlp.split_sentence(s)
把长文本切分成句子列表
Datasource
数据收集模块。目前支持:
- 下载所有的搜狗词库保存成文本文件
下载搜狗词库
fromnaivenlp.datasourcesimportsogouassg# 下载category_id=1下面所有的词典,保存到/tmp/sogousg.download_category(1,'/tmp/sogou')# 下载所有category保存到/tmp/sogousg.download_all_category('/tmp/sogou')# 把下载的所有文件合成一个文件sg.collect('/tmp/sogou','./sogou.vocab',maxlen=6)
- 项目
标签: