自然语言处理: 第一章N-Gram

这篇具有很好参考价值的文章主要介绍了自然语言处理: 第一章N-Gram。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 理论基础

定义: 语言模型在wiki的定义是统计式的语言模型是一个几率分布,给定一个长度为 m 的字词所组成的字串 W1 , W2 ,··· ,Wn ,派几率的字符串P(S) = P(W1 , W2 ,··· ,Wn , )而其中由条件概率公式我们可以得到下图2的公式,然后我们再利用马尔可夫假设(每个词的出现的概率只与前面那个词有关) 得到下面的公式3

自然语言处理: 第一章N-Gram





而N-gram的意思,就是每个词出现的概率只取决于前面n - 1个单词的,其中单词的概念可以是词组也可以是字,比如下图中的孙悟空这种单独拆开词无意义的可以看作一个单词。举个例子比如说是2-gram, 我们看到孙悟空这个词需要去预测下一个单词是三,我们看到三需要预测下一个单词是打。所以这种模型的输出完全取决于语料库的概念
自然语言处理: 第一章N-Gram

优缺点:

  • 优点
    • 计算简单
  • 缺点
    • 无法捕捉长距离的词汇关系
    • 完全取决于语料库的丰富程度
    • 没有考虑词之间的相似度



代码实现

  1. 构建自己的语料库,下面定义了一个函数从txt的文件里读取语料并且去掉换行符

    def read_corpus_file(file):
        with open(file, 'r' , encoding= 'utf-8') as f:
            corpus = f.readlines()
        return [line.strip() for line in corpus]
    
  2. 定义分词函数

  3. 计算ngram词频 , 根据输入的n 在语料库中计算词频,其中前 n - 1长度的单词是输入, 第n个单词是输出, 语料库中每出现一个则计数器+1

    # 定义计算N-Gram词频的函数
    def count_ngrams(corpus, n):
        ngrams_count = defaultdict(Counter)  # 创建一个字典存储N-Gram计数
        for text in corpus:  # 遍历语料库中的每个文本
            tokens = tokenize(text)  # 对文本进行分词
            for i in range(len(tokens) - n + 1):  # 遍历分词结果生成N-Gram
                ngram = tuple(tokens[i:i+n])  # 创建一个N-Gram元组
                prefix = ngram[:-1]  # 获取N-Gram的前缀
                token = ngram[-1]  # 获取N-Gram的目标单字
                ngrams_count[prefix][token] += 1  # 更新N-Gram计数
    
        # 输出信息
        print(f"{n}gram词频:") # 打印Bigram词频
        for prefix, counts in ngrams_count.items():
            print("{}: {}".format("".join(prefix), dict(counts)))
        print('-'*100)
        return ngrams_count
    
  4. 根据词频计算概率, 根据上面的词频去计算每个prefix 生成中心词的概率

    # 定义计算Bigram概率的函数
    def ngram_probabilities(ngram_counts):
        ngram_probs = defaultdict(Counter)  # 创建一个字典存储Bigram概率
        for prefix, tokens_count in ngram_counts.items():  # 遍历Bigram计数
            total_count = sum(tokens_count.values())  # 计算当前前缀的总计数
            for token, count in tokens_count.items():  # 遍历每个Bigram计数
                ngram_probs[prefix][token] = \
                    count / total_count  # 计算每个Bigram概率
    
        print("gram概率:") # 打印Bigram概率
        for prefix, probs in ngram_probs.items():
            print("{}: {}".format("".join(prefix), dict(probs)))
        print('-'*100)
        return ngram_probs
    
  5. 定义生成下一个词的函数,如果前缀不在语料库中则返回None,如果在的话取几率最大的作为输出

    # 定义生成下一个词的函数
    def generate_next_token(prefix, bigram_probs):
        if not prefix in bigram_probs:  # 如果前缀不在Bigram概率中,返回None
            return None
        next_token_probs = bigram_probs[prefix]  # 获取当前前缀对应的下一个词的概率
        next_token = max(next_token_probs, 
                         key=next_token_probs.get)  # 选择概率最大的词作为下一个词
    
        return next_token
    
  6. 生成连续文本, 这里需要根据n 和随机输入一个prefix 从而得到不间断的生成新的文本,由于可能生成的长度很长,这里通过设置length进行截断

    def generate_text(prefix, tigram_probs, length=8 , n = 2): 
        '''n : gram'''
        tokens = list(prefix)  # 将前缀转换为字符列表
        for _ in range(length - len(prefix)):  # 根据指定长度生成文本 
            # 获取当前前缀对应的下一个词
            next_token = generate_next_token(tuple(tokens[-1 * (n - 1) : ]), tigram_probs) 
            if not next_token: # 如果下一个词为None,跳出循环
                break
            tokens.append(next_token) # 将下一个词添加到生成的文本中
        return "".join(tokens) # 将字符列表连接成字符串
    



最后生成的结果如下:

自然语言处理: 第一章N-Gram文章来源地址https://www.toymoban.com/news/detail-486596.html

到了这里,关于自然语言处理: 第一章N-Gram的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【自然语言处理】理解词向量、CBOW与Skip-Gram模型

    由于计算机不能直接对各种字符进行运算,为此需要将词的表示进行一些转换。因此,在自然语言处理中,通常需要对输入的语料进行一些预处理: 其中,如何对词汇进行表示是很关键的问题,糟糕的表示方法容易导致所谓的 “Garbage in, garbage out”。 对词汇的表示,常见的

    2024年02月08日
    浏览(46)
  • 自然语言处理 Paddle NLP - 文本语义相似度计算(ERNIE-Gram)

    基础 自然语言处理(NLP) 自然语言处理PaddleNLP-词向量应用展示 自然语言处理(NLP)-前预训练时代的自监督学习 自然语言处理PaddleNLP-预训练语言模型及应用 自然语言处理PaddleNLP-文本语义相似度计算(ERNIE-Gram) 自然语言处理PaddleNLP-词法分析技术及其应用 自然语言处理Pa

    2024年02月08日
    浏览(69)
  • 【自然语言处理(NLP)】基于Skip-gram实现Word2Vec

    活动地址:[CSDN21天学习挑战赛](https://marketing.csdn.net/p/bdabfb52c5d56532133df2adc1a728fd) 作者简介 :在校大学生一枚,华为云享专家,阿里云星级博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC)志愿者,以及编程

    2024年02月09日
    浏览(47)
  • 【自然语言处理】自然语言处理 --- NLP入门指南

    NLP的全称是 Natuarl Language Processing ,中文意思是自然语言处理,是人工智能领域的一个重要方向 自然语言处理(NLP)的一个最伟大的方面是跨越多个领域的计算研究,从人工智能到计算语言学的多个计算研究领域都在研究计算机与人类语言之间的相互作用。它主要关注计算机

    2024年02月03日
    浏览(65)
  • [自然语言处理] 自然语言处理库spaCy使用指北

    spaCy是一个基于Python编写的开源自然语言处理库。基于自然处理领域的最新研究,spaCy提供了一系列高效且易用的工具,用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy的官方仓库地址为:spaCy-github。本文主要参考其官方网站的文档,

    2024年02月15日
    浏览(100)
  • 自然语言处理从入门到应用——自然语言处理的常见任务

    分类目录:《自然语言处理从入门到应用》总目录 语言模型(Language Model,LM)(也称统计语言模型)是描述自然语言概率分布的模型,是一个非常基础和重要的自然语言处理任务。利用语言模型,可以计算一个词序列或一句话的概率,也可以在给定上文的条件下对接下来可

    2024年02月07日
    浏览(66)
  • 【数据挖掘与人工智能自然语言处理】自然语言处理和人工智能:如何利用自然语言处理技术进行数据挖掘

    作者:禅与计算机程序设计艺术 随着互联网和大数据时代的到来,数据挖掘已成为各个行业的热门话题。数据挖掘的核心在于发现数据中的有价值信息,而自然语言处理(NLP)技术是实现这一目标的重要手段。本文旨在通过自然语言处理技术进行数据挖掘,为数据挖掘提供一

    2024年02月05日
    浏览(102)
  • 以ChatGPT为例进行自然语言处理学习——入门自然语言处理

    ⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您, 麻烦点个赞 👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支持一下呗。👍⭐️❤️ Qt5.9专栏 定期更新Qt的一些项目Demo

    2023年04月23日
    浏览(83)
  • N-Gram语言模型工具kenlm的详细安装教程

    【本配置过程基于Linux系统】 下载源代码:  编译: 发现报错:   系统中没有cmake,按照错误提示,执行以下命令: 安装完成后,再次cmake:  又报错:  找不到boost,那么就下载它: 安装完成后继续cmake,无语,还报错:  boost依赖包没装全,索性全装了: 对于eigen3这个包

    2024年02月10日
    浏览(37)
  • 自然语言编程系列(二):自然语言处理(NLP)、编程语言处理(PPL)和GitHub Copilot X

           编程语言处理的核心是计算机如何理解和执行预定义的人工语言(编程语言),而自然语言处理则是研究如何使计算机理解并生成非正式、多样化的自然语言。GPT-4.0作为自然语言处理技术的最新迭代,其编程语言处理能力相较于前代模型有了显著提升。Copilot X 构建于

    2024年02月20日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包