首页 AI Studio教育版 帖子详情
作业帖 | NLP+推荐-深度学习集训营
收藏
快速回复
AI Studio教育版 其他课程答疑 17670 149
作业帖 | NLP+推荐-深度学习集训营
收藏
快速回复
AI Studio教育版 其他课程答疑 17670 149

百度深度学习集训营第二阶段的NLP+推荐系统内容开讲啦,每个阶段的作业都将有各自的奖励,欢迎大家学习~

PS:如遇帖子过期、审核不通过的情况,请先复制内容保存在word文档,然后根据提示,完成个人实名验证,刷新后重新粘贴复制的内容,即可提交~

欢迎大家报名参加~

请大家按照作业格式将作业回帖在下面,并备注自己的AI Studio用户名~

 

2月27日第二次作业

作业奖励:3月2日中午12点之前完成,会从中挑选10位回答优秀的同学获得飞桨定制数据线+本

实践作业:(必做)

路径:AI Studio课程-作业-NLP作业2

•请尝试用飞桨实现一个CBOW模型,并使用text8语料进行训练(或尝试提高skip-gram的训练速度)

附加题:(选做,答案回复在作业帖下)

•打开你的脑洞,尝试embedding的各种花样玩法,比如计算同义词,进行推理,将embedding进行聚类,或者用t-sne进行可视化。

附加题回复格式:

AI Studio用户名:XXXX

作业2-1附加题:XXX

 

2月25日第一次作业

作业奖励: 3月2日中午12点之前完成,会从中挑选10位幸运的同学获得飞桨定制数据线+本

作业1-1

(1)下载飞桨本地并安装成功,将截图发给班主任
(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
LAC模型地址:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleNLP/lexical_analysis
Jieba模型:https://github.com/fxsjy/jieba
(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88

作业1-2

(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?
(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。

回复作业格式:

AI Studio用户名:XXXX

作业1-1:XXX

作业1-2:

(1)XXX

(2)XXX

 

报名流程:

1.加入QQ群:677320960,班主任会在QQ群里进行学习资料、答疑、奖品等活动

2.点此链接,加入课程报名并实践:https://aistudio.baidu.com/aistudio/course/introduce/888

温馨提示:课程的录播会在3个工作日内上传到AI studio《百度架构师手把手教深度学习》课程上

8
收藏
回复
全部评论(149)
时间顺序
moxiaoying
#42 回复于2020-02

AI Studio用户名: moxiaoying

作业1-1:

(1):

(2):

(3):

作业1-2:

(1):

1. 词表为字典:

M+M-1+M-2+....+2+1= (1+M)/2

2. 词表为列表:

N*(M+M-1+M-2+....+2+1)=(N+NM)/2

(2): 懵逼中

(3):

逆向最大匹配法:和正向原理相同,只是方向相反

最短路径分词:在所有的切分过程中选择词语数量最少的分词结果,如果出现词语数量相同的情况,就选择词语长度的方差小的那个分词结果。

 

0
回复
六到飞起year
#43 回复于2020-02

AI Studio用户名:六到飞起year

作业1-1:

(1) 截图已发送

(2)

(3)

作业1-2:

(1)N*(M+M-1+M-2+....+2+1)=(N+NM)/2

(2)

(3)

基于词表的分词方法
正向最大匹配法(forward maximum matching method, FMM)
逆向最大匹配法(backward maximum matching method, BMM)
N-最短路径方法
基于统计模型的分词方法
基于N-gram语言模型的分词方法
基于序列标注的分词方法
基于HMM的分词方法
基于CRF的分词方法
基于词感知机的分词方法
基于深度学习的端到端的分词方法

0
回复
windly4548
#44 回复于2020-02

AI Studio用户名:windly4548

作业1-1:

(1)已发qq

(2)

(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵

import jieba
import os
import math
from collections import Counter

word_list=[]
path_tem="./1946"
for file in os.listdir(path_tem):
file_tem = os.path.join(path_tem,file)
text=open(file_tem,encoding='utf-8').read()
seg_list=jieba.cut(text)
word_list+=seg_list
word_count = Counter(word_list)
result=0
word_num=len(word_list)
print("总词量",word_num)
for word in word_count:
percent = word_count[word]/word_num
result+=percent*math.log(percent,2)
result=-result
print("信息熵",result)

输出总词量 1889
信息熵 8.234127630448668

作业1-2

(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?

M*N+(M-1)*N+(M-2)N+(M-3)N+……+2N+1N=(M∗(M−1)/2)*N
复杂度为O(NM^2)

(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?

#分词候选
import jieba
s="去北京清华大学游玩"
dict=list(jieba.cut(s,cut_all=True))
print("使用jieba获得词典为")
print(dict)
##count_seg_candidates递归查找能够分词成功的句子
def seg_candi_count(candidate, remained, dictionary):
if len(remained) == 0:
print('/'.join(candidate))
return 1
count = 0
for i in range(1, len(remained)+1):
if (remained[:i]) not in dictionary:
continue
count += seg_candi_count(candidate + [remained[:i]], remained[i:], dictionary)
return count
print('分词候选数',seg_candi_count([],s,dict))

输出使用jieba获得词典为
['去', '北京', '清华', '清华大学', '华大', '大学', '游玩']
去/北京/清华/大学/游玩
去/北京/清华大学/游玩
分词候选数 2

 

(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。

除N-gram算法,还有HMM隐马尔可夫模型、CRF条件随机场 基于深度学习BiLSTM-CRF网络模型。

0
回复
多佛朗mingle
#45 回复于2020-02

AI Studio用户名:多佛朗mingle

作业1-1:

(1)已发qq

(2)使用LAC分词

(3)计算信息熵

作业1-2:

(1)每次查找对应分出的词是否在词表里,需要查找N次,最大前向匹配时,从串尾开始,依次切去一个词,看余下的子串是否在词表里,最坏情况需要len(串)次(最大为M),每次匹配成功,从串首去掉对应匹配成功的词,再从左往右进行下一次匹配,最坏情况,需要M次,如此看来,计算复杂度为O(N*M*M)

(2)计算分词候选

(3)分词算法

还有基于统计机器学习的HMM,CRF,想法是先训练一个序列标注模型,有了序列标注,对句子进行标注后,就可以使用这些标注对句子进行分词

 

 

 

 

 

 

0
回复
彼岸花的开了
#46 回复于2020-02

AI Studio用户名:XXXX

作业1-1:

作业1-2:

(1)

def seg_count(seg, sentence, dic):

count = 0

for i in range(1, len(sentence) + 1):
if sentence[:i] in dic:
count += seg_count(seg + [sentence[:i]], sentence[i:], dic)

if len(sentence) == 0:
print('/'.join(seg))
return 1

return count


dictionary = ['南', '京', '市', '长', '江', '大', '桥','南京', '南京市', '市长', '长江', '大桥']

words = '南京市长江大桥'

num = seg_count([], words, dictionary)

print("Count is:", num)

(2)

0
回复
adurey
#47 回复于2020-02

AI Studio用户名:yuanruqiu

作业1-1

(1)安装paddle

(2)jieba分词的使用

jieba.enable_paddle()
strs=["南京市长江大桥","我来到北京清华大学"]
for str in strs:
    seg_list=jieba.cut(str,use_paddle=True)
    print("Paddle Mode:"+'/'.join(list(seg_list)))

结果:

Paddle enabled successfully......
2020-02-27 14:31:21,435-DEBUG: Paddle enabled successfully......
Paddle Mode:南京市/长江大桥
Paddle Mode:我/来到/北京清华大学

(3)对人民日报语料库的分词,计算信息熵

这里只用了25个文本

import os
import re
import math
from collections import Counter
path="1946"
words=[]

for root,dirs,files in os.walk(path):
    for name in files:
        filepath=os.path.join(root,name)
        text=open(filepath).read()
        text=re.sub('\W+','',text).replace("_",'') #去除符号和下划线
        seg_list=jieba.lcut(text)
        words+=seg_list


#统计词频        
cnt_dict=Counter(words)

#计算信息熵
entropy=0
for a,b in cnt_dict.items():
    b /=len(words)
    p=b
    entropy+=p*math.log(p,2)
entropy=-entropy
print("信息熵:",entropy)

结果:

信息熵: 10.424444021632086

 

作业1-2

(1)需要匹配的次数为N*(M*(M+1)/2),即计算复杂度为O(NM^2).

(2)采用递归

import jieba
str="小明硕士毕业于中国科学院计算所"
dict=list(jieba.cut(str,cut_all=True))
text=[]

def cut_all(text,temp,dict):
    if(len(temp)==0):
        print('/'.join(text))
        return 1
    num=0
    for i in range(1,len(temp)+1):
        if temp[:i] not in dict:
            continue
        num+=cut_all(text+[temp[:i]],temp[i:],dict)
    return num

print('所有分词:',cut_all(text,str,dict))

结果:

运行耗时: 44毫秒
小/明/硕士/毕业/于/中国/科学院/计算所
小/明/硕士/毕业/于/中国科学院/计算所
所有分词: 2

 

(3)

还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。

 
(3)对人民日报语料库的分词,计算信息熵

(3)

还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。

(3)

还有逆向最大匹配算法(BMM),双向最大匹配算法和基于HMM的分词发等等。逆向最大匹配算法就是正向匹配顺序反过来;双向最大匹配就是将正向和逆向进行比较后得出最后结果;基于HMM的分词方法属于由字构词的分词方法,它是将分词问题转化为字的分类问题(序列标注问题)。

0
回复
铁锅
#48 回复于2020-02

AIStudio用户名:wzshou

作业1-1

(1)paddlepaddle安装截图

 

(2) 分词使用

 

(3)信息熵计算

 

作业1-2
(1)匹配次数:N*(m(m+1)/2)

    时间复杂度即为O(NM)

(2)

0
回复
逗一生
#49 回复于2020-02

AI Studio用户名:逗一生

作业1-1:

(1) 已提交给班主任

(2)

使用LAC和jieba进行分词,情况可以看出jieba与LAC的分词在大部分情况下都是相似的,但是jieba分词效果更优。

(3)

import jieba
import sys
import os
import math
jieba.enable_paddle()

class RMRB():
    def __init__(self,path):
        self.path = path
        self.stop = [line.strip() for line in open('C:/Users/Administrator/Desktop/stopwords-master/百度停用词                  表.txt',encoding='utf-8').readline()]

    def read_file(self):
        word_total = []
        for file in os.listdir(self.path):
            file_path = os.path.join(self.path,file)

            text = open(file_path,encoding='utf-8').read()
            text_word = jieba.cut(text)
            text_str = []
           #去除停用词以及标点符号
           for i in list(text_word):
                 if i not in list(self.stop) and i not in[' ', ',' , '\n', '。' , '!' , '\u3000', '###', '(' , ')' , '【' , '】' ,':', '一' ,'、', '”', '“' ]:
                  text_str.append(i)
           # 不能使用append,因为append会消除重复项
           word_total += text_str
         return word_total

    def H(self,word_total):
        entropy=0
        word_number = len(word_total)
        vocab = set(word_total)
        for word in vocab:
            probability = word_total.count(word)/word_number
            entropy += probability*math.log(probability,2)
        return entropy,word_number


model = RMRB('C:/Users/Administrator/Desktop/1946年05月/')
aaa = model.read_file()
entropy,number = model.H(aaa)
print('总词数:', number)
print('信息熵:',-entropy)

总词数: 139873
信息熵: 11.801521125064568

 

作业1-2

(1)假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是 O(n) = N+2N+...+(M-1)N+MN=N(M^2)。前向匹配会将M长的句子从最长开始切分,将剩余的部分与词表中N个词进行匹配,最坏的情况是前M-1个分词结果都没有匹配项,将每一个字都与词表匹配。

(2)

(3)除了N-gram和正向最大匹配法,还有反向最大匹配法,双向最大匹配算法,基于HMM,统计模型的分词方法等。

0
回复
晟灬熙
#50 回复于2020-02

AI Studio用户名:晟灬熙

作业 1-1

(1)截图已提交

(2)使用jieba分词

0
回复
4321
#51 回复于2020-02

AI Studio用户名:断灬泪残月

作业1-1:

(1)已发qq

(2)

(3)

作业1-2

(1)O(M^2 * N)

(2)

(3)最少切分分词算法:该分词算法依据最少切分原则,从几种分词算法切分结果中取切分词数最少一种的。比如,从正向最大匹配和逆向最大匹配两者中选择词数较少的方案,当词数相同时,采取某种策略,选择其中一个。

0
回复
相对的爱因斯坦
#52 回复于2020-02

AI Studio用户名:相对的爱因斯坦

0
回复
thunder95
#53 回复于2020-02

AI Studio用户名:  thunder95

作业1-1:

(1)用pip安装失败,用docker toolbox安装成功, 已发给班主任

(2)尝试PaddleNLP度的LAC模型, 非常方便易用

(3)计算信息熵,运行结果:

194605总词量:  175456
194605信息熵:  -10.263387477287653

作业1-2:

(1) 词表容量为N,M长的句子第一位置开始匹配遍历N次,第二位置2N次,依次类推,计算复杂度为O(n) = N+2N+....+(M-1)N+MN=N(M的2次方)

(2)给定一个句子,能最多给出2xNx(N+1), 其中N是文本长度


(3) 逆向最大匹配法:和正向原理相同,只是方向相反

   双向最大匹配法(和正向最大匹配法类似,区别是从左到右、从右到左进行两次扫描)

  HMM隐马尔可夫模型和RNN循环神经网络模型切词方法

0
回复
张小黄
#54 回复于2020-02

AI Studio用户名:张小黄

作业1-1

(1)下载飞桨本地并安装成功,将截图发给班主任


(2)学习使用PaddleNLP下面的LAC模型或Jieba分词
LAC模型地址:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleNLP/lexical_analysis


Jieba模型:https://github.com/fxsjy/jieba


(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵
语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88

作业1-2

(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?

O(N*(M^2)),假设最坏情况,从第一个字开始之后每1个字、2个字...M个字的词都要在词表查N次。
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?


(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。

词典法:最大前向匹配、最大后向匹配、双向匹配

统计法:n-gram、HMM、CRF

基于神经网络:LSTM(RNN)、bert等预训练语言模型

0
回复
C
CF_FC
#55 回复于2020-02

AI Studio用户名:CF_FC

作业1-1:

(1) 之前已经安装过1.6.3版本的Paddlepaddle,已发截图给班主任。

(2) 学习使用Jieba分词:(分析《背影》一文的词频排行)

# 导入 jieba
import jieba
import jieba.analyse as anls #关键词提取

s=open("D:\\重要文件\\Desktop\\背影.txt").read()
f=open("D:\\重要文件\\Desktop\\分析结果.txt","w+")
for x, w in anls.textrank(s, withWeight=True):
    #print('%s %s' % (x, w))
    f.write('%s %s \n' % (x, w))
f.close()

结果如下:

 

作业1-2:

(1)XXX

(2)XXX

0
回复
m
matrixlin9
#56 回复于2020-02

AI Studio用户名:matrixlin9

作业1-1:

(1)飞桨本地安装成功,已截图给班主任

(2)学习使用jieba模型分词

(3)人民日报预料分词,并计算信息熵:

作业1-2:

(1)最大前向匹配的思想是每次分词从前面取最有可能的单词切分,然后再向后继续分词。我们考虑最坏情况:一开始的时候,我们拿拿一个单词取到词典做匹配。这个单词的长度可能从M到1,一共N*M次操作。但是只有1个长度的字被匹配到。第二次我们做类似的操作,只是这个单词长度是可能从M-1到1,一共N*M-1次。以此类推,一共可能有N*M+N*(M-1)+...+N=N*(M+1)*M/2。计算复杂度是O(N*M^2)。但是如果我们每次拿的单词长度限制为S,S是词典里面已知的最大长度。那么我们复杂度就可以降到O(N*M)

(2) 给定句子计算候选个数:

(3)CRF分词

条件随机场分词的任务是给定一个中文字符串,得到一个每个字对应的分类。每个字可能在词的开头(B),中间(M),结尾(E),或是单字词(S)。CRF通过定义条件概率P(Y∣X)来描述模型。以及一系列的特征函数和权重来计算最后的分数。进而得到分词的结果。

 

0
回复
尚海潮
#57 回复于2020-02

作业1-1
(1)下载飞桨本地并安装成功,将截图发给班主任
已发

(2)学习使用PaddleNLP下面的LAC模型或Jieba分词 LAC模型地址:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleNLP/lexical_analysis Jieba模型:https://github.com/fxsjy/jieba
这里我用了jieba分词,做了几个测试

(3)对人民日报语料完成切词,并通过统计每个词出现的概率,计算信息熵 语料地址:https://github.com/fangj/rmrb/tree/master/example/1946%E5%B9%B405%E6%9C%88
这里不太会,参考了别的学员的作业


作业1-2
(1)思考一下,假设输入一个词表里面含有N个词,输入一个长度为M的句子,那么最大前向匹配的计算复杂度是多少?
最坏情况下每个词都要切分,计算复杂度是O(NM)。
(2)给定一个句子,如何计算里面有多少种分词候选,你能给出代码实现吗?

(3)除了最大前向匹配和N-gram算法,你还知道其他分词算法吗,请给出一段小描述。
CRF分词算法
CRF可以看作一个无向图模型,对于给定的标注序列Y和观测序列X,对条件概率P(Y|X)进行定义,而不是对联合概率建模。CRF可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。

 

csdn博客作业连接:https://blog.csdn.net/SHANG__HC/article/details/104566259

0
回复
lionlhy2012
#58 回复于2020-02

0
回复
炼丹的猪猪侠
#59 回复于2020-02

AI Studio 用户名: quan

作业1-1:

(1) 已发班主任

(2):

(3):

作业1-2:

(1):

我们来看一下最大前向匹配的过程:对于M长度的句子,首先在词典中查询M长度的词,如有匹配则结束,否则去掉最后一个字,得到(M-1)长度的词,再重复上述操作。直至匹配成功。 显然在最坏情况里,最终匹配的词长度为1,显然时间复杂度为O(m*n),但是在实际情况中,m远小于词典大小N,所以时间复杂度为O(n)

(2):

(3):

还有后向最大匹配,双向最大匹配。后向最大匹配就是将前向最大匹配反过来,从句子开头开始去掉。  

而双向最大匹配法就是综合前向和后向,对比分词数量谁少就取谁

0
回复
边陲
#60 回复于2020-02

作业1-1

(1)环境安装参照paddle官网首页快速开始

(2)(3):

github的model未能成功clone,使用paddlehub 的 lac 模型

pip install paddlehub
hub install lac

人民日报语料库使用 7z的压缩包,注意:后面部分压缩包没有包含文件夹,与前面格式不同,需手动调整。

日报文本,首先提取正文内容(专栏后的内容):

并将其段落拆分为单句,当句子长度远远小于字典长度时,分词的运算量大致和字典的长度直接相关。详见1-2(1)。

 

使用hub 分词,添加参数 use_gpu=True,使用gpu,此参数文档中没有写

部分运行结果如下:

上图未使用多线程,数据量太大速度太慢,使用多进程加速

def multi_run():
    """
    多进程
    :return:
    """
    cpu_num = multiprocessing.cpu_count()
    multiprocessing.freeze_support()
    pool = multiprocessing.Pool(cpu_num,
                                initializer=tqdm.set_lock,
                                initargs=(multiprocessing.RLock(),))
    files_dir = os.listdir(data_dir)
    files_dir = sorted(files_dir)
    for f_dir in files_dir:
        pool.apply_async(words_split_year, args=(f_dir,))
    pool.close()
    pool.join()

部分结果如下,信息熵约为 11

 

1-2(1)

最坏情况分析:max_len < M时,最终也会全部加上,因此假设max_len = M,最后一个匹配上。 运行次数:N((M-1)+(M-2)...+1),其中1+2+...+(M-1)的值约等于 0.5(M^2) 结果为0.5NM^2,算法复杂度为O(NM^2) 当句子M远远小于N时,算法复杂度为O(N),取决于字典的大小。 分词过程中,尽量根据文章标点等将大段落切分为单句。

1-2(2)

# 参考前面大佬帖子的算法
import jieba

text = "早上好不好"
word_dict = jieba.lcut(text, cut_all=True)
word_len = len(text)


# print(word_dict)


def count_seg(start=0, res_list=[], temp_res=[]):
    """
    :param start:起始遍历位置
    :param res_list:返回结果
    :param temp_res:切片结果,如果符合条件,添加到返回
    :return: res_list
    """
    res_ = temp_res.copy()
    # print("temp:{}".format(res_))
    # 起始位置 == 字符长度,完成一次匹配
    if start == word_len and res_ not in res_list:
        res_list.append(res_)
        return

    for i in range(start, word_len + 1):
        # 正向遍历匹配
        chars = text[start:i]
        # print("--start-{}-len-{}----".format(start, i))
        if chars in word_dict:
            temp_res.append(chars)
            # print("append:{}".format(temp_res))
            count_seg(i, res_list, temp_res)
            temp_res.pop()
            # print("pop:{}".format(temp_res))
    return res_list


result = count_seg()
print("结果数:{}".format(len(result)), "\n", result)

1-2(3)

逆向最大匹配,双向最大匹配
隐马尔可夫模型分词
隐藏的离散型状态变量{y1, y2, …, yn},观测变量{x1, x2, …, xn},
在任一时刻,观测变量的取值只与该时刻的状态变量有关,即xi由yi决定。而当前状态只与前一时刻的状态有关,与其他状态无关。

1
回复
k
kly1997
#61 回复于2020-02

AI Studio用户名:kly1997

作业1-1:

(1)

已发送给班主任

(2)

import jieba

jieba.enable_paddle()

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))  # 默认模式

(3)

import jieba

import os

import math

 

# get .MD document

path = 'D:\work//new//1946年05月'

 

#统计词频计算信息熵

def informationentropy(lists):

    num = len(lists)

    print('总词数:', num)

    label = {}

    for str in lists:

        currentLabel = str

        if currentLabel not in label.keys():

            label[currentLabel] = 0

        label[currentLabel] += 1

    informationentropy = 0

    # 显示TOP3的词

    sort_words = sorted(label.items(), key=lambda k: k[1], reverse=True)

    print('TOP3的词及词频:\n{}'.format(sort_words[:3]))

    for key in label:

        prob = float(label[key]) / num

        informationentropy -= prob * math.log(prob, 2)

    print("信息熵:", informationentropy)

    return informationentropy

 

#主程序

# read

lists = []

jieba.enable_paddle()# 启动paddle模式

for (dirpath,dirnames,filenames) in os.walk(path):

    for filename in filenames:

        if os.path.splitext(filename)[1]=='.md':

            list = open(path+'\\'+filename,encoding='utf-8').read()

            seg_list = jieba.cut(list,use_paddle=True) # 使用paddle模式

            lists += seg_list

 

informationentropy(lists)

结果:信息熵11.26

作业1-2:

(1)最坏情况所有词都不在词表里,依次从第一,第二直到第M个字符开始匹配,每次需要匹配(M-k+1)*N次,一共需要N*((1+M)M/2)次。时间复杂度为O(NM^2)

(2)通过递归实现:

str = '中国人民万岁'

dict=['中','国','人','民','万','岁','中国','国民','中国人','万岁','中国人民']

def text_count(text, word, dict):

    if len(word) == 0:

        print('/'.join(text))

        return 1

    count = 0

    for i in range(1, len(word) + 1):

        if word[:i] not in dict:

            continue

        count += text_count(text + [word[:i]], word[i:], dict)

    return count

candidate = text_count([], str, dict)

print("候选:", candidate)

 

(3)隐马尔可夫模型:HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,而序列标签是隐状态序列,即观测序列为X,隐状态序列是Y,因果关系为Y->X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。

CRF分词算法:CRF可以看作一个无向图模型,对于给定的标注序列Y和观测序列X,对条件概率P(Y|X)进行定义,而不是对联合概率建模。CRF可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词有很好的识别能力,但开销较大。

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户