python生成相似句子_4种方法计算句子相似度

Edit Distance

计算两个字符串之间,由一个转成另一个所需要的最少编辑次数,次数越多,距离越大,也就越不相关。比如,“xiaoming”和“xiamin”,两者的转换需要两步:

去除‘o’

去除‘g’

所以,次数/距离=2。

!pip install distance

import distance

def edit_distance(s1, s2):

return distance.levenshtein(s1, s2)

s1 = 'xiaoming'

s2 = 'xiamin'

print('距离:'+str(edit_distance(s1, s2)))

杰卡德系数

用于比较有限样本集之间的相似性与差异性。Jaccard 系数值越大,样本相似度越高,计算方式是:两个样本的交集除以并集。

from sklearn.feature_extraction.text import CountVectorizer

import numpy as np

def jaccard_similarity(s1, s2):

def add_space(s):

return ' '.join(list(s))

# 将字中间加入空格

s1, s2 = add_space(s1), add_space(s2)

# 转化为TF矩阵

cv = CountVectorizer(tokenizer=lambda s: s.split())

corpus = [s1, s2]

vectors = cv.fit_transform(corpus).toarray()

# 求交集

numerator = np.sum(np.min(vectors, axis=0))

# 求并集

denominator = np.sum(np.max(vectors, axis=0))

# 计算杰卡德系数

return 1.0 * numerator / denominator

s1 = '你在干啥呢'

s2 = '你在干什么呢'

print(jaccard_similarity(s1, s2))

TF 计算

计算矩阵中两个向量的相似度,即:求解两个向量夹角的余弦值。

计算公式:cosθ=a·b/|a|*|b|

from sklearn.feature_extraction.text import CountVectorizer

import numpy as np

from scipy.linalg import norm

def tf_similarity(s1, s2):

def add_space(s):

return ' '.join(list(s))

# 将字中间加入空格

s1, s2 = add_space(s1), add_space(s2)

# 转化为TF矩阵

cv = CountVectorizer(tokenizer=lambda s: s.split())

corpus = [s1, s2]

vectors = cv.fit_transform(corpus).toarray()

# 计算TF系数

return np.dot(vectors[0], vectors[1]) / (norm(vectors[0]) * norm(vectors[1]))

s1 = '你在干啥呢'

s2 = '你在干什么呢'

print(tf_similarity(s1, s2))

高阶模型Bert

Bert的内部结构,请查看从word2vec到bert这篇文章,本篇文章我们只讲代码实现。我们可以下载Bert模型源码,或者使用TF-HUB的方式使用,本次我们使用下载源码的方式。

首先,从Github下载源码,然后下载google预训练好的模型,我们选择Bert-base Chinese。

预模型下载后解压,文件结构如图:

vocab.txt是训练时中文文本采用的字典,bert_config.json是BERT在训练时,可选调整的一些参数。其它文件是模型结构,参数等文件。

准备数据集

修改 processor

class MoveProcessor(DataProcessor):

"""Processor for the move data set ."""

def get_train_examples(self, data_dir):

"""See base class."""

return self._create_examples(

self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")

def get_dev_examples(self, data_dir):

"""See base class."""

return self._create_examples(

self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev")

def get_test_examples(self, data_dir):

"""See base class."""

return self._create_examples(

self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")

def get_labels(self):

"""See base class."""

return ["0", "1"]

@classmethod

def _read_tsv(cls, input_file, quotechar=None):

"""Reads a tab separated value file."""

with tf.gfile.Open(input_file, "r") as f:

reader = csv.reader(f, delimiter="\t", quotechar=quotechar)

lines = []

for line in reader:

lines.append(line)

return lines

def _create_examples(self, lines, set_type):

"""Creates examples for the training and dev sets."""

examples = []

for (i, line) in enumerate(lines):

guid = "%s-%s" % (set_type, i)

if set_type == "test":

text_a = tokenization.convert_to_unicode(line[0])

label = "0"

else:

text_a = tokenization.convert_to_unicode(line[1])

label = tokenization.convert_to_unicode(line[0])

examples.append(

InputExample(guid=guid, text_a=text_a, text_b=None, label=label))

return examples

修改 processor字典

def main(_):

tf.logging.set_verbosity(tf.logging.INFO)

processors = {

"cola": ColaProcessor,

"mnli": MnliProcessor,

"mrpc": MrpcProcessor,

"xnli": XnliProcessor,

'setest':MoveProcessor

}

Bert模型训练

export BERT_BASE_DIR=/Users/xiaomingtai/Downloads/chinese_L-12_H-768_A-12

export MY_DATASET=/Users/xiaomingtai/Downloads/bert_model

python run_classifier.py \

--data_dir=$MY_DATASET \

--task_name=setest \

--vocab_file=$BERT_BASE_DIR/vocab.txt \

--bert_config_file=$BERT_BASE_DIR/bert_config.json \

--output_dir=/Users/xiaomingtai/Downloads/ber_model_output/ \

--do_train=true \

--do_eval=true \

--do_predict=true\

--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \

--max_seq_length=128 \

--train_batch_size=16 \

--eval_batch_size=8\

--predict_batch_size=2\

--learning_rate=5e-5\

--num_train_epochs=3.0\

Bert模型训练结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql主从配置常见问题_mysql 主从复制配置,以及常见问题解决!

一:我的mysql 5.7.15 ,系统是centos6.5主从复制配置步骤:瞅清楚!配置不要出错!!二:遇到的问题Got fatal error 1236 from master when reading data from binary log解决方案:在ma…

pythontcp文件传输_python socket实现文件传输(防粘包)

1.文件传输的要点:采用iterator(迭代器对象)迭代读取,提高读取以及存取效率;通过for line in file_handles逐行conn.send();2.socket粘包问题:[出现原因]:A.TCP协议为了提高传输效率,发送方往往需要收集定量…

python分析txt文件_python解析文本文件

python解析的文件原始数据:汉皇重色思倾国,御宇多年求不得。杨家有女初长成,养在深闺人未识。天生丽质难自弃,一朝选在君王侧。回眸一笑百媚生,六宫粉黛无颜色。春寒赐浴华清池,温泉水滑洗凝脂。侍儿扶起娇…

python中hist函数参数_用hist参数解释Python,python,解读

python用hist参数解读python 中绘制hist的方法有很多,我经常用的是matplotlib直接用x,y绘制;Dataframe直接.hist绘制;绘制直方图1.bins为80的图形fig plt.figure(figsize(15, 9))for i in range(12):plt.subplot(3,4,i1) # 3行4列 位置是i1的…

java 字符串是对象吗_解析Java中的String对象的数据类型

解析Java中的String对象的数据类型2007-06-06eNet&Ciweek1. 首先String不属于8种基本数据类型,String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。2. …

7-7 六度空间 (30分)_现役球员中,谁最可能成下一位30000分先生?3大前十巨星没戏...

想要在NBA联盟得到3万分有多难?从联盟成立至今的70多年中,总得分超过3万分的球员一共只有7位,他们分别是贾巴尔、马龙、詹姆斯、科比、乔丹、诺维茨基和张伯伦,剩下的强如大鲨鱼、艾弗森都没能完成这一壮举,那现役球员…

java右键弹出菜单_javascript自定义右键弹出菜单实现方法

本文实例讲述了javascript自定义右键弹出菜单实现方法。分享给大家供大家参考。具体实现方法如下:无标题页var oPopup window.createPopup();function PopMenu(id){var oPopBody oPopup.document.body;oPopBody.style.backgroundColor "buttonface";oP…

union all动态表_Excel VBA——动态显示图表

本文讲述将柱形图和折线图做成动态图表的方法。所谓动态是指鼠标点到哪个单元格,就显示活动单元格所在列或行的图表,其中折线图可以让数据点依次显示,使得整个图表不再死板,像变 了一样!在开始之前,需要先介…

xnio java_java基础篇---新I/O技术(NIO)

在JDK1.4以前,I/O输入输出处理,我们把它称为旧I/O处理,在JDK1.4开始,java提供了一系列改进的输入/输出新特性,这些功能被称为新I/O(NEW I/O),新添了许多用于处理输入/输出的类,这些类都被放在ja…

python函数返回none_Python 函数默认返回None的原因

Python 函数默认返回None是什么原因?定义的函数没有返回值,Python 解释器就会强行地默认给注入一段返回逻辑!实际上 Python 中有很多行为都是隐性的。Python 有一项默认的做法,很多编程语言都没有,所有函数都会有一个返…

简易计算器 java_用Java做一个简易计算器,要用到哪些知识?

分析问题关键词:Java、计算器深夜无聊,暂且一答。计算器分两个步骤:计算 器篇一 「器」在编程中,我们可以把「器」理解为「GUI(图形界面)」,Java 语言描绘的图形界面有很多种类,比如 awt、swing、javaFX 等…

picturectrl控件中加载图片并显示_如何在EasyX窗体中显示图片

前提:图片必须是.jpg或.bmp格式的图片。(一)将保存在电脑桌面上的图片显示在EasyX窗体中,图片路径为:C:甥敳獲Administrator.USER-20190823VFDesktop锤头镰刀旗.jpg。(二)程序代码:#include#includeint main(){initgraph(500,300)…

estemplate 导入MySQL_[数据库]es~通过ElasticsearchTemplate进行聚合操作

[数据库]es~通过ElasticsearchTemplate进行聚合操作02020-08-24 17:00:38聚合操作,我们可以对数据进行分组的求和,求数,最大值,最小值,或者其它的自定义的统计功能,es对聚合有着不错的支持,需要…

iis mysql版本切换_MySQL+PHP配置 Windows系统IIS版(转)

1、下载MySQL下载地址:http://dev.mysql.com/downloads/mysql/5.1.html->Windows (x86, 32-bit), MSI Installer Essentials - Recommended(不包含文档)->No thanks, just start my download.(无需登录注册 直接下载)PHP下载地址:www.php.net->…

ping网关丢包_网络/摄像机丢包的原因分析

引文不少人在使用网络和监控摄像系统的时候都有遇到过数据丢包的情况,数据丢包的原因是多种多样的,以下就为大家介绍一下网络数据丢包的原因及摄像机丢包的原因。原因分析摄像机丢包的原因1:路由错误网络路径错误也会导致数据包不能到达目的主…

java aes 填充_Java中的Aes解密 – 填充问题

我更改了一些代码行,以保证大文件的加密.现在我遇到了问题,解密不起作用.我收到以下错误消息/异常:Error encrypting/decrypting fileat Algorithmus.Encryptor.doCrypto(Encryptor.java:71)at Algorithmus.Encryptor.decrypt(Encryptor.java:39)at GUI.MainWindow$…

plantuml语法_PlantUML实践 | 思维导图

❝思维导图又叫心智导图,用于表达发散性思维的图形工具。❞语法使用一些运算符(如:,-,*)来决定图形方向。相同运算符数量则在同一级。运算符数量越多,层级越深。支持内置前缀图标标记,如旗帜图标。示例star…

Java常用API例子_Java常用API及Math类

一、API的概述API——Application Programing Interface:应用程序编程接口,是java提供的一些预定义的函数;目的:基于API实现程序的快速编写,只需了解其作用,不用关注源代码。学习API的方法:先了解API的概况…

prometheus连续查询_Prometheus 不完全避坑指南

原文发表于 我的个人博客,同步发表到我的知乎专栏 Prometheus 是一个开源监控系统,它本身已经成为了云原生中指标监控的事实标准,几乎所有 k8s 的核心组件以及其它云原生系统都以 Prometheus 的指标格式输出自己的运行时监控信息。我在工作中…

java猜字母讲解_java_猜字母游戏

java猜字母游戏猜字母游戏:用户指定游戏难度(5、7、9),程序生成随机不重复字母。用户猜错,提示用户对的字母数量和对的位置数量。import java.util.Scanner;public class GuessWord {public static void main(String[] args) {Scanner scanne…