iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python预测分词的实现
  • 912
分享到

Python预测分词的实现

2024-04-02 19:04:59 912人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言加载模型构建词网维特比算法实战前言 在机器学习中,我们有了训练集的话,就开始预测。预测是指利用模型对句子进行推断的过程。在中文分词任务中也就是利用模型推断分词序列,同时也叫解

前言

机器学习中,我们有了训练集的话,就开始预测。预测是指利用模型对句子进行推断的过程。在中文分词任务中也就是利用模型推断分词序列,同时也叫解码。

在HaNLP库中,二元语法的解码由ViterbiSegment分词器提供。本篇将详细介绍ViterbiSegment的使用方式

加载模型

在前篇博文中,我们已经得到了训练的一元,二元语法模型。后续的处理肯定会基于这几个文件来处理。所以,我们首先要做的就是加载这些模型到程序中:


if __name__ == "__main__":
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    print(CoreDictionary.getTermFrequency("秦机"))
    print(CoreBiGramTableDictionary.getBiFrequency("秦机","的"))

运行之后,效果如下:

频次

这里我们使用CoreDictionary.getTermFrequency()方法获取”秦机“的频次。使用CoreBiGramTableDictionary.getBiFrequency()方法获取“秦机 的”的二元语法频次。

构建词网

在前文中我们介绍了符号“末##末“,代表句子结尾,”始##始“代表句子开头。而词网指的是句子中所有一元语法构成的网状结构。比如MSR词典中的“秦机和科技”这个句子,是给定的一元词典。我们将句子中所有单词找出来。得到如下词网:


[始##始]
[秦机]
[]
[和,和科]
[科技]
[技]
[末##末]

对应的此图如下所示:

科技

当然,这里博主只是举例说明词网的概念,“和科”并不是一个单词。

下面,我们来通过方法构建词网。具体代码如下:


def build_Wordnet(sent, trie):
    jstring = JClass('java.lang.String')
    Vertex = JClass('com.hankcs.hanlp.seg.common.Vertex')
    WordNet = JClass('com.hankcs.hanlp.seg.common.WordNet')
    searcher = trie.getSearcher(JString(sent), 0)
    wordnet = WordNet(sent)
    while searcher.next():
        wordnet.add(searcher.begin + 1,
                    Vertex(sent[searcher.begin:searcher.begin + searcher.length], searcher.value, searcher.index))
    # 原子分词,保证图连通
    vertexes = wordnet.getVertexes()
    i = 0
    while i < len(vertexes):
        if len(vertexes[i]) == 0:  # 空白行
            j = i + 1
            for j in range(i + 1, len(vertexes) - 1):  # 寻找第一个非空行 j
                if len(vertexes[j]):
                    break
            wordnet.add(i, Vertex.newPunctuationInstance(sent[i - 1: j - 1]))  # 填充[i, j)之间的空白行
            i = j
        else:
            i += len(vertexes[i][-1].realWord)

    return wordnet


if __name__ == "__main__":
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    print(build_wordnet("秦机和科技", CoreDictionary.trie))

运行之后,我们会得到与上图归纳差不多的内容:

效果

维特比算法

如果现在我们赋予上述词图每条边以二元语法的概率作为距离,那么如何求解词图上的最短路径就是一个关键问题。

假设文本长度为n,则一共有2(n-1次方)种切分方式,因为每2个字符间都有2种选择:切或者不切,时间复杂度就为O(2(n-1次方))。显然不切实际,这里我们考虑使用维特比算法。

维特比算法原理:它分为前向和后向两个步骤。

  • 前向:由起点出发从前往后遍历节点,更新从起点到该节点的最下花费以及前驱指针
  • 后向:由终点出发从后往前回溯前驱指针,取得最短路径

维特比算法用python代码的实现如下:


def viterbi(wordnet):
    nodes = wordnet.getVertexes()
    # 前向遍历
    for i in range(0, len(nodes) - 1):
        for node in nodes[i]:
            for to in nodes[i + len(node.realWord)]:
                # 根据距离公式计算节点距离,并维护最短路径上的前驱指针from
                to.updateFrom(node)
    # 后向回溯
    # 最短路径
    path = []
    # 从终点回溯
    f = nodes[len(nodes) - 1].getFirst()
    while f:
        path.insert(0, f)
        # 按前驱指针from回溯
        f = f.getFrom()
    return [v.realWord for v in path]

实战

现在我们来做个测试,我们在msr_test_Gold.utf8上训练模型,为秦机和科技常见词图,最后运行维特比算法。详细代码如下所示:


if __name__ == "__main__":
    MODEL_PATH = "123"
    corpus_path = r"E:\ProgramData\Anaconda3\Lib\site-packages\pyhanlp\static\data\test\icwb2-data\gold\msr_test_gold.utf8"
    train_model(corpus_path, MODEL_PATH)
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    CoreDictionary = SafeJClass("com.hankcs.hanlp.dictionary.CoreDictionary")
    CoreBiGramTableDictionary = SafeJClass('com.hankcs.hanlp.dictionary.CoreBiGramTableDictionary')
    ViterbiSegment = JClass('com.hankcs.hanlp.seg.Viterbi.ViterbiSegment')
    MODEL_PATH = "123"
    HanLP.Config.CoreDictionaryPath = MODEL_PATH + ".txt"
    HanLP.Config.BiGramDictionaryPath = MODEL_PATH + ".ngram.txt"
    sent = "秦机和科技"
    wordnet = build_wordnet(sent, CoreDictionary.trie)
    print(viterbi(wordnet))

效果

有的人可能有疑问,因为二元模型里,本身就存在秦机 和
科技这个样本。这么做不是多此一举吗?那好,我们替换sent的文本内容为“北京和广州”,这个样本可不在模型中。运行之后,效果如下:

效果如下

我们发现依然能正确的分词为[北京 和 广州],这就是二元语法模型的泛化能力。至此我们走通了语料标注,训练模型,预测分词结果的完整步骤。

到此这篇关于Python预测分词的实现的文章就介绍到这了,更多相关Python预测分词内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python预测分词的实现

本文链接: https://www.lsjlt.com/news/128451.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python预测分词的实现
    目录前言加载模型构建词网维特比算法实战前言 在机器学习中,我们有了训练集的话,就开始预测。预测是指利用模型对句子进行推断的过程。在中文分词任务中也就是利用模型推断分词序列,同时也叫解...
    99+
    2024-04-02
  • python中文分词+词频统计的实现步骤
    目录前言一、文本导入二、使用步骤1.引入库2.读入数据3.取出停用词表4.分词并去停用词(此时可以直接利用python原有的函数进行词频统计)5. 输出分词并去停用词的有用...
    99+
    2024-04-02
  • Python+SimpleRNN实现股票预测详解
    目录1、数据源2、代码实现3、完整代码原理请查看前面几篇文章。 1、数据源 SH600519.csv 是用 tushare 模块下载的 SH600519 贵州茅台的日 k 线数据,本...
    99+
    2024-04-02
  • 怎么用Python实现颜值预测
    今天小编给大家分享一下怎么用Python实现颜值预测的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。所需工具Python版本:...
    99+
    2023-06-27
  • Python基于决策树算法的分类预测怎么实现
    今天小编给大家分享一下Python基于决策树算法的分类预测怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、决策树的...
    99+
    2023-06-26
  • python中文分词和词频统计如何实现
    这篇文章主要介绍“python中文分词和词频统计如何实现”,在日常操作中,相信很多人在python中文分词和词频统计如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python中文分词和词频统计如何实现...
    99+
    2023-07-02
  • 用Python实现 词法分析器(Lexical Analyzer)
      from __future__ import print_function  import sys  # following two must remain in the same order  tk_EOI, tk_Mul, tk_D...
    99+
    2023-06-02
  • Python基于jieba分词实现snownlp情感分析
    情感分析(sentiment analysis)是2018年公布的计算机科学技术名词。 它可以根据文本内容判断出所代表的含义是积极的还是负面的,也可以用来分析文本中的意思是褒义还是贬...
    99+
    2023-01-30
    Python snownlp情感分析 Python 情感分析 Python snownlp
  • Python怎么实现LSTM时间序列预测
    本篇内容主要讲解“Python怎么实现LSTM时间序列预测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现LSTM时间序列预测”吧!参考数据:数据一共两列,左边是日期,右边是乘...
    99+
    2023-06-02
  • Python实现词云图词频统计
    目录一:安装必要的库二:数据分析 条形图可视化三:数据分析 词频统计 词云图可视化一:安装必要的库 导入必要的库 import collections # 词频统计库 import...
    99+
    2022-12-26
    Python词云图词频统计 Python词云图 Python 词频统计
  • Matlab怎么实现时间序列预测分类
    这篇文章主要介绍“Matlab怎么实现时间序列预测分类”,在日常操作中,相信很多人在Matlab怎么实现时间序列预测分类问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Matlab怎么实现时间序列预测分类”的疑...
    99+
    2023-06-20
  • Python实现LeNet网络模型的训练及预测
    目录1.LeNet模型训练脚本(1).下载CIFAR10数据集(2).图像增强(3).加载数据集(4).显示部分图像(5).初始化模型(6).训练模型及保存模型参数2.预测脚本1.L...
    99+
    2024-04-02
  • Matlab实现时间序列预测分类实例代码
    目录一、数据准备二、时间序列预测分类1、输入为xt,输出是yt2、有x值,有y值:NARX(1)选择模型类型(2)选择输出,只有y_t(3)选择70%用来作为训练数据,15%用来作为...
    99+
    2024-04-02
  • Python使用LSTM实现销售额预测详解
    大家经常会遇到一些需要预测的场景,比如预测品牌销售额,预测产品销量。 今天给大家分享一波使用 LSTM 进行端到端时间序列预测的完整代码和详细解释。 我们先来了解两个主题: 什么是时...
    99+
    2024-04-02
  • python数据预测模型算法怎么实现
    要实现一个Python数据预测模型算法,你需要遵循以下步骤: 收集数据:首先,你需要收集相关数据,这些数据可以来自于各种来源,如...
    99+
    2024-02-29
    python
  • 怎么用Python实现预测未来孩子的长相
    这篇文章主要讲解了“怎么用Python实现预测未来孩子的长相”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python实现预测未来孩子的长相”吧!前期预备百度AI开放平台账号注册用你的...
    99+
    2023-06-16
  • 如何在Prometheus中实现监控数据的预测分析
    要在Prometheus中实现监控数据的预测分析,可以使用Prometheus的预测功能和PromQL查询语言来实现。以下是一些步骤...
    99+
    2024-03-04
    Prometheus
  • Python底层技术解析:如何实现分词和词性标注
    Python底层技术解析:如何实现分词和词性标注,需要具体代码示例在自然语言处理(NLP)中,分词和词性标注是一项非常重要的任务。分词是将连续的文字序列切分为单个词语的过程,而词性标注则是为每个词语确定其在文本中的词性,如名词、动词、形容词...
    99+
    2023-11-08
    Python 分词 词性标注
  • Python分割单词和转换命名法的实现
    目录分割单词分割成全小写单词分割成全大写单词分割成首大写、其余小写单词转中划线命名法转小蛇式命名法转大蛇式命名法转小驼峰命名法转大驼峰命名法分割单词 将一个标识符分割成若干单词存进列...
    99+
    2023-03-15
    Python分割单词 Python转换命名法
  • Python基于Tensorflow2.X实现汽车油耗预测
    目录一、开发环境二 、代码实现2.1 准备操作2.2 加载数据集2.3 数据处理2.4 创建网络2.5 训练与测试2.6 误差结果可视化三 、结果分析一、开发环境 集成开发工具:ju...
    99+
    2023-02-08
    Python汽车油耗预测 Python油耗预测 Python预测
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作