特征提取
一、基本文本处理
1. 分词
- 分词即将句子拆分成常见的词语组合。
- 中文分词根据实现原理和特点,主要分为基于词典分词算法和基于统计的机器学习算法。
- 我们主要讨论基于词典分词算法的方法:正向最大匹配法、逆向最大匹配法和双向匹配分词法。
1.1 正向最大匹配法
- 从左到右将待分词文本中的几个连续字符与词典匹配,如果匹配上,则切分出一个词。
例子:
待分词文本: content[]={"中","华","民","族","从","此","站","起","来","了","。"}
词表: dict[]={"中华","民族", "中华民族" , "从此","站起来"}
(1) 从content[1]开始,当扫描到content[2]的时候,发现"中华"已经在词表dict[]中了。但还不能切分出来,因为我们不知道后面的词语能不能组成更长的词(最大匹配)。
(2) 继续扫描content[3],发现"中华民"并不是dict[]中的词。但是我们还不能确定是否前面找到的"中华"已经是最大的词了。因为"中华民"是dict[2]的前缀。
(3) 扫描content[4],发现"中华民族"是dict[]中最长的词,切分。取"从此站起来了"继续扫描下去。
1.2 逆向最大匹配法
- 从右到左将待分词文本中的几个连续字符与词典匹配,如果匹配上,则切分出一个词。
例子:
待分词文本: content[]={"中","华","民","族","从","此","站","起","来","了","。"}
词表: dict[]={"中华","民族", "中华民族" , "从此","站起来"}
(1) 从content[1]开始,当扫描到content[2]的时候,发现"华民族从此站起来了"不在词表dict[]中。继续扫描content[3]、content[4]等。
(2) 继续扫描content[10],发现"了"并不是dict[]中的词,判断"了"是生词。去除"了"以后重复步骤1。
(3) 扫描content[6],发现"站起来"是dict[]中的词,切分。取"中华民族从此"继续扫描下去:
1.3 双向最大匹配法
- 两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词(未登录词)和单字词越少越好的原则,选取其中一种分词结果输出。
2. 词、字符频率统计
1. Collections库的使用
from collections import Counter
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
print(cnt.most_common()) #[('blue', 3), ('red', 2), ('green', 1)]
cnt = Counter()
for char in 'hellllooeooo':
cnt[char] += 1
print(cnt.most_common()) #[('o', 5), ('l', 4), ('e', 2), ('h', 1)]
# 读取文本文件,把所有的汉字拆成一个list
f = open("jieba_text.txt", 'r', encoding='utf8') # 打开文件,并读取要处理的大段文字
txt1 = f.read()
txt1 = txt1.replace('\n', '') # 删掉换行符
txt1 = txt1.replace(',', '') # 删掉逗号
txt1 = txt1.replace('。', '') # 删掉句号
mylist = list(txt1)
mycount = collections.Counter(mylist)
for key, val in mycount.most_common(10): # 有序(返回前10个)
print(key, val)
2. jieba库的使用
import jieba
import jieba.analyse
# text = "故宫的著名景点包括乾清宫、太和殿和午门等。其中乾清宫非常精美,午门是紫禁城的正门,午门居中向阳。"
text = ''
#jieba.load_userdict("jieba_dict.txt") # 用户自定义词典 (用户可以自己在这个文本文件中,写好自定制词汇)
f = open('jieba_text.txt', 'r', encoding='utf8') # 要进行分词处理的文本文件 (统统按照utf8文件去处理,省得麻烦)
lines = f.readlines()
for line in lines:
text += line
# seg_list = jieba.cut(text, cut_all=False) #精确模式(默认是精确模式)
seg_list = jieba.cut(text) # 精确模式(默认是精确模式)
print("[精确模式]: ", "/ ".join(seg_list))
# seg_list2 = jieba.cut(text, cut_all=True) #全模式
# print("[全模式]: ", "/ ".join(seg_list2))
# seg_list3 = jieba.cut_for_search(text) #搜索引擎模式
# print("[搜索引擎模式]: ","/ ".join(seg_list3))
tags = jieba.analyse.extract_tags(text, topK=5)
print("关键词: ", " / ".join(tags))
二、语言模型
1、统计语言模型
语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,...Wk)。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。举个音字转换的例子来说,输入拼音串为nixianzaiganshenme,对应的输出可以有多种形式,如你现在干什么、你西安再赶什么、等等,那么到底哪个才是正确的转换结果呢,利用语言模型,我们知道前者的概率大于后者,因此转换成前者在多数情况下比较合理。
给定句子(词语序列)S=W1,W2,...,Wk, 它的概率可以表示为:
2、 n-gram语言模型
n-gram模型也称为n-1阶马尔科夫模型,它有一个有限历史假设:当前词的出现概率仅仅与前面n-1个词相关。因此统计语言模型中的P(S)可以近似为:
参考链接:
https://blog.csdn.net/mspinyin/article/details/6137815
https://blog.csdn.net/eastmount/article/details/50256163
https://hxraid.iteye.com/blog/667134