database powershell elasticsearch memory permissions upload jaxb seo vue架构 pmp培训视频 jq解析json oracle查看数据库 配置tomcat环境变量 java取绝对值 python数据格式 pythonfor循环 python环境设置 python基础练习 java最新框架 java怎么编译 java连接sql数据库 java游戏开发教程 骁龙660和625 图解设计模式 h370主板 51脚本 易语言多线程 三维看图软件 pr缩放 整站系统 自动喊话器 如何给黑白照片上色 小工具 mathcad15 今日头条邀请码 办公室复印机使用方法 mtu设置多少最好 cdr字体变形 微信预约系统 软碟通u盘装系统教程
当前位置: 首页 > 学习教程  > python

【NLP基础知识】3.统计语言模型简介与案例实现

2021/2/8 12:55:31 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

目录 一、统计语言模型简介 1.语言模型任务 2.语言模型实例 3.语言模型任务 3.1贝叶斯公式 3.2概率基础知识 3.3语言模型定义 3.4语言模型总结 3.5语言模型改进方法 4.语言模型使用实例 二、语言模型任务评估 1.信息论-信息熵 2.相对熵 3.交叉熵 4.困惑度 5.传…

目录

一、统计语言模型简介

1.语言模型任务

2.语言模型实例

3.语言模型任务

3.1贝叶斯公式

3.2概率基础知识

3.3语言模型定义

3.4语言模型总结

3.5语言模型改进方法

4.语言模型使用实例

二、语言模型任务评估

1.信息论-信息熵

2.相对熵

3.交叉熵

4.困惑度

5.传统语言模型的限制

三、神经语言模型简介

四、预训练的词表示

五、使用词表示


一、统计语言模型简介

1.语言模型任务

2.语言模型实例

3.语言模型任务

3.1贝叶斯公式

3.2概率基础知识

3.3语言模型定义

计算实例

3.4语言模型总结

3.5语言模型改进方法

4.语言模型使用实例

In[1]:

from collections import Counter
import numpy as np


"""语料"""
corpus = '''她的菜很好 她的菜很香 她的他很好 他的菜很香 他的她很好
很香的菜 很好的她 很菜的他 她的好 菜的香 他的菜 她很好 他很菜 菜很好'''.split()


"""语料预处理"""
counter = Counter()  # 词频统计
for sentence in corpus:
    for word in sentence:
        counter[word] += 1
counter = counter.most_common()
lec = len(counter)
word2id = {counter[i][0]: i for i in range(lec)}
id2word = {i: w for w, i in word2id.items()}
print(word2id)
print(id2word)

输出:

{'的': 0, '很': 1, '菜': 2, '她': 3, '好': 4, '他': 5, '香': 6}
{0: '的', 1: '很', 2: '菜', 3: '她', 4: '好', 5: '他', 6: '香'}

In[2]:

"""N-gram建模训练"""
unigram = np.array([i[1] for i in counter]) / sum(i[1] for i in counter)
print(unigram)

bigram = np.zeros((lec, lec))   # + 1e-8
for sentence in corpus:
    sentence = [word2id[w] for w in sentence]
    print(sentence)
    for i in range(1, len(sentence)):
        bigram[[sentence[i - 1]], [sentence[i]]] += 1  # 对应词表位置词频加一(第一个词是3并且第二个词是0的情况词频加一)
for i in range(lec):
    bigram[i] /= bigram[i].sum()  # 对词频归一化,变为概率
print(bigram)

输出:

[0.2        0.2        0.16363636 0.12727273 0.12727273 0.10909091
 0.07272727]
[3, 0, 2, 1, 4]
[3, 0, 2, 1, 6]
[3, 0, 5, 1, 4]
[5, 0, 2, 1, 6]
[5, 0, 3, 1, 4]
[1, 6, 0, 2]
[1, 4, 0, 3]
[1, 2, 0, 5]
[3, 0, 4]
[2, 0, 6]
[5, 0, 2]
[3, 1, 4]
[5, 1, 2]
[2, 1, 4]
[[0.         0.         0.45454545 0.18181818 0.09090909 0.18181818
  0.09090909]
 [0.         0.         0.18181818 0.         0.54545455 0.
  0.27272727]
 [0.33333333 0.66666667 0.         0.         0.         0.
  0.        ]
 [0.66666667 0.33333333 0.         0.         0.         0.
  0.        ]
 [1.         0.         0.         0.         0.         0.
  0.        ]
 [0.6        0.4        0.         0.         0.         0.
  0.        ]
 [1.         0.         0.         0.         0.         0.
  0.        ]]

In[3]:

"""句子概率"""
def prob(sentence):
    s = [word2id[w] for w in sentence]
    les = len(s)
    if les < 1:
        return 0
    p = unigram[s[0]]
    if les < 2:
        return p
    for i in range(1, les):
        p *= bigram[s[i - 1], s[i]]
    return p

print('很好的菜', prob('很好的菜'))
print('菜很好的', prob('菜很好的'))
print('菜好的很', prob('菜好的很'))

输出:

很好的菜 0.04958677685950413
菜很好的 0.05950413223140495
菜好的很 0.0

In[4]:

"""排列组合"""
def permutation_and_combination(ls_ori, ls_all=None):
    ls_all = ls_all or [[]]
    le = len(ls_ori)
    if le == 1:
        ls_all[-1].append(ls_ori[0])
        ls_all.append(ls_all[-1][: -2])
        return ls_all
    for i in range(le):
        ls, lsi = ls_ori[:i] + ls_ori[i + 1:], ls_ori[i]
        ls_all[-1].append(lsi)
        ls_all = permutation_and_combination(ls, ls_all)
    if ls_all[-1]:
        ls_all[-1].pop()
    else:
        ls_all.pop()
    return ls_all

print('123排列组合', permutation_and_combination([1, 2, 3]))


"""给定词组,返回最大概率组合的句子"""
def max_prob(words):
    pc = permutation_and_combination(words)  # 生成排列组合
    p, w = max((prob(s), s) for s in pc)
    return p, ''.join(w)

print(*max_prob(list('香很的菜')))
print(*max_prob(list('好很的他菜')))
print(*max_prob(list('好很的的她菜')))

输出:

123排列组合 [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
0.029752066115702476 菜很香的
0.01081893313298272 菜很好的他
0.014024542950162781 她的菜很好的

二、语言模型任务评估

1.信息论-信息熵

2.相对熵

3.交叉熵

4.困惑度

(困惑度这部分的内容如后面实际应用中使用到,需要详细听,当前跳过了)

5.传统语言模型的限制

三、神经语言模型简介

 

四、预训练的词表示

五、使用词表示

 


本文链接: http://www.dtmao.cc/news_show_2000364.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?