Package: naivenlp
naivenlpNLP常用工具包。主要包含以下模块：naivenlpInstallationTokenizersJiebaTokenizer的使用CustomTokenizer的使用BasicTokenizer的使用WordpieceTokenizer的使用TransformerTokenizer的使用BertTokenizer的使用Correctorsn-gram语言模型和词典纠错基于深度学习的纠错SimilarityStructuresTrie的使用UtilsDatasource下载搜狗词库Installationpipinstall-UnaivenlpInstall extra dependencies:pipinstallpycorrector
pipinstallgit+https://github.com/kpu/kenlm.gitTokenizersTokenizer的作用是分词， 同时具有把词语映射到ID的功能。naivenlp.tokenizers模块包含以下Tokenizer实现：JiebaTokenizer，继承自VocabBasedTokenizer，分词使用jiebaCustomTokenizer，继承自VocabBasedTokenizer，基于词典文件的Tokenizer，包装tokenize_fn自定义函数来实现各种自定义的TokenizerTransformerTokenizer，继承自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来分词为例。pipinstalllacfromnaivenlp.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模型的示例：>>>fromnaivenlp.correctorsimportTransformerCorrector
>>>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的包装。>>>importnaivenlp
>>>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常用的数据结构实现。目前支持：字典树TrieTrie的使用>>>importnaivenlp
>>>trie=naivenlp.Trie()>>>trie.put('上海市浦东新区')>>>trie.show().
+----上|+----海||+----市|||+----浦||||+----东|||||+----新||||||+----区
>>>trie.put('上海市黄浦区')>>>trie.show().
+----上|+----海||+----市|||+----浦||||+----东|||||+----新||||||+----区|||+----黄||||+----浦|||||+----区
>>>>>>forrintrie.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)