自然语言表达处理笔记01—— 1.正则表达式 2.文本标记化 3.词干提取和词形还原 4.中文分词

正则表达式

  1. 正则表达式使用某种预定义的模式 匹配 具有共同特征的字符串;主要用于处理字符串。完成复杂的查找、替换等要求
  2. 对字符串和特殊字符操作的逻辑公式
  3. 单个字符串描述匹配一系列复合某个句法规则的字符串

搜索过程

拿出表达式和文本中字符比较,若每个字符可成功匹配,则返回成功,反之返回失败。存在多个匹配项则按照搜索设定返回全部或部分返回。

可以使用python中的re模块来进行操作功能

import re
a = re.findall("匹配规则","要匹配的字符串")

正则表达式的一些规则

符号 作用
[] 匹配"[]"中的任意一个字符
^ ^在方框中表示 ”非后面字符开头,在方框外表示以后面字符开头“
$ 以前面字符结尾
? ?表示迁至字符或者无
* *表示前置字符出现0次或者多次
+ +表示前置字符出现1次或者多次
. .表示任意一个字符的通配符
.* .*表示任意字符串
| 表示与前者或者后者匹配
() 用于分组or提高优先级
# 匹配字符串
r = 'wood'
ans = re.search(r, "what's woodchuks")
print(ans) # 

[]

# 匹配【】中所有字符
r = '[Ww]ood'
ans = re.search(r, "Woodchunks and woodchuks")
print(ans) # 

r = '[1-9]'
ans = re.search(r,"is it 012?")
print(ans)# 

^

# ^的用法
r = '[^A-Za]' #放在方框内,表示非后面的字符开头
ans = re.search(r, 'ABCDabc')
print(ans)# 

?

# ?的用法
r = 'woodchucks?' #?前置的第一个字符或者无,这里只考虑s
ans = re.search(r, 'woodchuck and woodchucks')
print(ans)# 

*

# *表示前置字符出现0或多次
r = 'ba*'
text = "bba1 bba@ bbaaa ba?!@3"
ans = re.finditer(r, text)
print(ans)
for i in ans:
    print("%s exists between %d and %d" % (i, i.start(), i.end()))
"""
     exists between 0 and 1
     exists between 1 and 3
     exists between 5 and 6
     exists between 6 and 8
     exists between 10 and 11      
     exists between 11 and 15   
     exists between 16 and 18  
"""

+

r = 'ba+'
text = "a1 ba@ baaa b?!@3"
ans = re.finditer(r, text)
print(ans)
for i in ans:
    print("%s exists between %d and %d" % (i, i.start(), i.end()))
"""
     exists between 3 and 5
     exists between 7 and 11  
"""

^与$在括号外表示首尾

# ^放在【】外,表示以【】内部字符开头
# $表示以前面字符结尾
r = '^[a-z].*e$' #以小写字母开头,e作为结尾
ans = re.search(r, "jam Slade")
print(ans)

优先级

优先级由高到低,Counters 类型比 Sequences and anchors 具有更高的优先级,Sequences and anchors 的优先级高于 disjunction。

类型 符号
Parenthesis ()
Counters *+? {}
Sequences and anchors ^ $
Disjunction |

匹配选择贪婪策略,例如,/[a-z]*/,0次或者多次,然而,正则表达式
匹配最大字符串

匹配

单个字符

character function
. 匹配除了换行符的所有字符
[] 匹配[]中所有字符
\d 匹配数字0-9
\D 匹配非数字
\s 匹配空白,tab与空格
\S 匹配非空白
\w 单词字符,等价于a-z A-Z 0-9
\W 非单词字符,\w的补集
* 匹配前一个字符出现0次或者多次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符0或1次
{m} 匹配前一个字符出现m次
{m,} 匹配前一个字符至少m次
{m,n} 匹配字符出现m到n次(n>=m)
^ 字符串开头
$ 字符串结尾

re提供方法

函数 作用
compile (pattern) 创建模式对象,根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换pattern=re.compile(r’[,./\\?[]\|]’) pattern.split(text)
match(pattern,string) 从字符串开始处匹配模式,返回match对象或者None,或者compile对象的.match(“要匹配的字符串”)
group():result.group() 提取匹配对象的字符串信息
split(pattern,string) 根据模式匹配项分割字符串
sub(pattern,repl,string) 将字符串中所有pat的匹配项用repl替换,返回新字符串
findall(pattern,string) 列出字符串中模式的所有匹配项

文本标记化

字符序列换位标记token序列的过程
词法分析器会对标记分类

  1. 类型:词汇表中的一个词
  2. 标记: 文本中的此

词典和序列
N = 标记个数 V = 词表中类型的个数 ∣ V ∣ : 词表的大小 N = 标记个数\\V=词表中类型的个数\\|V|:词表的大小 N=标记个数V=词表中类型的个数V:词表的大小

文本标记化
分句

使用sent_tokenize

import nltk.tokenize as tk
doc = "How are you? Not bad, what about you? OK."
# 按句拆分,首字母大写,结尾是否有标点
tokens = tk.sent_tokenize(doc)
for i, token in enumerate(tokens):
	print("%2" $ (i+1), token)

分词
使用word_tokenize

tokens = tk.word_tokenize(doc)
tokenizer = tk.WordPunctTokenizer()
tokens = tokenizer.tokenize(doc)
for i, token in enumerate(tokens):
	print("%2" $ (i+1), token)

词干提取和词形还原

词干提取 stemming:am,is,was,been 转化为 be
抽取词的词干或词根形式
leave -> leav

词形还原 lemmatization:plays, played, playing 转化为 play
把一个词汇还原成一般形式,leave => leaf

词干提取

可以使用nltk.stem下的porter,lancaster,snowball库·

porter.PorterStemmer().stem(token)
lancaster.LancasterStemmer().stem(token)
snowball.SnowballStemmer().stem(token)

词形还原

使用nltk.stem

ns.Word.NetLemmatizer()
#有lemmatizer.lemmatizer()函数,第一个放tokne,第二个pos-‘v’表示动词,='n'表示名词

预处理过程

import re
f = open(r"path", 'r')

# 非数字字符符号变为空且字符全小写
pattern = re.compile("[^a-zA-Z0-9\n]")
data = re.sub(pattern, "",date).lower()

# 统计单词词频
import nltk
tokens = nltk.word_tokenize(data) #文本标记化
from nltk.corpus import stopwords
tokens = [w for w in tkens if (w not in stopwords.wors('english)] #去停用词
tokens_pos = tk.pos_tag(tokens) #词性标注

from nltk.stem.porter import PorterStemmer
result.append(PorterStemmer().stem(token))#词干提取

import nltk.stem as ns
lemmatizer = ns.WordNetLemmatizer() 
result.append(lemmatizer.lemmatize(token, pos=postag))# 词形还原

from collections import Counter
Counter(result).most_common(100)
统计排序

中文分词

基于规律:词典

  1. 完全切分
  2. 正向最长匹配
  3. 逆向最长匹配
  4. 双向最长匹配
  5. 最短路径

基于统计

  1. 最大概率
  2. 字标注

评价标准:

  1. 大颗粒度词越多越好
  2. 非词典词和单字词越少越好

结巴分词
支持正、逆、双向三种分词模式

  1. 全模式 句子中所有可以构成词的词语扫描出来,但不解决歧义
  2. 精确模式: 将句子精确分开
  3. 搜索引擎:精确模式基础上,对长词再次划分提高召回率
import jieba
jieba.cut(text, cut_all = Ture)#全模式
jieba.cut(text, cut_all = False)# 精确模式
# cut_all默认是False
jieba.cut_for_search(text) # 搜索引擎

你可能感兴趣的:(NLP,正则表达式,中文分词,自然语言处理)