NLP-task2

本文介绍了中文分词的基本方法,包括正向最大匹配、逆向最大匹配和双向最大匹配,以及词、字符频率统计。同时,讲解了语言模型中的unigram、bigram和trigram概念,并提到了unigram和bigram的频率统计。最后,讨论了采用词袋模型进行文本矩阵化的步骤,包括分词、去停用词和构造词表。
摘要由CSDN通过智能技术生成

1. 基本文本处理技能

1.1 分词的概念(分词的正向最大、逆向最大、双向最大匹配法);

  • 正向最大匹配
    从左到右将待切分句子的m个字符作为匹配字符,m为初始词典中最长词条的长度。
    将字符与字典中元素进行匹配:
    若匹配成功,则将这个字符作为一个词切分出来
    若匹配不成功,则将这个字符的最后一个字去掉,再进行匹配,重复上述过程,知道切分完整个文本为止。
    举个例子吧:
    假设我们要切分的句子为“南京市长江大桥”,字典中最长的元素长度为5,则先取待切分句子的前5个字符“南京市长江”。字典中没有元素与之匹配,长度减一,则变成“南京市长”,匹配成功。
    对剩余三个字“江大桥”再次进行正向最大匹配,会切成“江”、“大桥”;
    整个句子切分完成为:南京市长、江、大桥;

  • 逆向最大匹配
    逆向最大匹配思想与正向最大匹配基本相同,不同的是将扫描方向变成了从右往左,匹配不成功时,去掉最左边的字符。
    实验表明,逆向最大匹配算法效果要优于正向最大匹配算法。
    “南京市长江大桥”的逆向最大匹配:
    1.取出“南京市长江大桥”的后5个字“市长江大桥”,字典中无匹配元素,将字符“市”去掉,发现词典中有匹配,切割下来;
    2.对剩余的“南京市”进行分词,整体结果为:南京市、长江大桥

  • 双向最大匹配
    双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法。
    还是上面的例子,双向最大匹配的划分结果为:南京市长、南京市、长江大桥、江、大桥。
    这类算法的优点是速度快,时间复杂度为O(n),实现简单;但是对于歧义和未登录词表现不佳。

1.2 词、字符频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)

import re 
from collections import Counter
 
def get_max_value_vl(text):
	text = text.lower()
	result = re.findall('[a-zA-Z0-9]',text) #去掉列表中的符号
	count = Counter(result)                 #词频统计
	count_list = list(count.values())
	max_value = max(count_list)
	max_list = []
	for k,v in count.items():
		if v == max_value:
			max_list.append(k)
	max_list = sorted(max_list)
	return max_list[0]

目前国内针对中文分词有几个比较流行的库:
jieba:基于python语言开发,同时最开始接触的也是这个开源库,整体而言也不错,github上关注度也是最高的;
Yaha:也是基于python语言开发的,跟jieba差不多,貌似功能方面有所改变;
NLPIR:开发语言C/C++/C#/Java;

2. 语言模型

2.1 语言模型中unigram、bigram、trigram的概念;

unigram: 单个word
bigram: 双word
trigram:3 word
比如:
西安交通大学:
unigram 形式为:西/安/交/通/大/学
bigram形式为: 西安/安交/交通/通大/大学
trigram形式为:西安交/安交通/交通大/通大学

2.2 unigram、bigram频率统计;(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)

import collections
import os
import wordCount
base_dir = 'data/cnews'
train_dir = os.path.join(base_dir, 'news.txt')
text = wordCount.read_file(train_dir)
unigram_counter = collections.Counter([text[i] for i in range(0, len(text))])
for k, v in unigram_counter.items():
    print(k, v)
bigram_counter = collections.Counter([(text[i], text[i + 1]) for i in range(0, len(text) - 1)])
for k, v in bigram_counter.items():
    print(k, v)
bigram_counter = collections.Counter([(text[i], text[i + 1], text[i + 2]) for i in range(0, len(text) - 2)])
for k, v in bigram_counter.items():
    print(k, v)

3. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化

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

# -*- coding: utf-8 -*-
from sklearn.feature_extraction.text import TfidfVectorizer
import wordCount
import jieba
# 训练语料集路径
file_obj = open(wordCount.train_dir, "rb")
# 读取持久化后的对象
data_set = file_obj.read()
data_set = data_set.split()
file_obj.close()
sent_words = [list(jieba.cut(sent0)) for sent0 in data_set]
document = [" ".join(sent0) for sent0 in sent_words]
print(document)
tfidf_model = TfidfVectorizer().fit(document)
print(tfidf_model.vocabulary_)
sparse_result = tfidf_model.transform(document)
print(sparse_result)
 
输出结果如下:
['财经', '华夏 大盘 逆势 减仓 近 5% 大多数 基金 一季度 加仓 □ 晨报 记者 \xa0 李锐 在 一片 加仓声 中 , 一季度 减仓 的 基金 备受 市场 关注 , 而 华夏 大盘 就是 其中 一个 。 随着 一 季报 的 披露 , 来自 WIND 资讯 的 统计数据 显示 , 目前 大多数 开放式 偏股 型基金 的 仓位 普遍 上涨 , 平均 涨幅 达到 10 个 百分点 , 几乎 接近 牛市 的 仓位 水平 。 不过 , 作为 市场 里 的 最 赚钱 基金 之一 , 华夏 大盘 的 举动 颇受 关注 , 一季度 不但 没加仓 , 反而 大幅 减仓 近 5% 。 由此 看出 , 基金 对 后市 判断 的 分歧 日益 明显 。 华夏 大盘 仓位 下降 在 整体 乐观 声中 , 基金 的 一季度 股票 仓位 出现 上升 很 正常 , 但 如果 出现 下降 呢 ? 而 仓位 下降 的 基金 , 恰恰 又 是 “ 最 赚钱 基金 经理 ” 王亚伟 掌舵 的 华夏 大盘 呢 ? 刚刚 披露 的 一 季报 显示 , 不同于 大多数 偏股 型基金 , 华夏 大盘 的 股票 仓位 确实 降低 了 。 一 季报 显示 , 截至 3 月 31 日 , 华夏 大盘 的 股票 仓位 为 55.63% , 相比 去年 四季度 末 的 60.41% 的 股票 持仓 &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值