NLP工具包,包括标记化、序列标记等。

naivenlp的Python项目详细描述


naivenlp

Python packagePyPI versionPython

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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
二进制字符串的java NumberFormatExceprion   java如何在Neo4j中查找/匹配/选择标识符名称   java哪一年的日期与原始年份相同?   java什么时候JAXB可以用于Json而不是XML?   java使用PayPal权限API进行PayPal支付   java Getting error在使用安卓 vision api扫描二维码时加载图像失败   java直接突出显示RichTextFX中的一个文本范围   java Resolve@RegisteredAuth2AuthorizedClient,其令牌在spring Security 5.2的spring server之外获得。十、   yyyymmddhhmmss的Java正则表达式   java我试图将google recaptcha与spring mvc集成,但GreCaptCharResponse总是返回false。这里有一些代码   java使用JsonPath将文本转换为json   java无法解析符号。Maven依赖项已就位,但代码为红色   java使用循环查找范围内具有不同数字的数字   java这个SwingWorker是否不重用ThreadPoolExecutor中的线程?