基本文本处理技能

1. 基本文本处理技能

1.1 分词的概念
分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行的一种技术。当然,我们在进行数据挖掘、精准推荐和自然语言处理工作中也会经常用到中文分词技术。
我们讨论的分词算法可分为三大类:基于字典、词库匹配的分词方法;基于词频度统计的分词方法和基于字标注的分词方法。

分词的正向最大 (Maximum Matching):
从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词。但这里有一个问题:要做到最大匹配,并不是第一次匹配到就可以切分的 。我们来举个例子:

       待分词文本:   content[]= {"中","华","民","族","从","此","站","起","来","了","。"}
       词表:   dict[]={"中华", "中华民族" , "从此","站起来"}

(1) 从content[1]开始,当扫描到content[2]的时候,发现"中华"已经在词表dict[]中了。但还不能切分出来,因为我们不知道后面的词语能不能组成更长的词(最大匹配)。

(2) 继续扫描content[3],发现"中华民"并不是dict[]中的词。但是我们还不能确定是否前面找到的"中华"已经是最大的词了。因为"中华民"是dict[2]的前缀。

(3) 扫描content[4],发现"中华民族"是dict[]中的词。继续扫描下去:

(4) 当扫描content[5]的时候,发现"中华民族从"并不是词表中的词,也不是词的前缀。因此可以切分出前面最大的词——“中华民族”。

由此可见,最大匹配出的词必须保证下一个扫描不是词表中的词或词的前缀才可以结束。

逆向最大:逆向最大匹配分词是中文分词基本算法之一,因为是机械切分,所以它也有分词速度快的优点,且逆向最大匹配分词比起正向最大匹配分词更符合人们的语言习惯。逆向最大匹配分词需要在已有词典的基础上,从被处理文档的末端开始匹配扫描,每次取最末端的i个字符(分词所确定的阈值i)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。而且选择的阈值越大,分词越慢,但准确性越好。
逆向最大举例

第1轮扫描:“在野生动物园玩”

第1次:“在野生动物园玩”,扫描7字词典,无

第2次:“野生动物园玩”,扫描6字词典,无

。。。。

第7次:“玩”,扫描1字词典,有

扫描中止,输出“玩”,单字字典词加1,开始第2轮扫描

第2轮扫描:“们在野生动物园”

第1次:“们在野生动物园”,扫描7字词典,无

第2次:“在野生动物园”,扫描6字词典,无

第3次:“野生动物园”,扫描5字词典,有

扫描中止,输出“野生动物园”,开始第3轮扫描

第3轮扫描:“我们在”

第1次:“我们在”,扫描3字词典,无

第2次:“们在”,扫描2字词典,无

第3次:“在”,扫描1字词典,有

扫描中止,输出“在”,单字字典词加1,开始第4轮扫描

第4轮扫描:“我们”

第1次:“我们”,扫描2字词典,有

扫描中止,输出“我们”,整体扫描结束。

逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,单字字典词为2,非词典词为0。

双向最大匹配法 正向最大匹配法和逆向最大匹配法,都有其局限性,我举得例子是正向最大匹配法局限性的例子,逆向也同样存在(如:长春药店,逆向切分为“长/春药店”),因此有人又提出了双向最大匹配法,双向最大匹配法。即,两种算法都切一遍,然后根据大颗粒度词越多越好,非词典词和单字词越少越好的原则,选取其中一种分词结果输出。

如:“我们在野生动物园玩”

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”,其中,两字词3个,单字字典词为2,非词典词为1。

逆向最大匹配法,最终切分结果为:“我们/在/野生动物园/玩”,其中,五字词1个,两字词1个,单字字典词为2,非词典词为0。

非字典词:正向(1)>逆向(0)(越少越好)

单字字典词:正向(2)=逆向(2)(越少越好)

总词数:正向(6)>逆向(4)(越少越好)

因此最终输出为逆向结果。

1.2 词、字符频率统计

import collections

str = "What a pity dog, get out and get away."
str = str.lower().split(" ")
m = collections.Counter(str)
print(m)

Counter({‘get’: 2, ‘what’: 1, ‘a’: 1, ‘pity’: 1, ‘dog,’: 1, ‘out’: 1, ‘and’: 1, ‘away.’: 1})

2.1 语言模型中nigram、bigram、trigram的概念
n-gram:
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的TriGram。
unigram: 一元模型
在这里插入图片描述
bigram: 二元的Bi-Gram
在这里插入图片描述
trigram: 三元的TriGram
在这里插入图片描述
2.2 unigram、bigram频率统计
(可以使用Python中的collections.Counter模块,也可以自己寻找其他好用的库)
3. 文本矩阵化:要求采用词袋模型且是词级别的矩阵化
步骤有:
3.1 分词、去停用词;
使用Numpy进行英文的分词和去停用词

import json
import re
import os
from multiprocessing.pool import Pool
import Numpy
import EncrypFile
pattern = re.compile(r'[\u4e00-\u9fa5\/\\‘’!?,。“”…—\(\)–;*#‐%$&:?:!(.txt).,\-\'|\\\"\[\]]+', re.S)

def GenerateKeywords(filename):
    f = open('VOA2/' + filename, 'r',encoding='utf-8')
    print(filename)
    sentence=f.read()
    f.close()
    print(sentence)
    sentence = sentence.replace('\\n', ' ')
    sentence = re.sub(pattern, '', sentence)
    ###分词
    tokens = Numpy.divide_word(sentence)
    ###词干提取
    porter_stem_tokens = Numpy.word_stem(tokens)
    ###词性归并
    wordnet_lematizer_tokens = Numpy.word_lematizer(porter_stem_tokens)
    ###去掉停用词
    stop_words_tokens = Numpy.delete_stopwords(wordnet_lematizer_tokens)
    # print(stop_words_tokens)
    f=open('VOA3/'+filename,'w',encoding='utf-8')
    f.write(json.dumps(stop_words_tokens))
    f.close()

if __name__=='__main__':
    pool=Pool(10)
    for parents,dirnames,filenames in os.walk('VOA2/'):
        filename=[x for x in filenames]
        pool.map(GenerateKeywords,filename)
        pool.close()
        pool.join()

3.2 构造词表:

3.3 每篇文档的向量化。

from sklearn.feature_extraction.text import CountVectorizer  
vectorizer=CountVectorizer()
corpus=["import collections", 
    "str = \"What a pity dog, get out and get away.\"",          
    "str = str.lower().split(\" \") ",   
    "m = collections.Counter"] 
print(vectorizer.fit_transform(corpus)) 
print(vectorizer.fit_transform(corpus).toarray()) 
print(vectorizer.get_feature_names())

(0, 2) 1
(0, 6) 1
(1, 1) 1
(1, 0) 1
(1, 8) 1
(1, 5) 2
(1, 4) 1
(1, 9) 1
(1, 12) 1
(1, 11) 1
(2, 10) 1
(2, 7) 1
(2, 11) 2
(3, 3) 1
(3, 2) 1
[[0 0 1 0 0 0 1 0 0 0 0 0 0]
[1 1 0 0 1 2 0 0 1 1 0 1 1]
[0 0 0 0 0 0 0 1 0 0 1 2 0]
[0 0 1 1 0 0 0 0 0 0 0 0 0]]
[‘and’, ‘away’, ‘collections’, ‘counter’, ‘dog’, ‘get’, ‘import’, ‘lower’, ‘out’, ‘pity’, ‘split’, ‘str’, ‘what’]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值