@关于Yelp NLP Project的介绍和问题设定

STEP 1.2: SENTENCE TOKENIZATION WITH spaCy

查了一些资料之后,我决定将reviews 和 sentences 的对应关系存在postgresql数据库里,方便以后随时检索和调整。我没有用Json文件来存,是因为之前做过一个比较大的项目,用json来存,检索的时候发现速度很慢。在检索速度上,还是关系型数据库的表现最好最稳定了。再加上,我正好手头有另一个项目,之前是用mongoDB来存储和检索的,现在想改成psql,所以顺便拿这个项目练练手。

我要建的对应关系其实很简单,只需要实现下面几个功能就可以了:

  1. 可以迅速提取和检索我想要的reviews — 因此需要reviewID
  2. 可以迅速提取和检索我想要的sentences — 因此需要sentenceID可以迅速提取和检索我想要的sentences — 因此需要sentenceID
  3. 可以迅速在reviews 和 sentences 之间转换,给定review,可以马上提取出它对应的sentences, 反之亦然。可以迅速在reviews 和 sentences 之间转换,给定review,可以马上提取出它对应的sentences, 反之亦然。

review table 里面,需要有:

  1. reviewID, SERIAL PRIMARY
  2. yelp_userID (from Yelp, not NULL)yelp_userID (from Yelp, not NULL)
  3. yelp_restID (from Yelp, not NULL)yelp_restID (from Yelp, not NULL)
  4. review_date (can be NULL)review_date (can be NULL)
  5. text

sentence table 里面,需要有:

  1. sentenceID, SERIAL PRIMARY
  2. begin_position (sentence index) begin_position (sentence index)
  3. reviewID, FOREIGNreviewID, FOREIGN
  4. texttext

趁这个机会,学习了一下postgresql的python接口psycopg2。吐槽一下,这个包的名字取得特别地反直觉,不知道为什么要叫psycopg,从名字上看不出跟psql有什么关系… 看起来倒是非常像psychopath

下面是我用来断句的程序,里面包含了从PSQL提取待处理文本,传入spaCy,再将结果传回PSQL的函数。

import spacy
import time
import sys
import numpy as np
import psycopg2
import logging
import timedef get_500_unsplitted_text():# get 500 text-to-be-processed at a time from the DB.select_query = """select review_id, content from reviews where split_flag = false limit 500;"""cursor.execute(select_query)review_records = cursor.fetchall()return review_recordsdef update_splitted_text(review_ids):# update the flag for the text that has already been processed in the DB.update_query = """ UPDATE reviewsSET split_flag = %sWHERE review_id = %s"""for review_id in review_ids:cursor.execute(update_query, ('true', review_id))connection.commit()def spacy_split(review_records):review_ids = []count = 0for review_record in review_records:review_id, review_text = review_record[0], review_record[1]tokens = nlp(review_text)tokenized_sentences = list(tokens.sents)index = 0for tokenized_sentence in tokenized_sentences:sentence = tokenized_sentence.string.strip()insert_query = """INSERT INTO sentences (begin_pos, review_id, content) VALUES (%s, %s, %s);"""data = (index, review_id, sentence)cursor.execute(insert_query, data)review_ids.append(review_id)index += 1count += 1#print("finished splitting {} sentences.".format(count))return review_ids## DB info to be re-defined by the user
user_DB = None
password_DB = None
host_DB = "127.0.0.1"
port_DB = "5432"
database_DB = Noneconnection = psycopg2.connect(user = {}, password = {}, host = {},port = {}, database = {}).format(user_DB, password_DB, host_DB,           port_DB, database_DB))cursor = connection.cursor()
nlp = spacy.load("en_core_web_sm")last_time = time.time()for i in range(100):review_records = get_500_unsplitted_text()to_be_updated_ids = spacy_split(review_records)update_splitted_text(to_be_updated_ids)this_time = time.time()time_estimate = (this_time - last_time) * 100time_remaining = (this_time - last_time) * (100 -i-1)print("estimated time of processing: {:.2f}s".format(time_estimate))print("estimated remaining time: {:.2f}s".format(time_remaining))logging.info('finished {} rounds of spliting...'.format(i+1))last_time = this_time

处理34万条评论,总运行时间在10,000s, 即3h左右。
有了分好句的文本之后,下一步就是搭建分类模型了。

为了建这个模型,我主要参考了Jurafsky and Martin (2018) ch. 6. 第六章集中介绍了Vector Semantics,怎么根据word embedding建一个document similarity model。
里面介绍了一个很基本的做word embedding的想法,就是根据单词所在的语境来判断词与词之间的相似性,再将一个文本中所有单词的embedding vector平均化,用这个平均之后的vector来比较文本与文本之间的相似性。因为我现在已经把文本给分解成了更小的单元 – 句子,所以这种最简单的方法也许能抓住最重要的特征,得到非常好的分类效果。我决定先试试这个方法。书中介绍了两种给word vector重赋权的方法,一个是最常用的tf-idf,还有一个是Pointwise Mutual Information (PMI)。

接下来,我会先试tf-idf based word embedding, 再试PMI-based.
我要做的是:

  1. 给每一个句子生成它自己的word embedding vector.
  2. 根据我之前已经发现的,出现在某一条评论中的目标句子,找出与它类似的句子。
  3. 根据这一结果,创建一个training set,包含各种不同版本的目标句子。
  4. 根据training set 训练logistic regression 分类模型。

所以,下一步需要做的是,写一个tf-idf based word embedding function.

YELP NLP 英文文本断句相关推荐

  1. Nlp SBD 文本断句 包含中文 和英文断句

    根据目前学习,中文断句  standford nlp可以实现中文分词和断句,下面有不同api的例子,大家可以试试 package com.example.utils;import java.io.Bu ...

  2. c语言处理文本断句空格,c语言怎么断句

    你的if有2处错误 第一处错误 在if语句中n=1是没有这种说法的,因为n=1是赋值,而if括号里填的是表达式,是逻辑表达式 逻辑表达式的符号有: ==等于 !=不等于 && 而且 | ...

  3. NLP 英文文本数据增强

    数据增强是一种有效的防止过拟合并且可以加大训练集的有效方式,NLP中的数据增强方法有回译,同义词替换,随机插入,随机交换,随机删除,对抗训练这几种方式,本篇文章简单介绍一下这几种方式. 1.回译 #经 ...

  4. Python NLP英文文本转小写

    使用方法如下: def lower_word(all_content):for i, content in enumerate(all_content):all_content[i] = conten ...

  5. YELP NLP 文本信息提取项目

    @YELP NLP YELP NLP (文本信息提取) 为了做研究,进了Yelp这个大坑.自己选的题,哭着也得搞出来- 感觉边写代码边记录下心得体会.下一步的构想等等有的没的,是个很好的整理思路的过程 ...

  6. word-break|overflow-wrap|word-wrap——CSS英文断句浅析

    ---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结 ...

  7. chatgpt赋能python:Python断句:一种快速且便利的文本处理方法

    Python 断句:一种快速且便利的文本处理方法 Python作为一种通用编程语言,在文本处理方面也有很强的能力.其中,断句是在Python中应用广泛的一种文本处理方法.本篇文章将介绍如何使用Pyth ...

  8. 【python】文本处理:利用NLTK断句

    [python]文本处理:利用NLTK断句 [Code] import nltk.datadef stripTags(s):intag = [False]def chk(c):if intag[0]: ...

  9. 英文断句:理解 word-wrap、word-break用法

    1.定义与属性 1.1.word-wrap 允许长单词换行到下一行 语法 word-wrap: normal|break-word; 值 描述 normal 只在允许的断字点换行(浏览器保持默认处理) ...

最新文章

  1. vue 复选框的渲染
  2. 11-jQuery的事件绑定和解绑
  3. python内置排序算法_2021-01-05 排序算法(Python语言实现)
  4. ClearTextBox.Text
  5. 指纹识别软件安装包下载
  6. 机场新增卫星厅对中转旅客影响的评估方法
  7. 【ShaderToy】跳动的心
  8. pl/mysql安装_MySQL安装
  9. php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
  10. Tianchi big data competition天池大数据挑战(CV场)
  11. python输出右对齐_python怎么右对齐
  12. js函数传参——参数与arguments对象
  13. hermite spline
  14. python气象学_Python气象绘图教程(十)
  15. 客户细分_客户细分初学者指南
  16. PBR:基于物理的渲染(Physically Based Rendering)+理论相关
  17. Linux防火墙入门:基本观念(转)
  18. 微信支付:商户订单号重复
  19. 转载:关于NERO7刻录软件的使用
  20. python学生管理系统数据库_Django+Mysql实现--学生管理系统

热门文章

  1. java初学者必读-经验总结--经典!
  2. 【精选】基于EasyX的贪吃蛇小游戏
  3. 2021-2027全球及中国G Suite销售软件行业研究及十四五规划分析报告
  4. 在vue中将数据导出为excel文件file-saver+xlsx+script-loader
  5. 从 Uber 数据泄露事件我们可以学到什么?
  6. 从OPPO Finder看手机产品的差异化体现
  7. NNNNNNNNNN
  8. linux下scala脚本运行报错error: expected class or object definition 解决方案
  9. 入驻QQ一天就爆满,Midjourney中文版来了
  10. 进制转换算法(通用,极简)