一.NLP基础技能

python里的基本操作

字符串操作

去空格及特殊符号

s = 'hello, world!'
print(s.strip())  # 去掉两边的空格
print(s.lstrip('hello, '))  # 去掉左侧字符
print(s.rstrip('!')) # 去掉右侧字符

hello, world
world!
hello, world

连接字符串

s1 = 'stracat'
s2 = 'append'
s1 = s1 + s2
print(s1)

strcatappend

查找字符

s1 = 'strcat'
s2 = 'r'
n = s1.index(s2)
print(n)

2

比较字符串

s1 = 'strchr'
s2 = 'strch'
print(cmp(s1,s2))
print(cmp(s2,s1))
print(cmp(s1,s1))

-1
1
0

大小写转换

s1 = 'HJIh'
s1= s1.upper()
#s1 = s1.lower()
print(s1)

HJIH

翻转字符串

s1 = 'abc'
s1 = s1[::-1]
print(s1)

cba

查找字符串

s1 = 'abcde'
s2 = 'cde'
print(s1.find(s2))

2

分割字符串

s1 = 'ab,cde,fgh,ijk'
s2 = ','
s1 = s1[s1.find(s2) + 1 :]
print(s1)
s = 'ab,cde,fgh,ijk'
print(s.split(',')) # 分成列表

cde,fgh,ijk
[‘ab’,‘cde’,‘fgh’,‘ijk’]

统计字符串中出现频次最多的字母

import re
from collections import Counter
def get_max_value_v1(text):
	text = text.lower() # 全部小写
	result = re.findall('[a-zA-z]',text) #运用正则表达式提取出去全部的字母(列表形式)
	count = Counter(result) # counter的作用就是在数组中遍历所有的元素并将元素的个数记下,生成的为一个字典的格式
	count_list = list(count.values())
	max_value = max(count_list) # 已经找到最大的词频了
	max_list = []
	for k,v in count.items(): # 目的是找这个最大词频在字典中对应的位置
		if v == max_value:
			max_list.append(k)
	max_list = sorted(max_list)
	return max_list[0]
		
from collections import Counter
def get_max_value(text):
	count = Counter([x for x in text.lower() if x.isapha()]) # isapha为判断是否为英文字母
	m = max(count.values())
	return sorted([x for (x,y) in count.items() if y == m])[0]
import string
def get_max_value(text):
	text = test.lower()
	return max(string.ascii_lowercase, key = text.count)

正则表达式

用来匹配出符合某种形式的词语,例如邮箱;
在线验证工具:regexr.com/

. 除去换行符之外的
\d 数字
\D 除了数字之外的
\s 空白字符
\S 除了空格之外
\w 单词字符
\W 非单词字符
\d{2}两个两个找数字 \d{2,4}有四个找四个,没四个找三个,没三个找两个

\?表示前一个字符/组合匹配一次或0次 与{0,1}的效果等价
* 表示前一个字符可以是无限次
+ 至少出现一次

[]l里放字符集,这里没有顺序之分
^和$分别表示开始和结束 ^h.*g$表示以h开头g结束,中间可以是任意多
| 表示或关系
()分组,会自动编号 (…).*\1代表最前面的三个字符在后面又出现过一次,中间可以有随机多个字符

re模块

步骤:
1.将正则表达式的字符串形式编译为pattern实例;
2.使用pattern实例处理文本并获得匹配结果
3使用match实例获得信息,进行其他的操作

import re
pattern = re.complie(rhello.*\!') # complie编译pattern
match = pattern.match('hello,hanxiaoyang! How are you ?') # 匹配字符串
# match = re.match(rhello.*\!','hello,hanxiaoyang! How are you ?') 一样
if match:
	print match.gruop()

split分割

import re
p = re.complie(r'/d')
print(p.split('one1two2three3four4'))

[‘one’,‘two’,‘three’,‘four’]

findall搜索

import re
p = re.complie(r'/d')
print(p.findall('one1two2three3four4'))

[‘1’,‘2’,‘3’,‘4’]

sub替换

import re
p = re.complie(r'(\w+)(\w+)')
s = 'i say, hello hanxiaoyang'
print(p.sub(r'\2 \1',s)) # 分组互换位置

say i, hanxiaoyang hello

jieba中文处理

https://pypi.org/project/jieba/

基本分词函数

jieba.cut

三个输入参数:
1.需要分词的字符串
2.cut_all参数用来控制是否采用全模式
3.HMM参数用来控制是否使用HMM模型

jieba.cut_for_search (搜索引擎模式)

输入参数:
1.需要分词的字符串
2.是否使用HMM模型

import jieba
seg_list = jieba.cut("我在学习自然语言处理", cut_all = True)
print(seg_list)
# 我/在/学习/自然/语言/自然语言/处理
seg_list - jieba.cut("我在学习自然语言处理", cut_all = False) # 默认
print(seg_list)
# 我/在/学习/自然语言/处理

jieba.lcut和jieba.lcut_for_search直接返回list

添加用户自定义字典

jieba,load_userdict(file_name)加在用户字典
少量词汇可以自己用下面的方法手动添加:用add_word和del_word

关键词提取

基于TF-IDF算法的关键词抽取

用一个词出现的频次当做该词的重要程度判别
最理想的情况是,在某个文档内的词频很高,而喊这个词的文档却不多
jieba.analyse.extract_tags(sentence, topK=20, withWeight =False, alloePOS=())
sentence为代提取的文本
topK为返回几个TF-IDF权重最大的关键词。默认值20
withWeight为是否一并返回关键词权重值
allowPOS仅包括指定词性的词,默认为空

import jieba.ananlyse as analyse
lines = open('NBA.txt').read()
print("".join(analyse.extract_tags(lines, topK = 20, withWeigh =False, allowPOS=())))
textRank可以用来判别词性

jieba.ananlyse.textrank(sentence,topK=20,withWeigh=Flase,allowPOS=(‘ns’,‘n’,‘vn’,‘v’))直接使用
jieba.analyse.TextRank()新建自定义TextRank
算法论文《TextRank:Bringing Order into Texts》

词性标注

jieba.posseg.POSTokenizer(tokenizer=None)新建自定义分词器,tokenizer参数可指定内部使用的jieba.Tokenizer分词器,jieba.posseg.dt为默认词性标注分词器
标注句子分词后没歌词的词性,采用和ictclas兼容的标记法

import jieba.posseg as pseg
words = pseg.cut("我爱自然语言处理")
for word,flag in wprds:
	print('%s %s '% (word ,flag))

我 r
爱 v
自然语言 l
处理 v

并行分词(linux,mac)

jieba.enable_parallel(4) 开启并行分词,参数为并行进程数
jieba.disable_parallel() 挂你并行分词模式

Tokenize:返回词语在原文的起止位置
result= jieba.tokenize()
for tk in result:
	print("%s\t\t start : %d \t\t end :%d" % (tk[0],tk[1],tk[2])) # 返回定位信息
ChineseAnlyzer for Whoosh搜索引擎

from jieba.anallyse import ChinseseAnalzer

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值