NLP理论基础和实践(基础)task-02

【Task2 特征提取 (2 days)】

  1. 基本文本处理技能
    1.1 分词的概念(分词的正向最大、逆向最大、双向最大匹配法);

1.正向最大匹配法
分词目标:
在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。

算法流程:
假设词典中最长的单词为 5 个(MAX_LENGTH),那么最大匹配的起始子串字数也为 5 个
(1)扫描字典,测试读入的子串是否在字典中,这里最后当只剩一个词因该直接输出
(2)如果存在,则从输入中删除掉该子串,重新按照规则取子串,重复(1)
(3)如果不存在于字典中,则从右向左减少子串长度,重复(1)

2.逆向最大匹配法
分词目标:
在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。
在实践中,逆向最大匹配算法性能优于正向最大匹配算法。

算法流程:
假设词典中最长的单词为 5 个(MAX_LENGTH),那么最大匹配的起始子串字数也为 5 个
(1)扫描字典,测试读入的子串是否在字典中,这里最后当只剩一个词因该直接输出
(2)如果存在,则从输入中删除掉该子串,重新按照规则取子串,重复(1)
(3)如果不存在于字典中,则从左向右减少子串长度,重复(1)

3.双向最大匹配法
分词目标:
将正向最大匹配算法和逆向最大匹配算法进行比较,从而确定正确的分词方法。

算法流程:

比较正向最大匹配和逆向最大匹配结果
如果分词数量结果不同,那么取分词数量较少的那个
如果分词数量结果相同

分词结果相同,可以返回任何一个
分词结果不同,返回单字数比较少的那个

1.2 词、字符频率统计;

from collections import Counter
counter = Counter(all_data)
count_pairs = counter.most_common(vocab_size - 1) #返回每一个词出现的次数

all_data就是所有的词,在返回一个词和他的频率对应的一个列表

  1. 概念
    2.1 语言模型中unigram、bigram、trigram的概念;
    unigram 一元分词,把句子分成一个一个的汉字

    bigram 二元分词,把句子从头到尾每两个字组成一个词语

    trigram 三元分词,把句子从头到尾每三个字组成一个词语.

    2.2 unigram、bigram频率统计;

    unigram(这和栗子不是很好频率都是1)

  from collections import Counter
  words='大家好呀,为啥每次讨论都不积极呢'
  c= Counter(words)
  print(c)
  ``
Counter({'大': 1, '家': 1, '好': 1, '呀': 1, ',': 1, '为': 1, '啥': 1, '每': 1, '次': 1, '讨': 1, '论': 1, '都': 1, '不': 1, '积': 1, '极': 1, '呢': 1})

bigram

from collections import Counter
words='大家好呀,为啥每次讨论都不积极呢'
c=Counter([(words[i],words[i+1]) for i in range(0,len(words)-1)]) #这里最后到i+1,因此i不能超过len-1
for k,v in c.items():
    print(k,v)
Counter({('大', '家'): 1, ('家', '好'): 1, ('好', '呀'): 1, ('呀', ','): 1, (',', '为'): 1, ('为', '啥'): 1, ('啥', '每'): 1, ('每', '次'): 1, ('次', '讨'): 1, ('讨', '论'): 1, ('论', '都'): 1, ('都', '不'): 1, ('不', '积'): 1, ('积', '极'): 1, ('极', '呢'): 1})
  1. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化

步骤有:3.1 分词(可采用结巴分词来进行分词操作,其他库也可以);
3.2 去停用词;构造词表。
3.3 每篇文档的向量化。

3.1jieba分词的各种模式

import jieba
text='我要好好学习将来要做太空人'
#全模式
cut_list=jieba.cut(text, cut_all=True)
print(u'全模式:', '/'.join(cut_list))
#搜索模式
cut_list1=jieba.cut_for_search(text)
print(u'搜索模式', '/'.join(cut_list1))
#精度模式
cut_list2=jieba.cut(text, cut_all=False)
print(u'精确模式','/'.join(cut_list2))
#默认和精确模式一样
cut_list3=jieba.cut(text)
print(u'默认模式','/'.join(cut_list3))
全模式: 我/要/好好/好好学/好好学习/好学/学习/将来/要/做/太空/太空人
搜索模式 我要/好好/好学/学习/好好学/好好学习/将来/要/做/太空/人
精确模式 我要/好好学习/将来/要/做/太空/人
默认模式 我要/好好学习/将来/要/做/太空/人

3.2去停用词构造词表,首先我们需要有一个停用词,保存时另存为utf-8的格式
中文停用词
英文停用词

去除停用词典和错词检错都可以用词典的形式完成,以停用词为例

import jieba
import re
stopwords = {}
fstop = open('Chinese_stop_word.txt', 'r',encoding='utf-8',errors='ingnore')
for eachWord in fstop:
	stopwords[eachWord.strip()] = eachWord.strip()  #停用词典
fstop.close()
f1=open('biluoqiao.txt', 'w', encoding='utf-8')
f2=open('processed.txt','w',encoding='utf-8')

line=f1.readline()
print(u'原始文本:',line)
while line:
	line = line.strip()  #去前后的空格
	line = re.sub(r"[0-9\s+\.\!\/_,$%^*()?;;:-【】+\"\']+|[+——!,;:。?、~@#¥%……&*()]+", " ", line) #去标点符号
	 seg_list=jieba.cut(line,cut_all=False)  #结巴分词
	 outStr="" #先建立一个空字符串把去除过停用词的字符放进去
	 for word in seg_list:
	 	if word not in stopwords:
	 		outStr+=word
	 		outStr+=" "
	 f2.write(outStr)
	 line=f1.readline()		
	  print(u'去除停用词:',outStr)
f1.close()
f2.close()


原始文本:  中国演出行业协会网络表演分会表示,近期,一些低俗、恶意炒作、有碍公序良俗的违法违规直播事件多次出现,

中国 演出 行业协会 网络 表演 分会   近期   低俗   恶意 炒作   碍 公序良 俗 违法 违规 直播 事件   
引发 社会 关注   损害 行业 形象   直播 平台 自律   承担 主体 责任   第一 时间 分会 上报 劣迹 主播 信息 违规 证据   
分会 组织 内容 评议 委员会 专家组 审核   分会 会长 联席会 讨论   正式 第三批 网络 表演   直播   行业 主播   黑名单   协会 分会   主播 列入 黑名单 争议   
  工作日内 分会 秘书处 申诉   

3.3 每篇文档的向量化。

import jieba
f=open("procesed.txt","r",encoding="utf-8")
t=f.read()
t=set(t.split())
# print(t)
corpus_dict=dict(zip(t,range(len(t))))
print(corpus_dict)
# 建立句子的向量表示
text='''韦斯特一心瞄准自由市场 怎奈伤病挡路 钱途渺茫'''
text1 = list(jieba.cut(text, cut_all=False))
print(text1)
def vector_rep(text, corpus_dict):
	vec,vec2 = [],[]
	 for key in corpus_dict.keys():
	 	if key in text:
	 		vec.append((corpus_dict[key], text.count(key)))
	 		 vec2.append(text.count(key))
	 	else:
	 		 vec.append((corpus_dict[key], 0))
	 		 vec2.append(0)
	 		 vec = sorted(vec, key= lambda x: x[0])
	 		 return vec,vec2
	vec1,vec2 = vector_rep(text1, corpus_dict)
print(vec1)
print(vec2)
f.close()


{'自律': 0, '碍': 1, '责任': 2, '平台': 3, '违法': 4, '第一': 5, '主播': 6, '分会': 7, '近期': 8, '第三批': 9, '违规': 10, '演出': 11, '委员会': 12, '组织': 13, '形象': 14, '证据': 15, '行业协会': 16, '炒作': 17, '损害': 18, '会长': 19, '低俗': 20, '网络': 21, '社会': 22, '审核': 23, '讨论': 24, '黑名单': 25, '工作日内': 26, '时间': 27, '评议': 28, '信息': 29, '争议': 30, '俗': 31, '直播': 32, '内容': 33, '正式': 34, '表演': 35, '主体': 36, '协会': 37, '恶意': 38, '引发': 39, '联席会': 40, '列入': 41, '行业': 42, '专家组': 43, '秘书处': 44, '公序良': 45, '申诉': 46, '关注': 47, '承担': 48, '事件': 49, '劣迹': 50, '中国': 51, '上报': 52}
['韦斯特', '一心', '瞄准', '自由市场', ' ', '怎奈', '伤病', '挡路', ' ', '钱途', '渺茫']
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0), (8, 0), (9, 0), (10, 0), (11, 0), (12, 0), (13, 0), (14, 0), (15, 0), (16, 0), (17, 0), (18, 0), (19, 0), (20, 0), (21, 0), (22, 0), (23, 0), (24, 0), (25, 0), (26, 0), (27, 0), (28, 0), (29, 0), (30, 0), (31, 0), (32, 0), (33, 0), (34, 0), (35, 0), (36, 0), (37, 0), (38, 0), (39, 0), (40, 0), (41, 0), (42, 0), (43, 0), (44, 0), (45, 0), (46, 0), (47, 0), (48, 0), (49, 0), (50, 0), (51, 0), (52, 0)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值