哨兵模式 object github Movejs ddos压力测试 nginx视频教程 安卓项目实战 华为路由器ipv6配置 mysql倒序 oracle查看数据库 mac脚本编辑器 python生成多个随机数 python高级教程 python库 python中的循环 python如何调用函数 python用什么ide javafile java中接口的定义 java字符串格式化 ILspy beatedit bash命令 su版本转换器 pdf拆分工具 dep 超级力量2修改 计价软件 微信昵称找人的软件 脚本列表 dos系统下载 文字图片制作 苹果手机耳机没声音 卧龙推广 cad打散 清华天河 mysql退出命令 edius调色 ai投影 图片格式太大怎么变小
当前位置: 首页 > 学习教程  > python

nlp理论基础

2021/2/8 12:35:23 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

七月在线视频教程博客教程 文章目录基础NLTK库文本处理流程分词Tokenize社交网洛中的Tokenize词形问题词干提取(stemming)词形归并(lemmatization)词性标注去除StopWords典型的文本预处理流程NLTK应用情感分析简单配上ML(machine learning)的情感分析文本…

七月在线视频教程+博客教程

文章目录

    • 基础
      • NLTK库
      • 文本处理流程
        • 分词Tokenize
          • 社交网洛中的Tokenize
        • 词形问题
          • 词干提取(stemming)
          • 词形归并(lemmatization)
          • 词性标注
          • 去除StopWords
        • 典型的文本预处理流程
      • NLTK应用
        • 情感分析
          • 简单配上ML(machine learning)的情感分析
        • 文本相似度
          • Frequency频率统计
        • 文本分类

基础

以nltk为基础配合讲解自然语言处理的原理

NLTK库

自然语言处理库
pip install nltk
//pip install numpy

安装完之后安装语料库
import nltk
nltk.download()

corpus语料库

import nltk
from nltk.corpus import brown # 需要下载brown语料库
# 引用布朗大学的语料库
# 查看语料库包含的类别
print(brown.categories())
# 查看brown语料库
print('共有{}个句子'.format(len(brown.sents())))
print('共有{}个单词'.format(len(brown.words())))

文本处理流程

预处理(Preprocess)

在这里插入图片描述

分词Tokenize

  • 将句子拆分成具有语言语义学上意义的词
  • 中、英文分词区别:
    • 英文中,单词之间是以空格作为自然分界符的

    • 中文中没有一个形式上的分界符(空格),分词比英文复杂的多

    • 中文分词工具,如:结巴分词 pip install jieba

    • 英文分词
      在这里插入图片描述

    • 中文分词

      • 启发式:对照字典表
      • 机器学习/统计方法:HMM、CRF
      • 中文分词工具:jieba分词
        在这里插入图片描述
  • 得到分词结果后,中英文的后续处理没有太大区别

Tokenize不一定那么简单,当遇到社交网络中常用于的时候,😄 例如这个常用语,直接分类就会直接拆分。我们需要使用正则表达式

社交网洛中的Tokenize

社交网络中的tokenize:需要用到正则表达式
1、不使用正则表达式
在这里插入图片描述
2、使用正则表达式
在这里插入图片描述在这里插入图片描述

词形问题

  • look, looked, looking
  • 影响语料学习的准确度
  • 词形归一化
词干提取(stemming)

把不影响词性的小尾巴砍掉
NLTK实现stemming

PorterStemmer, SnowballStemmer, LancasterStemmer

在这里插入图片描述
在这里插入图片描述

词形归并(lemmatization)

把各种类型的词变形,都归在同一个形式
am, is, are -> be, went->go

nltk实现lemmatization

WordNetLemmatizer

在这里插入图片描述
Lemmatization有一个小问题:
went是动词的时候,go的过去式。名词的话,可以是人名温特

指明词性可以更准确地进行lemma,POS_Tag默认为n,添加之后就可以进行词性标注

在这里插入图片描述

词性标注

pos_tag对单词的词性进行标记在这里插入图片描述

去除StopWords

判断相似度、关键字判断时候不需要去除停止词

  • 为节省存储空间和提高搜索效率,NLP中会自动过滤掉某些字或词
  • 停用词都是人工输入、非自动化生成的,形成停用词表
  • 分类
    • 语言中的功能词,如the, is…
    • 词汇词,通常是使用广泛的词,如want
  • 中文停用词表
    • 中文停用词库
    • 哈工大停用词表
    • 四川大学机器智能实验室停用词库
    • 百度停用词列表
  • 其他语言停用词

http://www.ranks.nl/stopwords

使用NLTK去除停用词

stopwords.words()

在这里插入图片描述

典型的文本预处理流程

import nltk
from nltk.stem import WordNetLemmatizer
from nltk.corpus import stopwords

# 原始文本
raw_text = 'Life is like a box of chocolates. You never know what you\'re gonna get.'
# 分词
raw_words = nltk.word_tokenize(raw_text)
# 词形归一化
wordnet_lematizer = WordNetLemmatizer()
words = [wordnet_lematizer.lemmatize(raw_word) for raw_word in raw_words]
# 去除停用词
filtered_words = [word for word in words if word not in stopwords.words('english')]
print('原始文本:', raw_text)
print('预处理结果:', filtered_words)

在这里插入图片描述
其他案例

import nltk
from nltk.tokenize import WordPunctTokenizer

sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')  
paragraph = "The first time I heard that song was in Hawaii on radio.  I was just a kid, and loved it very much! What a fantastic song!"  

# 分句
sentences = sent_tokenizer.tokenize(paragraph) 
print(sentences)

sentence = "Are you old enough to remember Michael Jackson attending. the Grammys with Brooke Shields and Webster sat on his lap during the show?"  

# 分词
words = WordPunctTokenizer().tokenize(sentence.lower())  
print(words)

执行结果

['The first time I heard that song was in Hawaii on radio.', 'I was just a kid, and loved it very much!', 'What a fantastic song!']

['are', 'you', 'old', 'enough', 'to', 'remember', 'michael', 'jackson', 'attending', '.', 'the', 'grammys', 'with', 'brooke', 'shields', 'and', 'webster', 'sat', 'on', 'his', 'lap', 'during', 'the', 'show', '?']

NLTK应用

自然语言处理,是通过特征工程将自然语言变成计算机数据
通过预处理之后得到的词组,进行特征话化
应用:

  • 情感分析
  • 文本相似度
  • 文本分类
  • 分类预测模型:朴素贝叶斯

情感分析

sentiment dictionary
基于关键词打分机制

import nltk

words=nltk.word_tokenize("i like python is a widely used programming language")#样例
sentiment_dictionary={}
for line in open('./AFINN/AFINN-111.txt'):#写入打分表
    word,score=line.split('\t')
    sentiment_dictionary[word]=int(score)
total_score=sum(sentiment_dictionary.get(word,0) for word in words)
print(total_score)

没有办法进行新词,特殊词汇等等

简单配上ML(machine learning)的情感分析
from nltk.classify import NaiveBayesClassifier#贝叶斯分类
s1='this is a good book'
s2='this is a awesome book'
s3='this is a bad book'
s4='this is a terrible book'
def preprocess(s):
    return{word: True for word in s.lower().split()}
    # return⻓这样:
	# {'this': True, 'is':True, 'a':True, 'good':True, 'book':True}
	# 其中, 前⼀个叫fname, 对应每个出现的⽂本单词;
 	# 后⼀个叫fval, 指的是每个⽂本单词对应的值。
 	# 这⾥我们⽤最简单的True,来表示,这个词『出现在当前的句⼦中』的意义。
training_data=[[preprocess(s1),'pos'],
               [preprocess(s2),'pos'],
               [preprocess(s3),'neg'],
               [preprocess(s4),'neg']]
               #训练集做成标准形式
model=NaiveBayesClassifier.train(training_data)
print(model.classify(preprocess('this is a good book')))

文本相似度

⽤元素频率表⽰⽂本特征
在这里插入图片描述
[1,0,3,0,1,1]表示第一句…………

余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,夹角等于0,即两个向量相等,这就叫”余弦相似性”
在这里插入图片描述

Frequency频率统计
import nltk
from nltk import FreqDist

#做个词库先
corpus='this is my sentence'\
        'this is my life'\
        'this is the day'
# tokenize⼀下,这⾥可以根据需要做任何的preprocessing:stopwords, lemma, stemming, etc
tokens=nltk.word_tokenize(corpus)
print(tokens)
# 得到token好的word list['this', 'is', 'my', 'sentence', 'this', 'is', 'my', 'life', 'this','is', 'the', 'day']
# 借⽤NLTK的FreqDist统计⼀下⽂字出现的频率
fdist = FreqDist(tokens)
# 它就类似于⼀个Dict
# 带上某个单词, 可以看到它在整个⽂章中出现的次数
print(fdist['is'])
# 3
for i in fdist:
    print(i,fdist[i])
#获取最常用的单词列表
standard_freq_vector=fdist.most_common(3)
size=len(standard_freq_vector)
print(standard_freq_vector)
#[('is', 3), ('my', 2), ('this', 1)]
# 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)
# 得到⼀个位置对照表,dict
# {'is': 0, 'the': 3, 'day': 4, 'this': 1,'sentence': 5, 'my': 2, 'life': 6}
# 这时, 如果我们有个新句⼦:
sentence = 'this is cool'
# 先新建⼀个跟我们的标准vector同样⼤⼩的向量
freq_vector = [0] * size
# 简单的Preprocessing
tokens = nltk.word_tokenize(sentence)
# 对于这个新句⼦⾥的每⼀个单词
for word in tokens:
 	try:
 # 如果在我们的词库⾥出现过
 # 那么就在"标准位置"上+1
 		freq_vector[standard_position_dict[word]] += 1
 	except KeyError:
 # 如果是个新词
 # 就pass掉
 		continue
print(freq_vector)
# [1, 1, 0, 0, 0, 0, 0]
# 第⼀个位置代表 is, 出现了⼀次
# 第⼆个位置代表 this, 出现了⼀次
# 后⾯都⽊有

文本分类

TF-IDF
TF: Term Frequency, 衡量⼀个term在⽂档中出现得有多频繁。
TF(t) = (t出现在⽂档中的次数) / (⽂档中的term总数).
IDF: Inverse Document Frequency, 衡量⼀个term有多重要。
IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大。⽐如’is’,’the‘,’and‘之类的。
为了平衡,我们把罕见的词的重要性(weight)搞⾼,
把常见词的重要性搞低。
IDF(t) = log_e(⽂档总数 / 含有t的⽂档总数+1),+1是避免为0
TF-IDF = TF * IDF

ex:
⼀个⽂档有100个单词,其中单词baby出现了3次。
那么,TF(baby) = (3/100) = 0.03.
好,现在我们如果有10M的⽂档, baby出现在其中的1000个⽂档中。
那么,IDF(baby) = log(10,000,000 / 1,000) = 4
所以, TF-IDF(baby) = TF(baby) * IDF(baby) = 0.03 * 4 = 0.12

from  nltk.text import TextCollection
from nltk.tokenize import word_tokenize
# ⾸先, 把所有的⽂档放到TextCollection类中。
# 这个类会⾃动帮你断句, 做统计, 做计算
sentences=['this is sentence one',
            'this is sentence two',
            'this is sentence three']
sents=[word_tokenize(sent) for sent in sentences]
print(sents)
corpus=TextCollection(sents)
#计算tfidf
print(corpus.tf_idf('two',corpus))

本文链接: http://www.dtmao.cc/news_show_2000339.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?