【深度学习】实验18 自然语言处理

简介: 【深度学习】实验18 自然语言处理

自然语言处理

自然语言处理(Natural Language Processing, NLP)是一种计算机科学和人工智能的交叉学科,致力于使计算机能够理解、分析、生成和处理自然语言文本(如英语、中文等)。这种技术涉及到语言学、统计学、机器学习、人工智能等领域的知识和技术。


NLP的目标是使计算机能够像人类一样理解自然语言,并与人类进行自然的交流。具体来说,NLP可以用于文本分类、信息提取、问答系统、自然语言生成、机器翻译、语音识别等方面。


在NLP技术中,常用的方法包括词法分析、语法分析、语义分析和自然语言生成。其中,词法分析是将输入文本分解成单词、标点符号等基本元素的过程;语法分析则是确定这些基本元素之间的规则和关系;语义分析则是理解文本的含义,并从中提取出相关信息;自然语言生成是通过一些规则和模板,将计算机生成的数据转化为符合自然语言规则的文本。


NLP的应用非常广泛。在搜索引擎中,NLP可以帮助搜索引擎优化搜索结果,并提供更准确的信息;在垃圾邮件过滤中,NLP可以检测和过滤掉垃圾邮件;在文本分类中,NLP可以将文本分为不同的类别,用于信息管理和数据分析;在机器翻译中,NLP可以将一种语言翻译成另一种语言。


尽管NLP已经在许多领域得到了广泛应用,但它仍然面临着许多挑战。其中最大的挑战之一是语言的多义性。由于自然语言的歧义性很高,NLP系统必须具备高度的智能才能正确地解释文本的意义。此外,不同语言之间的差异以及不同人之间的不同表达方式也给NLP技术带来了一定的挑战。


总的来说,NLP是非常有前途的技术,其可以帮助人们更好地理解和处理自然语言文本,并在许多领域发挥重要作用。通过不断的改进和创新,NLP将会在未来的科技发展中扮演越来越重要的角色。


分词技术

1. 正向最大匹配算法

# -*- coding: utf-8 -*-
# MM
# 使用正向最大匹配算法实现中文分词
dic = []
MAX_LENGTH = 5
def init():
    """
    读文件
    获取中文词典
    :return:
    """
    input = open("test.txt")
    lines = input.readlines()
    for line in lines:
        temp = line.split(',')
        dic.append(temp[0])
    for d in dic:
        print(d)
def if_contain(words):
    """
    判断当前词在词典中是否存在
    :param words:
    :return:
    """
    flag = False
    for d in dic:
        if d == words:
            flag = True
            break
    return flag
def spl(sentence):
    """
    正向最大匹配算法的主要实现部分
    从后向前切割字符串,直到切割出的子串与词典中的词匹配
    :param sentence:
    :return:
    """
    result = ''
    words = []
    while len(sentence) > 0:
        except_flag = False
        for i in range(MAX_LENGTH, 0, -1):
            temp = sentence[:i]    # 中文字符串切割方式
            print(i,temp)
            flag = if_contain(temp)
            if flag:
                words.append(temp)
                sentence = sentence[i:]
                except_flag = True
                break
        if not except_flag:
            # 判断当前字符串是否在词典中并不存在,若该字符串从头切割到尾都没有词典中的词则认为无法切割并且
            # 词典中不存在,此时直接将该词当成切割后的结果加入结果列表
            words.append(sentence)
            break
    for w in words:
        result += (w + '/')
    return result
def main():
    """
    与用户交互接口
    :return:
    """
    init()
    while True:
        input_str = input(">")
        if not input_str:
            break
        result = spl(input_str)
        print("分词结果为:")
        print(result)
if __name__ == "__main__":
    main()
研究
研究生
生命
起源
研究生命的起源
5 研究生命的
4 研究生命
3 研究生
5 命的起源
4 命的起源
3 命的起
2 命的
1 命
5 的起源
4 的起源
3 的起源
2 的起
1 的
5 起源
分词结果为:
研究生/命/的/起源/

2. HanLP常用方法

from pyhanlp import *
print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
[你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx]
for term in HanLP.segment('下雨天地面积水'):
    print('{}\t{}'.format(term.word, term.nature)) # 获取单词与词性
testCases = [
    "商品和服务",
    "结婚的和尚未结婚的确实在干扰分词啊",
    "买水果然后来世博园最后去世博会",
    "中国的首都是北京",
    "欢迎新老师生前来就餐",
    "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作",
    "随着页游兴起到现在的页游繁盛,依赖于存档进行逻辑判断的设计减少了,但这块也不能完全忽略掉。"]
for sentence in testCases: print(HanLP.segment(sentence))
下雨天 n
地面  n
积水  n
[商品/n, 和/cc, 服务/vn]
[结婚/vi, 的/ude1, 和/cc, 尚未/d, 结婚/vi, 的/ude1, 确实/ad, 在/p, 干扰/vn, 分词/n, 啊/y]
[买/v, 水果/n, 然后/c, 来/vf, 世博园/n, 最后/f, 去/vf, 世博会/n]
[中国/ns, 的/ude1, 首都/n, 是/vshi, 北京/ns]
[欢迎/v, 新/a, 老/a, 师生/n, 前来/vi, 就餐/vi]
[工信处/n, 女干事/n, 每月/t, 经过/p, 下属/v, 科室/n, 都/d, 要/v, 亲口/d, 交代/v, 24/m, 口/n, 交换机/n, 等/udeng, 技术性/n, 器件/n, 的/ude1, 安装/v, 工作/vn]
[随着/p, 页游/nz, 兴起/v, 到/v, 现在/t, 的/ude1, 页游/nz, 繁盛/a, ,/w, 依赖于/v, 存档/vi, 进行/vn, 逻辑/n, 判断/v, 的/ude1, 设计/vn, 减少/v, 了/ule, ,/w, 但/c, 这/rzv, 块/q, 也/d, 不能/v, 完全/ad, 忽略/v, 掉/v, 。/w]
# 关键词提取
document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
           "根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
           "有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
           "严格地进行水资源论证和取水许可的批准。"
print(HanLP.extractKeyword(document, 2))
   [水资源, 陈明忠]
# 自动摘要
print(HanLP.extractSummary(document, 3))
   [严格地进行水资源论证和取水许可的批准, 水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露, 有部分省超过红线的指标]
# 依存句法分析
print(HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"))
1 徐先生 徐先生 nh  nr  _ 4 主谓关系  _ _
2 还 还 d d _ 4 状中结构  _ _
3 具体  具体  a ad  _ 4 状中结构  _ _
4 帮助  帮助  v v _ 0 核心关系  _ _
5 他 他 r r _ 4 兼语  _ _
6 确定  确定  v v _ 4 动宾关系  _ _
7 了 了 u u _ 6 右附加关系 _ _
8 把 把 p p _ 15  状中结构  _ _
9 画 画 v v _ 8 介宾关系  _ _
10  雄鹰  雄鹰  n n _ 9 动宾关系  _ _
11  、 、 wp  w _ 12  标点符号  _ _
12  松鼠  松鼠  n n _ 10  并列关系  _ _
13  和 和 c c _ 14  左附加关系 _ _
14  麻雀  麻雀  n n _ 10  并列关系  _ _
15  作为  作为  v v _ 6 动宾关系  _ _
16  主攻  主攻  v vn  _ 17  定中关系  _ _
17  目标  目标  n n _ 15  动宾关系  _ _
18  。 。 wp  w _ 4 标点符号  _ _

3. Jieba常用方法

# encoding=utf-8
import jieba
# 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) 
print(seg_list)
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.743 seconds.
Prefix dict has been built successfully.
Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
<generator object Tokenizer.cut at 0x7f2b1147e408>
# 精确模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  
Default Mode: 我/ 来到/ 北京/ 清华大学
# 默认是精确模式
seg_list = jieba.cut("他来到了网易杭研大厦")  
print(", ".join(seg_list))
他, 来到, 了, 网易, 杭研, 大厦
# 搜索引擎模式
seg_list = jieba.cut_for_search("我来到北京清华大学")  
print("/".join(seg_list))
我/来到/北京/清华/华大/大学/清华大学
seg_list = jieba.lcut("我来到北京清华大学", cut_all=True)
print(seg_list)
['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
# encoding=utf-8
text1 = '李小福是创新办主任也是云计算方面的专家'
seg_list1 = jieba.cut(text1, cut_all=False)
print("/ ".join(seg_list1))
李小福/ 是/ 创新/ 办/ 主任/ 也/ 是/ 云/ 计算/ 方面/ 的/ 专家
# 自定义词典
text1 = '李小福是创新办主任也是云计算方面的专家'
# 'userdict.txt'为自定义词典的路径
jieba.load_userdict('userdict.txt') 
seg_list1 = jieba.cut(text1, cut_all=False)
print("/ ".join(seg_list1))
李小福/ 是/ 创新办/ 主任/ 也/ 是/ 云计算/ 方面/ 的/ 专家

构建词向量

1. 基于sklearn构建One-hot词向量

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
from warnings import filterwarnings
filterwarnings('ignore')
# define example
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = array(data)
print(values)
# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)
# binary encode
onehot_encoder = OneHotEncoder(sparse=False)
integer_encoded = integer_encoded.reshape(len(integer_encoded), 1)
onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
print(onehot_encoded)
# invert first example
inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])])
print(inverted)
['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']
[0 0 2 0 1 1 2 0 2 1]
[[1. 0. 0.]
 [1. 0. 0.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 1. 0.]
 [0. 1. 0.]
 [0. 0. 1.]
 [1. 0. 0.]
 [0. 0. 1.]
 [0. 1. 0.]]
['cold']

2. 基于gensim构建word2vec词向量

# -*- coding: utf-8 -*-
import jieba
import jieba.analyse
jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
with open('./in_the_name_of_people.txt') as f:
    document = f.read()
    #document_decode = document.decode('GBK')
    document_cut = jieba.cut(document)
    #print  ' '.join(jieba_cut)  //如果打印结果,则分词效果消失,后面的result无法显示
    result = ' '.join(document_cut)
    result = result.encode('utf-8')
    with open('./in_the_name_of_people_segment.txt', 'wb') as f2:
        f2.write(result)
f.close()
f2.close()
Building prefix dict from the default dictionary ...
Dumping model to file cache /tmp/jieba.cache
Loading model cost 1.790 seconds.
Prefix dict has been built successfully.
# import modules & set up logging
import logging
import os
from gensim.models import word2vec
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt') 
model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3) 
#沙书记最相近的一些3个字的词(主要是人名)如下:
#gensim.models.Word2Vec.similar_by_wordword [,topn,restrict_vocab]):找到前N个最相似的单词。
req_count = 5
for key in model.wv.similar_by_word('沙瑞金'.encode('utf-8').decode('utf-8'), topn =100):
    if len(key[0])==3:
        req_count -= 1
        print(key[0], key[1])
        if req_count == 0:
            break;
高育良 0.9653146862983704
田国富 0.953415036201477
侯亮平 0.9278725385665894
李达康 0.9275027513504028
易学习 0.9119865298271179
#看两个词向量的相近程度
#gensim.models.Word2Vec.similarity(ws1,ws2):计算两个单词之间的余弦相似度。
print(model.wv.similarity('沙瑞金'.encode('utf-8').decode('utf-8'), '钟小艾'.encode('utf-8').decode('utf-8')))
print(model.wv.similarity('沙瑞金'.encode('utf-8').decode('utf-8'), '李达康'.encode('utf-8').decode('utf-8')))
0.85246694
0.9275029
#找出不同类的词
print(model.wv.doesnt_match(u"沙瑞金 高育良 李达康 钟小艾".split()))
钟小艾
目录
相关文章
|
2月前
|
机器学习/深度学习 自然语言处理
利用深度学习技术改进自然语言处理中的命名实体识别
命名实体识别(Named Entity Recognition, NER)在自然语言处理领域扮演着重要角色,但传统方法在处理复杂语境和多样化实体时存在局限性。本文将探讨如何利用深度学习技术,特别是基于预训练模型的方法,来改进命名实体识别,提高其在现实场景中的性能和适用性。
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用深度学习技术实现自然语言处理中的情感分析
本文将深入探讨如何利用深度学习技术在自然语言处理领域中实现情感分析。通过介绍情感分析的背景和原理,结合深度学习模型如LSTM、BERT等的应用,帮助读者了解情感分析的重要性以及如何利用最新技术实现更准确的情感识别。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用探索
本文从一个独特的角度出发,通过对深度学习技术在自然语言处理(NLP)领域应用的深入分析,展现了如何通过深度学习模型理解和生成人类语言的可能性。文章首先概述了深度学习技术的基础知识,随后详细探讨了其在NLP中的几个关键应用,包括语言模型、文本分类、情感分析和机器翻译。此外,文章还着重讨论了面临的挑战以及未来的发展方向,旨在为读者提供一个全面而深刻的理解,关于深度学习如何推动自然语言处理技术的进步,以及这一进步对人类社会可能产生的深远影响。
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用深度学习技术实现自然语言处理中的情感分析
本文将深入探讨如何利用深度学习技术,特别是神经网络模型,来实现自然语言处理领域中的情感分析任务。通过结合深度学习算法和大规模文本数据集,可以实现更准确和高效的情感分析,为情感识别和情感推断提供更好的解决方案。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用与挑战
随着深度学习技术的快速发展,自然语言处理领域也迎来了前所未有的机遇和挑战。本文将探讨深度学习在自然语言处理中的应用现状、关键技术及面临的挑战,并展望未来发展方向。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用与挑战
传统的自然语言处理技术在面对复杂语义和语境时往往表现不佳,而深度学习技术的兴起为解决这一难题提供了新的可能性。本文将探讨深度学习在自然语言处理中的应用现状、关键技术及挑战,并展望未来的发展方向。
24 1
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习在自然语言处理中的应用探索
【2月更文挑战第13天】 本文从一个独特的角度出发,通过对深度学习技术在自然语言处理(NLP)领域应用的深入分析,展现了如何通过深度学习模型理解和生成人类语言的可能性。文章首先概述了深度学习技术的基础知识,随后详细探讨了其在NLP中的几个关键应用,包括语言模型、文本分类、情感分析和机器翻译。此外,文章还着重讨论了面临的挑战以及未来的发展方向,旨在为读者提供一个全面而深刻的理解,关于深度学习如何推动自然语言处理技术的进步,以及这一进步对人类社会可能产生的深远影响。
|
1天前
|
机器学习/深度学习 自然语言处理 PyTorch
【Python 机器学习专栏】自然语言处理中的深度学习应用
【4月更文挑战第30天】本文探讨了深度学习在自然语言处理(NLP)中的应用,包括文本分类、情感分析和机器翻译等任务。深度学习的优势在于自动特征学习、强大的表达能力和处理大规模数据的能力。常见模型如RNN、LSTM、GRU、CNN和注意力机制在NLP中发挥作用。Python的TensorFlow、PyTorch、NLTK和SpaCy等工具支持NLP研究。然而,数据稀缺、模型解释性和计算资源需求高等挑战仍待解决。随着技术进步,未来深度学习将进一步推动NLP发展,实现更智能的语言交互。
|
1天前
|
机器学习/深度学习 自然语言处理 算法
PyTorch与NLP:自然语言处理的深度学习实战
随着人工智能技术的快速发展,自然语言处理(NLP)作为其中的重要分支,日益受到人们的关注。PyTorch作为一款强大的深度学习框架,为NLP研究者提供了强大的工具。本文将介绍如何使用PyTorch进行自然语言处理的深度学习实践,包括基础概念、模型搭建、数据处理和实际应用等方面。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
利用深度学习进行自然语言处理的最新进展
自然语言处理(NLP)是人工智能领域的一个重要分支,近年来,深度学习技术的发展为NLP带来了革命性的进步。本文将介绍最新的深度学习技术在NLP领域的应用,包括文本分类、情感分析、语义理解等方面的进展和实践经验。