TaskTwo-20190304

特征提取


一、基本文本处理

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, 它的概率可以表示为:

由于上式中的参数过多,因此需要近似的计算方法。常见的方法有n-gram模型方法、决策树方法、最大熵模型方法、最大熵马尔科夫模型方法、条件随机域方法、神经网络方法,等等。

2、 n-gram语言模型

n-gram模型也称为n-1阶马尔科夫模型,它有一个有限历史假设:当前词的出现概率仅仅与前面n-1个词相关。因此统计语言模型中的P(S)可以近似为:

当n取1、2、3时,n-gram模型分别称为unigram、bigram和trigram语言模型。n-gram模型的参数就是条件概率P(Wi|Wi-n+1,...,Wi-1)。假设词表的大小为100,000,那么n-gram模型的参数数量为100,000n。n越大,模型越准确,也越复杂,需要的计算量越大。最常用的是bigram,其次是unigram和trigram,n取≥4的情况较少。

参考链接:
https://blog.csdn.net/mspinyin/article/details/6137815
https://blog.csdn.net/eastmount/article/details/50256163
https://hxraid.iteye.com/blog/667134

你可能感兴趣的:(TaskTwo-20190304)