初识nlp (1 (分词

1 nltk知识
Python上著名的自然语处理库。带语料库,词性分类库。 带分类,分词,等等功能

pip install -U nltk   

安装语料库

import nltk 
  nltk.download() 

功能

简易处理流程图
这里写图片描述

2 tokenize分词

>>> import nltk 
>>> tokens = nltk.word_tokenize(“hello, world" ) 
>>> tokens 
 ['hello', ‘,', 'world'] 

中文分词与英文有差别 :今天 today

中文分词可用 jieba
例子
import jieba
seg_list = jieba.cut(“我来到北京清华大学”, cut_all=True)
print “Full Mode:”, “/ “.join(seg_list) # 全模式
我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

seg_list = jieba.cut(“我来到北京清华大学”, cut_all=False)
print “Default Mode:”, “/ “.join(seg_list) # 精确模式
我/ 来到/ 北京/ 清华大学
seg_list = jieba.cut(“他来到了网易杭研大厦”) # 默认是精确模式
print “, “.join(seg_list)
他, 来到, 了, 网易, 杭研, 大厦
seg_list = jieba.cut_for_search(“小明硕士毕业于中国科学院计算所,后在日本京都大学深造”)
print “, “.join(seg_list)
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

但tokenize会遇到不好办的时候,遇到表情或是html等

from nltk.tokenize import word_tokenize 
tweet = 'RT @angelababy: love you baby! :D http://ah.love #168cm' 
print(word_tokenize(tweet)) 
# ['RT', '@', 'angelababy', ':', 'love', 'you', 'baby', '!', ':', 
# ’D', 'http', ':', '//ah.love', '#', '168cm']

http://www.regexlab.com/zh/regref.htm 详情
需要用到正则表达式
[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,’0_Z’,’Py3000’等等;

[a-zA-Z_][0-9a-zA-Z_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

[a-zA-Z_][0-9a-zA-Z_]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

(P|p)ython可以匹配’Python’或者’python’

^表示行的开头,^\d表示必须以数字开头。

\d 表示必须以数字结束。

python中用 re模块使用正则表达式

切分字符串

用正则表达式切分字符串比用固定的字符更灵活,请看正常的切分代码:

>>> 'a b   c'.split(' ')
['a', 'b', '', '', 'c']

正则

>>> re.split(r'\s+', 'a b   c')
['a', 'b', 'c']
>>> re.split(r'[\s\,\;]+', 'a,b;; c  d')
['a', 'b', 'c', 'd']

用()表示的就是要提取的分组(Group)

m = re.match(r’^(\d{3})-(\d{3,8})$’, ‘010-12345’)
m
<_sre.SRE_Match object; span=(0, 9), match=’010-12345’>
m.group(0)
‘010-12345’
m.group(1)
‘010’
m.group(2)
‘12345’

正则表达式\d+默认贪婪匹配 用\d+? 非贪婪

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')

在此 对社交网络语言 tokenize

import re
r'<[^>]+>', # HTML tags
r'(?:@[\w_]+)', # @某⼈
r"(?:\#+[\w_]+[\w\'_\-]*[\w_]+)", # 话题标签
r'http[s]?://(?:[a-z]|[0-9]|[$-_@.&amp;+]|[!*\(\),]|(?:%[0-9a-f][0-9a-f]))+',     # URLs
r'(?:(?:\d+,?)+(?:\.?\d+)?)', # 数字
r"(?:[a-z][a-z'\-_]+[a-z])", # 含有 - 和 ‘ 的单词
r'(?:[\w_]+)', # 其他
r'(?:\S)' # 其他
tokens_re = re.compile(r'('+'|'.join(regex_str)+')', re.VERBOSE | re.IGNORECASE)
emoticon_re = re.compile(r'^'+emoticons_str+'$', re.VERBOSE | re.IGNORECASE)

def tokenize(s):
    return tokens_re.findall(s)

def preprocess(s, lowercase=False):
    tokens = tokenize(s)
    if lowercase:
        tokens = [token if emoticon_re.search(token) else token.lower() for token in 
tokens]
    return tokens

tweet = 'RT @angelababy: love you baby! :D http://ah.love #168cm'
print(preprocess(tweet))
# ['RT', '@angelababy', ':', 'love', 'you', 'baby', 
# ’!', ':D', 'http://ah.love', '#168cm']

用正则表达式 tokenize 网络语言

3、词性归一(对英文有需要

Stemming 就是把不影响词性的inflection的尾巴砍掉
walking 砍ing = walk

Lemmatization 词形归一:把各种类型的词的变形,
went 归一 = go

NLTK实现Stemming

>>> from nltk.stem import SnowballStemmer
>>> snowball_stemmer = SnowballStemmer(“english”)
>>> snowball_stemmer.stem(‘maximum’)
u’maximum’
>>> snowball_stemmer.stem(‘presumably’)
u’presum’

NLTK实现Lemma

>>> from nltk.stem import WordNetLemmatizer
>>> wordnet_lemmatizer = WordNetLemmatizer()
>>> wordnet_lemmatizer.lemmatize(‘dogs’)
u’dog’
>>> wordnet_lemmatizer.lemmatize(‘churches’)
u’church’
>>> wordnet_lemmatizer.lemmatize(‘is’, pos=’v’)
u’be’

词性默认n,加上pos=v,将词性改成v

NLTK标注POS

>>> import nltk
>>> text = nltk.word_tokenize('what does the fox say')
>>> text
['what', 'does', 'the', 'fox', 'say']
>>> nltk.pos_tag(text)
[('what', 'WDT'), ('does', 'VBZ'), ('the', 'DT'), ('fox', 'NNS'), ('say', 'VBP')]

NLTK去除stopwords
首先下载词库 nltk.download(‘stopwords’)

from nltk.corpus import stopwords
# 先token⼀把,得到⼀个word_list
# 然后filter⼀把
filtered_words = 
[word for word in word_list if word not in stopwords.words('english')]

预处理后的效果

4、简单应用
情感分析
配上ML的情感分析

文本相似度
元素频率表达本特征

# 借⽤NLTK的FreqDist统计⼀下⽂字出现的频率
fdist = FreqDist(tokens)
# 最常用的50个单词拿出来
standard_freq_vector = fdist.most_common(50)
# Func: 按照出现频率⼤⼩, 记录下每⼀个单词的位置
def position_lookup(v):
    res = {}
    counter = 0
    for word in v:
        res[word[0]] = counter
        counter += 1
    return res
# 把标准的单词位置记录下来
standard_position_dict = position_lookup(standard_freq_vector)
print(standard_position_dict)
# 得到⼀个位置对照表
# {'is': 0, 'the': 3, 'day': 4, 'this': 1,
# 'sentence': 5, 'my': 2, 'life': 6}

文本分类
TF: Term Frequency, 衡量⼀个term在⽂档中出现得有多频繁。
TF(t) = (t出现在⽂档中的次数) / (⽂档中的term总数).
IDF: Inverse Document Frequency, 衡量term有多重要。
把罕见的词的重要性(weight)高,
把常见词的重要性低。
IDF(t) = log_e(文档总数 / 含有t的文档总数).
TF-IDF = TF * IDF

from nltk.text import TextCollection
# 自动帮你断句, 做统计, 做计算
corpus = TextCollection(['this is sentence one', 
                        'this is sentence two', 
                        'this is sentence three'])
# 直接就能算出tfidf
# (term: 一句话中的某个term, text: 这句话)
print(corpus.tf_idf('this', 'this is sentence four'))
# 0.444342

# 对于每个新句⼦
new_sentence = 'this is sentence five'
# 遍历一遍所有的vocabulary中的词:
for word in standard_vocab:
    print(corpus.tf_idf(word, new_sentence))
    # 会得到(=所有vocab长度)的向量
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值