jiagu、snownlp、jieba对比

jiagu

import jiagu
dir(jiagu)
['__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 'analyze',
 'any',
 'cluster',
 'cut',
 'cws',
 'findword',
 'init',
 'keywords',
 'knowledge',
 'load_model',
 'load_userdict',
 'mmseg',
 'ner',
 'perceptron',
 'pos',
 'seg',
 'segment',
 'sentiment',
 'summarize',
 'text_cluster',
 'textrank',
 'utils']

jiagu分词/词性标注/命名体识别

text = '中国是个伟大的国家,有悠久的人文历史和美丽的自然风景。'
words_jia = jiagu.seg(text)
print('普通分词:{}'.format(words_jia))

jiagu.load_userdict(['人文历史','自然风景'])
words_jia = jiagu.seg(text)
print('使用自定义词典:{}'.format(words_jia))

pos_jia = jiagu.pos(words_jia)
print('词性标注:{}'.format(pos_jia))

ner_jia = jiagu.ner(words_jia)
print('命名体识别:{}'.format(ner_jia))
普通分词:['中国', '是', '个', '伟大', '的', '国家', ',', '有', '悠久', '的', '人文', '历史', '和', '美丽', '的', '自然', '风景', '。']
使用自定义词典:['中国', '是', '个', '伟大', '的', '国家', ',', '有', '悠久', '的', '人文历史', '和', '美丽', '的', '自然风景', '。']
词性标注:['ns', 'vl', 'q', 'a', 'u', 'n', 'w', 'v', 'a', 'u', 'n', 'c', 'a', 'u', 'n', 'w']
命名体识别:['B-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']

jiagu关键词提取

text_1 = '''
如果NBA复赛,没有球迷在现场观战,那么NBA可能会在一个中立场地进行比赛。萧华表示,NBA目前已经和多个联邦行政辖区进行联系,他们有兴趣在可行的情况下举办NBA剩余的比赛。“我们体育领域,从某种程度上来说,引领了这股关门风潮,我们很乐意成为经济重启的一部分。”尽管如此,萧华一再强调,健康问题仍然是最为重要的。
'''
keywords = jiagu.keywords(text_1, 5) 
print('关键词提取:{}'.format(keywords))
关键词提取:['NBA', '进行', '华', '最为', '重启']

jiagu文本摘要

summarys = jiagu.summarize(text_1, 1)
print('摘要提取:{}'.format(summarys))
摘要提取:['萧华表示,NBA目前已经和多个联邦行政辖区进行联系,他们有兴趣在可行的情况下举办NBA剩余的比赛。']

jiagu新词发现

jiagu.findword('input.txt', 'output.txt')

jiagu情感分析

# 短句的情感分析
print("短句的情感分析对比:")
text_2 = '中国是个国家'
print(jiagu.sentiment(text_2))
text_3 = '中国是个伟大的国家'
print(jiagu.sentiment(text_3))
text_4 = '中国是个特别伟大的国家'
print(jiagu.sentiment(text_4))
text_5 = '中国是个特别特别伟大的国家'
print(jiagu.sentiment(text_5))
print('----------------------------------')
text_6= '他是个娃娃'
print(jiagu.sentiment(text_6))
text_7= '他是个坏娃娃'
print(jiagu.sentiment(text_7))
text_8= '他是个特别坏的娃娃'
print(jiagu.sentiment(text_8))
text_9= '他是个特别坏特别坏的娃娃'
print(jiagu.sentiment(text_9))
短句的情感分析对比:
('positive', 0.61433420704697)
('positive', 0.7502516417532771)
('positive', 0.8110657430727961)
('positive', 0.8598380100371134)
----------------------------------
('negative', 0.5268881113343099)
('negative', 0.6586270942989488)
('negative', 0.7330309706687305)
('negative', 0.7689844775458575)
print("长句的情感分析")
text_long = '城管打人这种事是3方的责任,不能单独怪哪一方,所以老李的做法是对的'
print(jiagu.sentiment(text_long))
print(jiagu.sentiment(text_1))
长句的情感分析
('negative', 0.9904310868486728)
('negative', 0.9999994586055012)

snownlp

from snownlp import SnowNLP
dir(SnowNLP)
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'han',
 'idf',
 'keywords',
 'pinyin',
 'sentences',
 'sentiments',
 'sim',
 'summary',
 'tags',
 'tf',
 'words']

snownlp分词/词性标注/拼音/繁体

s = SnowNLP(text)
words_snow = s.words
tag_snow = s.tags
pinyin_snow = s.pinyin

text_fan = '中國是個偉大的國家,有悠久的人文歷史和美麗的自然風景'
s_fan = SnowNLP(text_fan)
han_snow = s_fan.han
print('分词:{}'.format(words_snow))
print('标注:{}'.format([x for x in s.tags]))
print('拼音:{}'.format(pinyin_snow))
print('繁体:{}'.format(han_snow))
分词:['中国', '是个', '伟大', '的', '国家', ',', '有', '悠久', '的', '人文', '历史', '和', '美丽', '的', '自然', '风景', '。']
标注:[('中国', 'ns'), ('是个', 'd'), ('伟大', 'a'), ('的', 'u'), ('国家', 'n'), (',', 'k'), ('有', 'v'), ('悠久', 'a'), ('的', 'u'), ('人文', 'n'), ('历史', 'n'), ('和', 'c'), ('美丽', 'a'), ('的', 'u'), ('自然', 'a'), ('风景', 'n'), ('。', 'w')]
拼音:['zhong', 'guo', 'shi', 'ge', 'wei', 'da', 'de', 'guo', 'jia', ',', 'you', 'you', 'jiu', 'de', 'ren', 'wen', 'li', 'shi', 'he', 'mei', '丽', 'de', 'Zi', 'ran', 'feng', 'jing', '。']
繁体:中国是个伟大的国家,有悠久的人文历史和美丽的自然风景

snownlp关键词提取 /摘要提取/分句

s = SnowNLP(text_1)
print('关键词提取:{}'.format(s.keywords(5)))
print('摘要提取:{}'.format(s.summary(1)))
关键词提取:['NBA', '比赛', '举办', '下', '情况']
摘要提取:['那么NBA可能会在一个中立场地进行比赛']

snownlp情感分析

# 短句的情感分析
print("短句的情感分析对比:")
s_2 = SnowNLP('中国是个国家')
print(s_2.sentiments)
s_3 = SnowNLP('中国是个伟大的国家')
print(s_3.sentiments)
s_4 = SnowNLP('中国是个特别伟大的国家')
print(s_4.sentiments)
s_5 = SnowNLP('中国是个特别特别伟大的国家')
print(s_5.sentiments)
print('----------------------------------')
s_6 = SnowNLP('他是个娃娃')
print(s_6.sentiments)
s_7 = SnowNLP('他是个坏娃娃')
print(s_7.sentiments)
s_8 = SnowNLP('他是个特别坏的娃娃')
print(s_8.sentiments)
s_9 = SnowNLP ('他是个特别坏特别坏的娃娃')
print(s_9.sentiments)
短句的情感分析对比:
0.8728697002957693
0.9251654813275408
0.9049709527124196
0.9296199977830963
----------------------------------
0.7499999999999999
0.5755448639236871
0.6528651688802549
0.5410827799493567
print("长句的情感分析")
text_long = '城管打人这种事是3方的责任,不能单独怪哪一方,所以老李的做法是对的'
s_10 = SnowNLP(text_long)
s_11 = SnowNLP(text_1)
print(s_10.sentiments)
print(s_11.sentiments)
text_long_1 = '外观看起来很好,就是快递太慢了,还得自己取货,手机电池不经用玩了一个小时斗地主就没电了,没有介绍的那么好,请慎重购买。手机死机,卡屏,屏幕没反应,电池不耐用'
s_12 = SnowNLP(text_long_1)
print(s_12.sentiments)
长句的情感分析
0.07552097579759087
0.9999999410019155
0.0009777685840687278

可以看出,与jiagu相比,snownlp的情感分析更准确。

jieba

import jieba
dir(jieba)
['DEFAULT_DICT',
 'DEFAULT_DICT_NAME',
 'DICT_WRITING',
 'PY2',
 'Tokenizer',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__license__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '__version__',
 '_compat',
 '_get_abs_path',
 '_lcut',
 '_lcut_all',
 '_lcut_for_search',
 '_lcut_for_search_no_hmm',
 '_lcut_no_hmm',
 '_pcut',
 '_pcut_for_search',
 '_replace_file',
 'absolute_import',
 'add_word',
 'calc',
 'check_paddle_install',
 'cut',
 'cut_for_search',
 'default_encoding',
 'default_logger',
 'del_word',
 'disable_parallel',
 'dt',
 'enable_paddle',
 'enable_parallel',
 'finalseg',
 'get_DAG',
 'get_FREQ',
 'get_dict_file',
 'get_module_res',
 'initialize',
 'iteritems',
 'iterkeys',
 'itervalues',
 'lcut',
 'lcut_for_search',
 'load_userdict',
 'log',
 'log_console',
 'logging',
 'marshal',
 'md5',
 'os',
 'pkg_resources',
 'pool',
 're',
 're_eng',
 're_han_default',
 're_skip_default',
 're_userdict',
 'resolve_filename',
 'setLogLevel',
 'set_dictionary',
 'strdecode',
 'string_types',
 'suggest_freq',
 'sys',
 'tempfile',
 'text_type',
 'threading',
 'time',
 'tokenize',
 'unicode_literals',
 'user_word_tag_tab',
 'xrange']

jieba分词

  • jieba.cut 方法接受四个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型;use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
    待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
  • jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
  • jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
    seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
    print("Paddle Mode: " + '/'.join(list(seg_list)))

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print("/".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print("/ ".join(seg_list))
Paddle enabled successfully......
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Smile\AppData\Local\Temp\jieba.cache


Paddle Mode: 我/来到/北京清华大学
Paddle Mode: 乒乓球/拍卖/完/了
Paddle Mode: 中国科学技术大学


Loading model cost 0.581 seconds.
Prefix dict has been built successfully.


Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他/来到/了/网易/杭研/大厦
小明/ 硕士/ 毕业/ 于/ 中国/ 科学/ 学院/ 科学院/ 中国科学院/ 计算/ 计算所/ ,/ 后/ 在/ 日本/ 京都/ 大学/ 日本京都大学/ 深造

jieba词性标注

import jieba
import jieba.posseg as pseg
words = pseg.cut("我爱北京胡同") #jieba默认模式
jieba.enable_paddle() #启动paddle模式。 0.40版之后开始支持,早期版本不支持
words = pseg.cut("我爱北京胡同",use_paddle=True) #paddle模式
for word, flag in words:
    print('%s %s' % (word, flag))
Paddle enabled successfully......


我 r
爱 v
北京 LOC
胡同 LOC

jieba关键词抽取

基于 TF-IDF 算法的关键词抽取

  • jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
    • sentence 为待提取的文本
    • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
    • withWeight 为是否一并返回关键词权重值,默认值为 False
    • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
  • jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件

基于 TextRank 算法的关键词抽取

  • jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
  • jieba.analyse.TextRank() 新建自定义 TextRank 实例
import jieba.analyse
# 基于TF-IDF
a = jieba.analyse.extract_tags(text_1,topK = 5)
print("基于TF-IDF:{}".format(a))
# 基于TextRank
b = jieba.analyse.textrank(text_1,topK = 5)
print("基于TextRank:{}".format(b))
基于TF-IDF:['NBA', '萧华', '比赛', '复赛', '一再强调']
基于TextRank:['进行', '比赛', '观战', '球迷', '没有']

你可能感兴趣的:(jiagu、snownlp、jieba对比)