1 NLP(自然语言处理)

1.1相似度

相似度和距离之间关系:

  • 1、文本相似度:
  • 1) 语义相似、但字面不相似:
  • 老王的个人简介
  • 铁王人物介绍
  • 2) 字面相似、但是语义不相似:
  • 我吃饱饭了
  • 我吃不饱饭
  • 2、方案:
  • 1) 语义相似:依靠用户行为,最基本的方法:(1)基于共点击的行为(协同过滤),(2)借助回归算法
  • 歌神 -> 张学友
  • 2) 字面相似:(1) LCS最大公共子序列 (2) 利用中文分词
  • 老王的个人简介 => 老王 / 的 / 个人 / 简介
  • token
  • 3 字面相似的问题解决:
  • 余弦相似度 cosine
  • 举例:A(1,2,3) B(2,3,4)
    - cosine(A,B) = 分子 / 分母
  • 分子:A * B = 1 * 2+2 *
    3+3 * 4 = 20
    - 分母:|A| * |B| = 20.12
    - |A| = sqrt(1 * 1+2 * 2+3 * 3) = 3.74
  • |B| = sqrt(2 * 2+3
    * 3+4 * 4) = 5.38

1.2 常用方法

• 相似度度量:计算个体间相似程度
• 相似度值越小,距离越大,相似度值越大,距离越小
• 最常用——余弦相似度

  • 一个向量空间中两个向量夹角的余弦值作为衡量两个个体之间差异的大小
  • 余弦值接近1,夹角趋于0,表明两个向量越相似

得到了文本相似度计算的处理流程是:

– 找出两篇文章的关键词; – 每篇文章各取出若干个关键词,合并成一个集合,计算每篇文章对于这个集合中的词的词频 – 生成两篇文章各自的词频向量; – 计算两个向量的余弦相似度,值越大就表示越相似

1.3 关键词

TF/IDF

  • 1) TF:词频
    - 假设:如果一个词很重要,应该会在文章中多次出现
    - 词频——TF(Term Frequency):一个词在文章中出现的次数
    - 也不是绝对的!出现次数最多的是“的”“是”“在”,这类最常用的词, 叫做停用词(stop words)
    - 停用词对结果毫无帮助,必须过滤掉的词
    - 过滤掉停用词后就一定能接近问题么?
    - 进一步调整假设:如果某个词比较少见,但是它在这篇文章中多次出现,那 么它很可能反映了这篇文章的特性,正是我们所需要的关键词
  • 2) IDF:反文档频率
    - 在词频的基础上,赋予每一个词的权重,进一步体现该词的重要性,
    - 最常见的词(“的”、“是”、“在”)给予最小的权重
    - 较常见的词(“国内”、“中国”、“报道”)给予较小的权重
    - 较少见的词(“养殖”、“维基”、“涨停”)给予较小的权重

(关键词:在当前文章出现较多,但在其他文章中出现较少)
(将TF和IDF进行相乘,就得到了一个词的TF-IDF值,某个词对文章重要性越高,该值越大, 于是排在前面的几个词,就是这篇文章的关键词。)

1.4 关键词方法 : 自动摘要

  • 1) 确定关键词集合(两种方法(a)top-10 (b)阈值截断 > 0.8 ) (阈值截断针对TFIDF的值进行截断取值操作)
  • 2)哪些句子包含关键词,把这些句子取出来
  • 3) 对关键词排序,对句子做等级划分
  • 4)把等级高的句子取出来,就是摘要

1.5 NLP总结

• 优点:简单快速,结果比较符合实际情况
• 缺点:单纯以“词频”做衡量标准,不够全面,有时重要的词可能出现的次数并不多
这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)

1.6 TFIDF实践实践:

这个下面放了508篇文章

发现这些文章已经进行分词(已空格分隔)
如果每篇文章都打开那么会非常的慢,所以需要对文章进行预处理

1)数据预处理:把所有文章的内容,全部收集到一个文件中

convert.py

import os

import sys

file_path_dir = sys.argv[1]

def read_file_handler(f):

    fd = open(f, 'r')

    return fd

file_name = 0

for fd in os.listdir(file_path_dir):

    file_path = file_path_dir + '/' + fd

    content_list = []

    file_fd = read_file_handler(file_path)

    for line in file_fd:

        content_list.append(line.strip())

    print '\t'.join([str(file_name), ' '.join(content_list)])

    file_name += 1

python convert.py input_tfidf_dir/ > idf_input.data

一共508行 有数字标记

2)计算IDF:通过MapReduce批量计算IDF

map.py

import sys

for line in sys.stdin:

    ss = line.strip().split('\t')

    if len(ss) != 2:

        continue

    file_name, file_content = ss

    word_list = file_content.strip().split(' ')

    word_set = set(word_list)

    for word in word_set:

        print '\t'.join([word, ''])

head -2 idf_input.data | python map.py | head -10

测试没有问题继续reduce
red.py

import sys

import math

current_word = None

sum = 0

docs_cnt = 508

for line in sys.stdin:

    ss = line.strip().split('\t')

    if len(ss) != 2:

        continue

    word, val = ss

    if current_word == None:

        current_word = word

    if current_word != word:

        idf = math.log(float(docs_cnt) / (float(sum) + 1.0))

        print '\t'.join([current_word, str(idf)])

        current_word = word

        sum = 0

    sum += int(val)

idf = math.log(float(docs_cnt) / (float(sum) + 1.0))

print '\t'.join([current_word, str(idf)])

cat idf_input.data | python map.py | sort | python red.py | tail

测试一下,发现没有问题,注意数据量过大回报上面的异常

现在做mapReduce的准备工作,将我们预处理的数据提交到hdfs上

编写脚本run.sh

HADOOP_CMD="/usr/local/src/hadoop-2.6.5/bin/hadoop"

STREAM_JAR_PATH="/usr/local/src/hadoop-2.6.5/share/hadoop/tools/lib/hadoop-streaming-2.6.5.jar"

INPUT_FILE_PATH="/idf_input.data"

OUTPUT_PATH="/tfidf_output"

$HADOOP_CMD fs -rmr -skipTrash $OUTPUT_PATH

$HADOOP_CMD jar $STREAM_JAR_PATH \

    -input $INPUT_FILE_PATH \

    -output $OUTPUT_PATH \

    -mapper "python map.py" \

    -reducer "python red.py" \

    -file ./map.py \

    -file ./red.py

然后

bash run.sh

hadoop fs -ls /tfidf_output

hadoop fs -text /tfidf_output/part- | sort -k2 -n | head

hadoop fs -text /tfidf_output/part- | sort -k2 -nr | head

8 NLP-自然语言处理Demo的更多相关文章

  1. flask 第六章 人工智能 百度语音合成 识别 NLP自然语言处理+simnet短文本相似度 图灵机器人

    百度智能云文档链接 : https://cloud.baidu.com/doc/SPEECH/index.html 1.百度语音合成 概念: 顾名思义,就是将你输入的文字合成语音,例如: from a ...

  2. NLP 自然语言处理实战

    前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...

  3. NLP自然语言处理 jieba中文分词,关键词提取,词性标注,并行分词,起止位置,文本挖掘,NLP WordEmbedding的概念和实现

    1. NLP 走近自然语言处理 概念 Natural Language Processing/Understanding,自然语言处理/理解 日常对话.办公写作.上网浏览 希望机器能像人一样去理解,以 ...

  4. NLP自然语言处理入门-- 文本预处理Pre-processing

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  5. NLP 自然语言处理

    参考: 自然语言处理怎么最快入门:http://www.zhihu.com/question/ 自然语言处理简介:http://wenku.baidu.com/link?url=W6Mw1f-XN8s ...

  6. NLP自然语言处理学习笔记二(初试)

    前言: 用Python对自然语言处理有很好的库.它叫NLTK.下面就是对NLTK的第一尝试. 安装: 1.安装Pip 比较简单,得益于CentOS7自带的easy_install.执行一行命令就可以搞 ...

  7. java自然语言理解demo,源码分享(基于欧拉蜜)

    汇率换算自然语言理解功能JAVA DEMO >>>>>>>>>>>>>>>>>>>&g ...

  8. 初识NLP 自然语言处理

    接下来的一段时间,要深入研究下自然语言处理这一个学科,以期能够带来工作上的提升. 学习如何实用python实现各种有关自然语言处理有关的事物,并了解一些有关自然语言处理的当下和新进的研究主题. NLP ...

  9. NLP 自然语言处理之综述

    (1) NLP 介绍 NLP 是什么? NLP (Natural Language Processing) 自然语言处理,是计算机科学.人工智能和语言学的交叉学科,目的是让计算机处理或"理解 ...

  10. [NLP自然语言处理]谷歌BERT模型深度解析

    我的机器学习教程「美团」算法工程师带你入门机器学习   已经开始更新了,欢迎大家订阅~ 任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主 ...

随机推荐

  1. 全自动Landsat影像温度反演软件开发

    许久没有更新遥感类软件开发了,都有点生疏了,这一次我带来了一个老的算法,新的东西, 为什么这么说呢,我们知道Landat8.Landsat5等影像,单个影像去做温度反演,并没有什么太大的难度, 但是呢 ...

  2. laravel-admin(自定义表单与验证)

    场景: 很多时候,由于我们业务场景比较特殊,需要自定义表单,然后框架给我提供了对应表单组建! 案列:以创建一个字段为列 1.在控制器对应的方法中调用表单组建创建表单 public function c ...

  3. RDS数据库磁盘满导致实例锁定

    问题描述: 阿里云RDS空间不足,进行报警.收到报警后.对数据库中不重要的数据备份后执行delete删除操作.执行成功后发现数据删掉了.但是数据库的空间并没有释放.数据占用空间反而越来越大,最后RDS ...

  4. 解读TIME_WAIT--你在网上看到的大多数帖子可能都是错误的

    由于TCP协议整个机制也非常复杂我只能尽可能的在某一条线上来说,不可能面面俱到,如果有疏漏或者对于内容有异议可以留言.谢谢大家. 查看服务器上各个状态的统计数量: netstat -ant | awk ...

  5. 【HDU - 1495】非常可乐

    -->非常可乐  Descriptions: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一 ...

  6. spark入门(三)键值对操作

    1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...

  7. HDU 3938:Portal(并查集+离线处理)

    http://acm.hdu.edu.cn/showproblem.php?pid=3938 Portal Problem Description   ZLGG found a magic theor ...

  8. TCP UDP (转)

    互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作 ...

  9. 什么是JDK什么是JRE?JDK和JRE的关系

    什么是JDK什么是JRE?JDK和JRE的关系 我们看看来自百度百科的解释: JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心 ...

  10. STM32F0_HAL库驱动描述——HAL驱动程序概述

    HAL库文件结构: HAL驱动文件: 外设驱动API文件和头文件:包含了常见主要的通用API,其中ppp表示外设名称,如adc.usart.gpio.irda等: stm32f0xx_hal_ppp. ...