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模型训练结果
python生成相似句子_4种方法计算句子相似度相关推荐
- java计算句子相似度的代码_4种方法计算句子相似度
Edit Distance 计算两个字符串之间,由一个转成另一个所需要的最少编辑次数,次数越多,距离越大,也就越不相关.比如,"xiaoming"和"xiamin&quo ...
- python生成随机数方法_详解用python生成随机数的几种方法
今天学习了用python生成仿真数据的一些基本方法和技巧,写成博客和大家分享一下. 本篇博客主要讲解如何从给定参数的的正态分布/均匀分布中生成随机数以及如何以给定概率从数字列表抽取某数字或从区间列表的 ...
- python使用源文件_使用Python生成源文件的两种方法
利用Python的字符串处理模块,开发人员可以编写脚本用来生成那些格式相同的C.C++.JAVA源程序.头文件和测试文件,从而避免大量的重复工作.本文概述两种利用Python string类生成jav ...
- python 生成随机数的三种方法
文章目录 1. 使用 random 包生成随机数 2. 使用 numpy 包生成随机数 3. 使用 scipy 包生成随机数 1. 使用 random 包生成随机数 可以生成 均匀分布, 高斯分布,( ...
- Python花式编程:6种方法计算1!+2!+...+n!
问题描述: 给定任意正整数n,计算1!+2!+3!+...+n!的值. 阅读原文
- python 生成随机数的几种方法
随机取一个: import random random.choice(string.digits)#从数字里随机选取一位数字: 随机取多位数: random.sample(string.digits, ...
- 七种方法计算文本相似度方法
简单讲解 基于关键词的空间向量模型的算法,将用户的喜好以文档描述并转换成向量模型,对商品也是这么处理,然后再通过计算商品文档和用户偏好文档的余弦相似度. 文本相似度计算在信息检索.数据挖掘.机器翻译. ...
- 使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角
使用Python,Open3D对点云散点投影到面上并可视化,使用3种方法计算面的法向量及与平均法向量的夹角 写这篇博客源于博友的提问,他坚定了我继续坚持学习的心,带给了我充实与快乐. 将介绍以下5部分 ...
- Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)
Python:三种方法计算最大公约数和最小公倍数 1.穷举法 2.欧几里德法 3.Stein算法 题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数: 参考资料:Python解决求最大 ...
最新文章
- vcenter converter 转换xenserver下linux的错误
- 黑帽SEO:Google为什么会屏蔽你的网站
- Node,Document,HTMLDocument,HTMLCollection解析
- 可申请试用!GN4系列GPU云服务器重磅来袭
- 5、java中的数组
- 因特尔显卡自定义分辨率_电脑显示器分辨率超频教程:1080P超2K分辨率的方法...
- markdown绘图插件----mermaid简介
- php5.4 curl,PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
- 惯性制导精度是多少_航天装备的命中精度
- Mind+上传模式的第三方Arduino用户库实现 -DHT11温湿度模块
- OPPO Find X5系列上架预约:全球首款天玑9000旗舰
- LeetCode:通过递归方法打印杨辉三角形
- python 字典 列表 元祖_Python基础之列表、元祖、字典、集合,你都知道吗?附视频...
- Python福彩3D单选单复式排列计算器
- 1.1计算机解决问题的过程教案,1.1 计算机解决问题的过程
- 华为的人力资源管理揭秘
- 计算机网络基础判断题
- c语言文件操作之图片+文件“合成器”(详解+源码+视频讲解)
- CS客户端渗透测试(二)信息收集与流量分析
- heka 输出到mysql_HEKA-系统介绍
热门文章
- linux脚本登录启动失败,linux-从bash脚本启动进程失败
- linux hiredis升级,Redis平滑升级
- 卸料装置弹性零件的计算方法_冲裁力、卸料力及推件力的计算-常见问题.doc
- 导致集群重启_干货丨如何水平扩展和垂直扩展DolphinDB集群?
- android theme 使用方法,Android入门之Style与Theme用法实例解析
- 1054. 距离相等的条形码
- 小程序开发学习(4)---天气预报接口API篇
- matlab怎么调整子图间距,matplotlib调整子图间距,调整整体空白的方法
- java 异常管理员_java web在进行管理员操作的时候,抛出了下面的异常,怎么解决啊...
- 《销售从被拒绝开始》叶冠1