SnowNlp中文分词和中文关键词提取只能提取单个字不能提取分词的解决方法

20 篇文章 1 订阅

问题描述

# -*- coding: utf-8 -*-
# 导入SnowNLP库
from snownlp import *
import jieba
import re

if __name__ == '__main__':
    # ---------------------------------------------------------------------
    text = u'''《三体3:死神永生》
  与三体文明的战争使人类看到了宇宙黑暗的真相,地球文明像一个恐惧的孩子,熄灭了寻友的篝火,在暗夜中发抖。自以为历经沧桑,其实刚刚蹒跚学步;自以为悟出了生存竞争的秘密,其实还远没有竞争的资格。使两个文明命悬一线的黑暗森林打击,不过是宇宙战场上的一个微不足道的插曲,一个在战场上乱跑的无知孩童被堑壕中射杀,仅此而已。真正的星际战争没人见过,也不可能见到。因为战争的方式和武器已经远超出人类的想象,目睹战场之日,就是灭亡之时。
  人类没有想到,面对这巨大的存在,从社会学的结论,却可以推导出宇宙学的结果。宇宙的田园时代已经远去,那时,万物的之美曾昙花一现,现在已经变成任何大脑和智慧体都无法做出的梦,变成游吟诗人飘渺的残歌;宇宙的物竞天择已到了惨烈的时刻,在亿万光年暗无天日的战场上,深渊底层的毁灭力量被唤醒,太空变成了死神广阔的披风。
  太阳系中的人们永远不会知道这一切,面对真相的,只有两双眼睛。'''
    print('input: {}'.format(text))
    s1 = SnowNLP(text)
    # 分词
    print("分词: {}".format(s1.words)) # ['《', '三', '体', '3:', '死', '神', '永生', '》', '与', '三', '体', '文', '明', '的', '战', '争', '使', '人', '类', '看', '到', '了', '宇', '宙', '黑', '暗', '的', '真', '相', ',', '地', '球', '文', '明', '像', '一', '个', '恐', '惧', '的', '孩', '子', ',', '熄', '灭', '了', '寻', '友', '的', '篝', '火', ',', '在', '暗', '夜', '中', '发', '抖', '。', '自', '以', '为', '历', '经', '沧', '桑', ',', '其', '实', '刚', '刚', '蹒', '跚', '学', '步', ';', '自', '以', '为', '悟', '出', '了', '生', '存', '竞', '争', '的', '秘', '密', ',', '其', '实', '还', '远', '没', '有', '竞', '争', '的', '资', '格', '。', '使', '两', '个', '文', '明', '命', '悬', '一', '线', '的', '黑', '暗', '森', '林', '打', '击', ',', '不', '过', '是', '宇', '宙', '战', '场', '上', '的', '一', '个', '微', '不', '足', '道', '的', '插', '曲', ',', '一', '个', '在', '战', '场', '上', '乱', '跑', '的', '无', '知', '孩', '童', '被', '堑', '壕', '中', '射', '杀', ',', '仅', '此', '而', '已', '。', '真', '正', '的', '星', '际', '战', '争', '没', '人', '见', '过', ',', '也', '不', '可能', '见到', '。', '因', '为', '战', '争', '的', '方', '式', '和', '武', '器', '已', '经', '远', '超', '出', '人', '类', '的', '想', '象', ',', '目', '睹', '战', '场', '之', '日', ',', '就', '是', '灭', '亡', '之时', '。', '人', '类', '没', '有', '想', '到', ',', '面', '对', '这', '巨', '大', '的', '存', '在', ',', '从', '社', '会', '学', '的', '结', '论', ',', '却', '可', '以', '推', '导', '出', '宇', '宙', '学', '的', '结', '果', '。', '宇', '宙', '的', '田', '园', '时', '代', '已', '经', '远', '去', ',', '那时', ',', '万', '物', '的', '之', '美', '曾', '昙', '花一现', ',', '现', '在', '已', '经', '变', '成', '任', '何', '大', '脑', '和', '智', '慧', '体', '都', '无', '法', '做', '出', '的', '梦', ',', '变', '成', '游', '吟', '诗', '人', '飘', '渺', '的', '残', '歌', ';', '宇', '宙', '的', '物', '竞', '天', '择', '已', '到', '了', '惨', '烈', '的', '时', '刻', ',', '在', '亿', '万', '光', '年', '暗', '无', '天', '日', '的', '战', '场', '上', ',', '深', '渊', '底', '层', '的', '毁', '灭', '力', '量', '被', '唤', '醒', ',', '太', '空', '变', '成', '了', '死', '神', '广', '阔', '的', '披', '风', '。', '太', '阳', '系', '中', '的', '人', '们', '永', '远', '不', '会', '知', '道', '这', '一', '切', ',', '面', '对', '真', '相', '的', ',', '只', '有', '两', '双', '眼', '睛', '。']

    # 关键词
    print("关键词: {}".format(s1.keywords(3)))  # ['人', '战', '已']


原因

分词结果基本都是一个一个的字,导致关键词提取的时候也都是一个一个的关键字,查了一下发现是源码中的seg分词方法的问题,继承重写一下SnowNLP中的方法改为jieba分词就可以解决了


解决方法

# -*- coding: utf-8 -*-
# 导入SnowNLP库
from snownlp import *
import jieba
import re


class myNlp(SnowNLP):
    def __init__(self, doc):
        super().__init__(doc)

    @property
    def words(self):
        return jieba.lcut(self.doc)

    def keywords(self, limit=5, merge=False):
        doc = []
        sents = self.sentences
        for sent in sents:
            words = jieba.lcut(sent)
            words = normal.filter_stop(words)
            doc.append(words)
        rank = textrank.KeywordTextRank(doc)
        rank.solve()
        ret = []
        for w in rank.top_index(limit):
            ret.append(w)
        if merge:
            wm = words_merge.SimpleMerge(self.doc, ret)
            return wm.merge()
        return ret


if __name__ == '__main__':
    # ---------------------------------------------------------------------
    text = u'''《三体3:死神永生》
  与三体文明的战争使人类看到了宇宙黑暗的真相,地球文明像一个恐惧的孩子,熄灭了寻友的篝火,在暗夜中发抖。自以为历经沧桑,其实刚刚蹒跚学步;自以为悟出了生存竞争的秘密,其实还远没有竞争的资格。使两个文明命悬一线的黑暗森林打击,不过是宇宙战场上的一个微不足道的插曲,一个在战场上乱跑的无知孩童被堑壕中射杀,仅此而已。真正的星际战争没人见过,也不可能见到。因为战争的方式和武器已经远超出人类的想象,目睹战场之日,就是灭亡之时。
  人类没有想到,面对这巨大的存在,从社会学的结论,却可以推导出宇宙学的结果。宇宙的田园时代已经远去,那时,万物的之美曾昙花一现,现在已经变成任何大脑和智慧体都无法做出的梦,变成游吟诗人飘渺的残歌;宇宙的物竞天择已到了惨烈的时刻,在亿万光年暗无天日的战场上,深渊底层的毁灭力量被唤醒,太空变成了死神广阔的披风。
  太阳系中的人们永远不会知道这一切,面对真相的,只有两双眼睛。'''
    print('input: {}'.format(text))
    s1 = myNlp(text)
    # 分词
    print("分词: {}".format(s1.words)) # ['《', '三体', '3', ':', '死神', '永生', '》', '\n', '\u3000', '\u3000', '与', '三体', '文明', '的', '战争', '使', '人类', '看到', '了', '宇宙', '黑暗', '的', '真相', ',', '地球', '文明', '像', '一个', '恐惧', '的', '孩子', ',', '熄灭', '了', '寻友', '的', '篝火', ',', '在', '暗', '夜中', '发抖', '。', '自', '以为', '历经沧桑', ',', '其实', '刚刚', '蹒跚', '学步', ';', '自', '以为', '悟出', '了', '生存竞争', '的', '秘密', ',', '其实', '还远', '没有', '竞争', '的', '资格', '。', '使', '两个', '文明', '命悬', '一线', '的', '黑暗', '森林', '打击', ',', '不过', '是', '宇宙', '战场', '上', '的', '一个', '微不足道', '的', '插曲', ',', '一个', '在', '战场', '上', '乱跑', '的', '无知', '孩童', '被', '堑壕', '中', '射杀', ',', '仅此而已', '。', '真正', '的', '星际', '战争', '没人见', '过', ',', '也', '不', '可能', '见到', '。', '因为', '战争', '的', '方式', '和', '武器', '已经', '远', '超出', '人类', '的', '想象', ',', '目睹', '战场', '之', '日', ',', '就是', '灭亡', '之', '时', '。', '\n', '\u3000', '\u3000', '人类', '没有', '想到', ',', '面对', '这', '巨大', '的', '存在', ',', '从', '社会学', '的', '结论', ',', '却', '可以', '推导', '出', '宇宙学', '的', '结果', '。', '宇宙', '的', '田园', '时代', '已经', '远去', ',', '那时', ',', '万物', '的', '之', '美', '曾', '昙花一现', ',', '现在', '已经', '变成', '任何', '大脑', '和', '智慧', '体都', '无法', '做出', '的', '梦', ',', '变成', '游吟', '诗人', '飘渺', '的', '残歌', ';', '宇宙', '的', '物竞天择', '已到', '了', '惨烈', '的', '时刻', ',', '在', '亿万', '光年', '暗无天日', '的', '战场', '上', ',', '深渊', '底层', '的', '毁灭', '力量', '被', '唤醒', ',', '太空', '变成', '了', '死神', '广阔', '的', '披风', '。', '\n', '\u3000', '\u3000', '太阳系', '中', '的', '人们', '永远', '不会', '知道', '这', '一切', ',', '面对', '真相', '的', ',', '只有', '两双', '眼睛', '。']
# 关键词
    print("关键词: {}".format(s1.keywords(3)))  # ['宇宙', '战场', '文明']
    

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

什么都干的派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值