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

本文介绍正则表达式的使用方法及Python中的应用实践,包括基本符号、匹配规则、贪婪策略等,并通过实例演示如何进行字符串匹配、分组、替换等操作。
部署运行你感兴趣的模型镜像

正则表达式

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

搜索过程

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

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

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

正则表达式的一些规则

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

[]

# 匹配【】中所有字符
r = '[Ww]ood'
ans = re.search(r, "Woodchunks and woodchuks")
print(ans) # <re.Match object; span=(0, 4), match='Wood'>

r = '[1-9]'
ans = re.search(r,"is it 012?")
print(ans)# <re.Match object; span=(7, 8), match='1'>

^

# ^的用法
r = '[^A-Za]' #放在方框内,表示非后面的字符开头
ans = re.search(r, 'ABCDabc')
print(ans)# <re.Match object; span=(5, 6), match='b'>

?

# ?的用法
r = 'woodchucks?' #?前置的第一个字符或者无,这里只考虑s
ans = re.search(r, 'woodchuck and woodchucks')
print(ans)# <re.Match object; span=(5, 6), match='b'>

*

# *表示前置字符出现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()))
"""
    <re.Match object; span=(0, 1), match='b'> exists between 0 and 1
    <re.Match object; span=(1, 3), match='ba'> exists between 1 and 3
    <re.Match object; span=(5, 6), match='b'> exists between 5 and 6
    <re.Match object; span=(6, 8), match='ba'> exists between 6 and 8
    <re.Match object; span=(10, 11), match='b'> exists between 10 and 11      
    <re.Match object; span=(11, 15), match='baaa'> exists between 11 and 15   
    <re.Match object; span=(16, 18), match='ba'> 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()))
"""
    <re.Match object; span=(3, 5), match='ba'> exists between 3 and 5
    <re.Match object; span=(7, 11), match='baaa'> 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次或者多次,然而,正则表达式
匹配最大字符串

匹配

单个字符

characterfunction
.匹配除了换行符的所有字符
[]匹配[]中所有字符
\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) # 搜索引擎

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值