精华内容
下载资源
问答
  • 2017-12-24 12:55:06
    import java.awt.Graphics2D;
    import java.awt.color.ColorSpace;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorConvertOp;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    import javax.imageio.ImageIO;
    
    /*
    * function: 用汉明距离进行图片相似度检测的Java实现
    * pHash-like image hash.
    * Author: Sun Huaqiang
    * Based On: http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
    */
    public class ImagePHash {
    
    	private int size = 32;
    	private int smallerSize = 8;
    
    	public ImagePHash() {
    		initCoefficients();
    	}
    
    	private ImagePHash(int size, int smallerSize) {
    		this.size = size;
    		this.smallerSize = smallerSize;
    
    		initCoefficients();
    	}
    
    	private int distance(String s1, String s2) {
    		int counter = 0;
    		for (int k = 0; k < s1.length(); k++) {
    			if (s1.charAt(k) != s2.charAt(k)) {
    				counter++;
    			}
    		}
    		return counter;
    	}
    
    	// Returns a 'binary string' (like. 001010111011100010) which is easy to do
    	// a hamming distance on.
    	private String getHash(InputStream is) throws Exception {
    		BufferedImage img = ImageIO.read(is);
    
    		/*
    		 * 1. Reduce size(缩小尺寸). Like Average Hash, pHash starts with a small
    		 * image. However, the image is larger than 8x8; 32x32 is a good
    		 * size.This is really done to simplify the DCT computation and not
    		 * because it is needed to reduce the high frequencies.
    		 */
    		img = resize(img, size, size);
    
    		/*
    		 * 2. Reduce color(简化色彩). The image is reduced to a grayscale just to
    		 * further simplify the number of computations.
    		 */
    		img = grayscale(img);
    
    		double[][] vals = new double[size][size];
    
    		for (int x = 0; x < img.getWidth(); x++) {
    			for (int y = 0; y < img.getHeight(); y++) {
    				vals[x][y] = getBlue(img, x, y);
    			}
    		}
    
    		/*
    		 * 3. Compute the DCT(计算DCT). The DCT(Discrete Cosine Transform,离散余弦转换)
    		 * separates the image into a collection of frequencies and scalars.
    		 * While JPEG uses an 8x8 DCT, this algorithm uses a 32x32 DCT.
    		 */
    		long start = System.currentTimeMillis();
    		double[][] dctVals = applyDCT(vals);
    		// System.out.println("DCT_COST_TIME: " + (System.currentTimeMillis() -
    		// start));
    
    		/*
    		 * 4. Reduce the DCT. This is the magic step. While the DCT is 32x32,
    		 * just keep the top-left 8x8. Those represent the lowest frequencies in
    		 * the picture.
    		 */
    		/*
    		 * 5. Compute the average value. Like the Average Hash, compute the mean
    		 * DCT value (using only the 8x8 DCT low-frequency values and excluding
    		 * the first term since the DC coefficient can be significantly
    		 * different from the other values and will throw off the average).
    		 */
    		double total = 0;
    
    		for (int x = 0; x < smallerSize; x++) {
    			for (int y = 0; y < smallerSize; y++) {
    				total += dctVals[x][y];
    			}
    		}
    		total -= dctVals[0][0];
    
    		double avg = total / (double) ((smallerSize * smallerSize) - 1);
    
    		/*
    		 * 6. Further reduce the DCT. This is the magic step. Set the 64 hash
    		 * bits to 0 or 1 depending on whether each of the 64 DCT values is
    		 * above or below the average value. The result doesn't tell us the
    		 * actual low frequencies; it just tells us the very-rough relative
    		 * scale of the frequencies to the mean. The result will not vary as
    		 * long as the overall structure of the image remains the same; this can
    		 * survive gamma and color histogram adjustments without a problem.
    		 */
    		String hash = "";
    
    		for (int x = 0; x < smallerSize; x++) {
    			for (int y = 0; y < smallerSize; y++) {
    				if (x != 0 && y != 0) {
    					hash += (dctVals[x][y] > avg ? "1" : "0");
    				}
    			}
    		}
    
    		return hash;
    	}
    
    	private BufferedImage resize(BufferedImage image, int width, int height) {
    		BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    		Graphics2D g = resizedImage.createGraphics();
    		g.drawImage(image, 0, 0, width, height, null);
    		g.dispose();
    		return resizedImage;
    	}
    
    	private ColorConvertOp colorConvert = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
    
    	private BufferedImage grayscale(BufferedImage img) {
    		colorConvert.filter(img, img);
    		return img;
    	}
    
    	private static int getBlue(BufferedImage img, int x, int y) {
    		return (img.getRGB(x, y)) & 0xff;
    	}
    
    	// DCT function stolen from
    	// http://stackoverflow.com/questions/4240490/problems-with-dct-and-idct-algorithm-in-java
    
    	private double[] c;
    
    	private void initCoefficients() {
    		c = new double[size];
    
    		for (int i = 1; i < size; i++) {
    			c[i] = 1;
    		}
    		c[0] = 1 / Math.sqrt(2.0);
    	}
    
    	private double[][] applyDCT(double[][] f) {
    		int N = size;
    
    		double[][] F = new double[N][N];
    		for (int u = 0; u < N; u++) {
    			for (int v = 0; v < N; v++) {
    				double sum = 0.0;
    				for (int i = 0; i < N; i++) {
    					for (int j = 0; j < N; j++) {
    						sum += Math.cos(((2 * i + 1) / (2.0 * N)) * u * Math.PI)
    								* Math.cos(((2 * j + 1) / (2.0 * N)) * v * Math.PI) * (f[i][j]);
    					}
    				}
    				sum *= ((c[u] * c[v]) / 4.0);
    				F[u][v] = sum;
    			}
    		}
    		return F;
    	}
    
    	/**
    	 *
    	 * @param img1
    	 * @param img2
    	 * @param tv
    	 * @return boolean
    	 */
    	public boolean imgChk(String img1, String img2, int tv) {
    		ImagePHash p = new ImagePHash();
    		String image1;
    		String image2;
    
    		try {
    			image1 = p.getHash(new FileInputStream(new File(img1)));
    			image2 = p.getHash(new FileInputStream(new File(img2)));
    			int dt = p.distance(image1, image2);
    			System.out.println("[" + img1 + "] : [" + img2 + "] Score is " + dt);
    			if (dt <= tv)
    				return true;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return false;
    	}
    
    	public static void main(String[] args) {
    
    		ImagePHash p = new ImagePHash();
    		String targetImage = "/Users/jjs/Documents/workspace/SimilarPhotoHunter/origin/meiliwu.jpg";
    		String compareImage = "/Users/jjs/Documents/workspace/SimilarPhotoHunter/images/";
    		System.out.println(p.imgChk(targetImage, compareImage + "美丽屋文字.jpeg", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "美丽屋去水印.jpeg", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "美丽屋美化.jpeg", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "google.gif", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "ohter_word.jpg", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "similar_pic.jpg", 10));
    		System.out.println(p.imgChk(targetImage, compareImage + "origin.jpg", 10));
    
    	}
    }

    更多相关内容
  • C# Net Core openxml 提取提出 取word 文本 图片 HtmlTextDrawingC# NetCoreopenxml 提取提出 取 word 文本 图片 HtmlTextDrawing注:只支持内嵌,不支持公式-----------------------------------------------------...

    C# Net Core openxml 提取 提出 取 word  文本  图片 Html Text Drawing

    C# Net Core openxml 提取 提出 取 word  文本  图片 Html Text Drawing

    注:只支持内嵌,不支持公式

    ------------------------------------------------

    ---------------文章最后为效果------------

    ------------------------------------------------

    加入包:OpenXml

    创建文件:Read.cs

    复制下面全部代码到文件 Read.cs

    using DocumentFormat.OpenXml;

    using DocumentFormat.OpenXml.Packaging;

    using DocumentFormat.OpenXml.Wordprocessing;

    using System;

    using System.Collections.Generic;

    using System.IO;

    using System.Text;

    using System.Xml;

    using System.Xml.Xsl;

    namespace YCBX.Office.WordXml

    {

    public class WordRead

    {

    public static List ReadToHtml(string wordPathStr)

    {

    return ReadToHtml(new FileStream(wordPathStr, FileMode.Open));

    }

    public static List ReadToHtml(Stream wordStream)

    {

    using (WordprocessingDocument doc = WordprocessingDocument.Open(wordStream, false))

    {

    //XmlWriterSettings settings = new XmlWriterSettings() { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Auto,DoNotEscapeUriAttributes=true};

    List paragraphHtmls = new List();

    MainDocumentPart mainPart = doc.MainDocumentPart;

    Body body = doc.MainDocumentPart.Document.Body;

    //段落

    foreach (var paragraph in body.Elements())

    {

    StringBuilder paragraphHtml = new StringBuilder();

    //块

    foreach (var run in paragraph.ChildElements)

    {

    if (run is Run)

    {

    foreach (OpenXmlElement openXmlElement in run.Elements())

    {

    //软回车

    if (openXmlElement is Break br)

    {

    paragraphHtmls.Add(paragraphHtml.ToString());

    paragraphHtml = new StringBuilder();

    }

    //文字块

    else if (openXmlElement is Text text)

    {

    paragraphHtml.Append(text.Text);

    }

    //图像块

    else if (openXmlElement is Drawing drawing)

    {

    //得到图像的内嵌ID(外嵌没做处理)

    var inline = drawing.Inline;

    var extent = inline.Extent;

    var pic = inline.Graphic.GraphicData.GetFirstChild();

    var embed = pic.BlipFill.Blip.Embed.Value;

    //得到图像流

    var part = mainPart.GetPartById(embed);

    var stream = part.GetStream();

    //流转2进制

    byte[] bytes = new byte[stream.Length];

    stream.Read(bytes, 0, bytes.Length);

    //2进制转base64

    string imgHtml = $"";

    paragraphHtml.Append(imgHtml);

    }

    }

    }

    //else if(run is DocumentFormat.OpenXml.Math.OfficeMath math)

    //{

    // var x = new XmlDocument();

    // x.LoadXml(math.OuterXml);

    // using var ms = ConvertToMatchMl(x, settings);

    // paragraphHtml.Append(ConvertToLatex(settings, ms));

    //}

    }

    paragraphHtmls.Add(paragraphHtml.ToString());

    }

    return paragraphHtmls;

    }

    }

    ///

    /// 合并文档

    ///

    ///

    ///

    public static void Combine(string finalFile, List files)

    {

    if (files.Count < 2)

    {

    return;

    }

    File.Copy(files[0], finalFile, true);

    using (WordprocessingDocument doc = WordprocessingDocument.Open(finalFile, true))

    {

    Body b = doc.MainDocumentPart.Document.Body;

    for (int i = 1; i < files.Count; i++)

    {

    using (WordprocessingDocument doc1 = WordprocessingDocument.Open(files[i], true))

    {

    foreach (var inst in doc1.MainDocumentPart.Document.Body.Elements())

    {

    b.Append(inst.CloneNode(true));

    }

    }

    }

    }

    }

    private string ConvertToLatex(XmlWriterSettings settings, Stream ms)

    {

    var latexTransform = new XslCompiledTransform();

    latexTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "mmltex.xsl"), new XsltSettings(true,true),new XmlUrlResolver() );

    using var la = new MemoryStream();

    latexTransform.Transform(new XmlTextReader(ms), XmlWriter.Create(la, settings));

    la.Seek(0, SeekOrigin.Begin);

    StreamReader sr = new StreamReader(la, Encoding.UTF8);

    return sr.ReadToEnd();

    }

    private Stream ConvertToMatchMl(XmlDocument xmlDocument, XmlWriterSettings settings)

    {

    var ms = new MemoryStream();

    var xslTransform = new XslCompiledTransform();

    xslTransform.Load(Path.Combine(AppContext.BaseDirectory, "xsltml", "OMML2MML.XSL"));

    xslTransform.Transform(xmlDocument, XmlWriter.Create(ms, settings));

    ms.Seek(0, SeekOrigin.Begin);

    return ms;

    }

    }

    }

    创建文件:ImageExtent.cs

    复制下面全部代码到文件 ImageExtent.cs

    using System;

    using System.Collections.Generic;

    using System.Text;

    namespace YCBX.Office.WordXml

    {

    ///

    /// 图像长度单位转换

    ///

    public class ImageExtent

    {

    private const decimal CM_TO_PX = 96M;

    private const decimal INCH_TO_CM = 2.54M;

    ///

    /// 厘米到EMU(English Metric Unit)

    ///

    private const decimal CM_TO_EMU = 360000M;

    ///

    /// EMU(English Metric Unit) 到像素(px)

    ///

    ///

    public static decimal EMU_TO_PX(decimal EMU)

    {

    return EMU / CM_TO_EMU / INCH_TO_CM * CM_TO_PX;

    }

    }

    }

    调用方法:

    var sss = new Read().ParagraphHtmlAll("1.docx");

    word文件中为:

    a1913e4c6a27d0cb4840a738bd89586b.png

    创建一个test.html,将代码放在

    中,查看效果为:

    1b6ba2980dd608d828384e9d097d90e4.png

    完成

    Java 提取Word中的文本和图片

    本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...

    Java Word中的文本、图片替换功能

    Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...

    提取WORD中的所有InlineShape图片并保存成文件

    InlineShape表示的类型其实不只是图片,还包括OLE, ACTIVE X等. 下面是MSDN中的定义:Represents an object in the text layer of a d ...

    Java 读取Word批注中的文本和图片

    本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...

    word中创建文本框

    word中创建文本框         在插入中点击"文本框"选项卡,例如以下图所看到的:        手工加入自己想要的文本框格式,然后选择所创建的文本框,在工具栏处会发现多了一 ...

    C&num;提取PPT文本——提取SmartArt中的文本、批注中的文本

    提取文本的情况在工作和学习中常会遇到,在前面的文章中,已经讲述了如何提取PPT中文本框里的文本,在本篇文章中,将介绍如何使用C#代码语言提取PPT文档中SmartArt和批注中的文本.同样的,程序里面 ...

    Java 添加、删除、替换、格式化Word中的文本(基于Spire&period;Cloud&period;SDK for Java)

    Spire.Cloud.SDK for Java提供了TextRangesApi接口可通过addTextRange()添加文本.deleteTextRange()删除文本.updateTextRang ...

    C&num; 读取Word文本框中的文本、图片和表格(附VB&period;NET代码)

    [概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...

    Java 读取PDF中的文本和图片

    本文将介绍通过Java程序来读取PDF文档中的文本和图片的方法.分别调用方法extractText()和extractImages()来读取.   使用工具:Free Spire.PDF for Ja ...

    随机推荐

    shell变量

    定义变量 定义变量时,变量名不加美元符号($),如: variableName="value" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样.同时,变量名 ...

    hpp头文件与h头文件的区别

    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译.而实现代码将直接 ...

    使用hexo在github上写blog

    使用hexo在github上写blog 安装nodejs http://nodejs.org/ 安装hexo npm install -g hexo 创建bolg文件夹 安装完成后在自己的工作目录创建 ...

    linux中mail函数不能发送邮件怎么办

    原因分析: 1.检查下本机25端口是否有开放 2.mail是利用linux自带的sendmail服务来发送邮件的,service sendmail status 查看下该服务的状态 发送命令:mail ...

    Jenkins User on Apt-Get Install Installation

    转自:http://stackoverflow.com/questions/6234016/jenkins-user-on-apt-get-install-installation QUESTION: ...

    在Windows下基于libx264&period;a的Qt 4&period;8&period;2视频压缩

    1.在用mingw 4.5.2编译x264后,生成libx264.a文件,将libx264.a和x264.h和x264_config.h拷贝到Qt工程中,将mingw/lib/libpthread.a ...

    【读书笔记】【深入理解ES6】&num;9-JavaScript中的类

    大多数面向对象的编程语言都支持类和类继承的特性,而JavaScript却不支持这些特性,只能通过其他方法定义并关联多个相似的对象.这个状态一直从ECMAScript 1持续到ECMAScript 5. ...

    PDF编辑方法,PDF怎么去除背景

    PDF文件现在是使用的频率很高的一个软件的格式,PDF文件能够更加直观清楚的表达,PDF文件的使用很方便但编辑起来就来没有那么容易了,PDF文件的编辑是需要借助软件的,今天小编就来跟大家分享一下PDF ...

    C&plus;&plus; lamba使用

    Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题. 原书的例子不够直观 ...

    通过PMP考试

    带了几年项目,终于持证上岗了,5A通过.

    展开全文
  • word文字下怎么画圈标记

    千次阅读 2020-12-19 13:40:25
    word文字下怎么画圈标记我们在编写Word文档时,经常需要将重要的词句圈出来,设置带圈字符的操作方法,WPS和Word非常相似,下面就以WPS为例来介绍,如何给Word中的文字加上圆圈。具体如下:1. 第一步,在电脑上打开...

    word文字下怎么画圈标记

    我们在编写Word文档时,经常需要将重要的词句圈出来,设置带圈字符的操作方法,WPS和Word非常相似,下面就以WPS为例来介绍,如何给Word中的文字加上圆圈。

    具体如下:

    1. 第一步,在电脑上打开WPS软件,新建一个空白的文档后,在文档中输入任意字符,比如我们这里输入的是“带圈的文字设置”。

    2. 第二步,在你输入的文字中选中一个需要画圈的文字比如我们这里选中的是“字”,然后点击如图所示箭头所指的图标。

    3. 第三步,点击上一步中的图标后会出现如图所示的小菜单,点击菜单中的带圈字符(E)”。

    4. 第四步,点击“带圈字符”后出现出图所示的小窗口,根据自己的需要在“样式”和“圈号”下进行选择和设置,然后点击“确定”。

    5.第五步,点击“确定”后回到首页就可以看到我们刚刚选中的字已经被画上圈了。

    6. 如图所示,我们选中一个文字“置”然后到“带圈字符”的窗口中在“圈号”的文字中输入任意另一个文字,比如这里输入的是“文”就可以将“置”替换成带圈的文字“文”。

    以上就是WPS中设置文字带圈的方法了。

    时间:2018-11-16 16:16 / 作者:百科全说

    word怎样输入横线?如果觉得横线不够粗,颜色不够鲜明,又应该如何修改呢? 方法如下: 如图,想插入这样一条又粗又红的横线. 点击"开始","段落". 在"段落"中找到"下框线",点击"下框线"右下角的小箭头,出现下拉列表,选择"横线". 插入了一条横线,下面要对这条横线加粗并变成红色.对着这条横线按鼠标右键,选择"设置横线格式". 设置相应的"高度&quo

    word文档中带圈的符号一般用来表示序号,但是通常我们在修改或者编辑文章的时候需要将重要的词句圈起来,那么如何在word文档中将关键词圈起来呢,我们一起来看看小编整理的方法.具体如下:1. 首先选中你想要画圈的字符,单击word菜单栏中的带圈字符按钮.2. 在弹出的页面中点击增大圈号,下面文字中的ff和圈号中的O一般是已经选中的状态,然后点击确定.3. 完成上述操作后我们发现我们选中的字符已经带圈了,但是圈把字符盖住了.4. 现在我们选中带圈的字符然后右击点击切换域代码.5. 然后我们选中黑色的

    在word文档中怎么在文字下添加波浪线?  步骤 1.新建一个wps文档,我输入下面这样一句话.输入之后,我要给事情两个字画上波浪线,那么先选中这两个字. 2.选中文字以后,将鼠标的光标放在选中的文字上面,按一下鼠标右键就会弹出一个窗口;在窗口里面单击"字体"选项. 3.接下来弹出了字体的窗口,里面有很多设置.在字体选项卡下面的"所有文字"中,有一项是下划线线型,当前显示无,点击其后的下拉按钮,即可看到很多下划线. 4.在弹出的窗口中有根多样式的下划线,点击选择一条

    在word文档编辑中,在标记一段文字或者一句话,又或者是一个词语的时候,我们可能会用到下划线来让这个标记的句子比较醒目,那么此时就要用到下划线的.而为了进一步吸引眼球,下划线需要改变颜色.下面小编为大家分享word如何修改文字下划线的颜色方法,来看看吧! 方法/步骤 打开word,找见有需要改变颜色的下划线. 选中要改变颜色下划线的文字. 在“开始”菜单中寻找下划线按钮. 点击小三角. 弹出对话框,在对话框中找见“下划线颜色”. 选择想要的颜色. 下划线颜色改变. 完成. 以上就是word如何修

    有时候,复制一段文字到WORD文档中,发现文字下有一条“下划线”,结果选中后按了“U”即字体体的下划线工具,结果不但没有消除反而有多了一条下划线在文字下面.这是怎么回事?下面小编就为大家详细介绍一下,不会的朋友快快来学习吧! 方法/步骤 试着去选中这条线,有出现了双线箭头,类似于表格的上边框一样,可以一定程度的上下拉动. 其实这是文字选用的或者说复制之前设定好的一种样式而已. 选择工具栏“开始”,在“样式”中选择“其他”下拉菜单. 选择“清除格式”,文字变小,最关键的是之前删除不了“下划线”顿时

    在word文档中画一个公章 1.在视图--工具拦--绘图选中"椭圆"工具,在按下"Shift"键的同时拖开鼠标,就可以得到一个正圆了. 2.在"颜色与线条"标签中,填充颜色选"无填充颜色",线条颜色设为红色,选3磅粗的单线形. 3.公章的文字用艺术字来制作. 填充颜色和线条颜色都用红色,并设成无阴影. 4.公章中间还有一个红五星. 用"自选图形"的星形就可以做出来了,填充颜色和线条颜色用红色. 5.然后

    给文档里添加下划线是我们平常最常用的功能之一,比如标注一些经典语句或者做个标记等,那么在word2007里如何做到这一点呢?下面小编就为大家介绍一下,来看看吧! 步骤 1.在word文档里添加下划线一共有两种情况,一种是在空白的地方添加,另外一种是给文字下方添加: 一.首先介绍一下如何给文档空白的地方添加下划线 ①我们先用word建立一个空白文档,如图. ②然后我们依次点击“开始”——“字体”——“下划线”,然后我们敲击空格键就可以,需要添加多长的下划线,就敲击多长的空格键 ③按照以上的方法,我

    在默认的情况下,使用word编辑文档的时候,当我们选择文字对象的时候,选择状态的颜色是这样的:黑底白字,那如何变word文字选中状态下的黑底白字呢 在默认的情况下,使用word编辑文档的时候,当我们选择文字对象的时候,选择状态的颜色是这样的:黑底白字,如下图! 现在,要解决的问题就是,如何修改这种黑底白字的选择状态的颜色呢?方法如下: 执行菜单操作“工具”→“选项”,如下图! 弹出我下图的对话框! 上图中,切换到“常规”选项卡,然后,在“常规选项”的下面,找到“蓝底白字”选项

    由于对word宏命令不太熟悉,我将个任务分解为三部分,第一,了解光标的移动指令;第二,了解加拼音的命令;第三,对排版进行一些美化调整。 第一点,并不复杂,简单录制一个宏,移动一下光标,就很清楚地看到移动的指令了。 Selection.MoveRightunit:=wdCharacter,Count:=1,Extend:=wdExtend 接下来,我在msdn简单浏览了一下selection对象以及一些move前缀的方法,初步了解了一些移动的指令。 第二点,我右键点了下菜单,在自定义菜单中找了“拼

    word页面中怎么画横线? 一:利用"U"绘制下划线 1.点击工具栏的 U 图标,或者按下快捷键Ctrl+U 2.一直按 空格键,页面上就会一直刷出横线了 二:使用绘图工具绘制横线 1.鼠标左键单击菜单栏的 视图-->工具栏-->选择 绘图 或者直接点击插入-形状,选择线条图标. 2.按住键盘上的Shift按键,拖动鼠标即可画出直线. 三:输入三个"-"和"="然后回车 1.在页面连续输入三个输入三个"-"然后回车

    Word文字怎么变成PPT演示文稿 word里的一级对应ppt里的大标题,word里的二级对应ppt里的正文部分的一级标题,word里的三级对应ppt里的正文部分的二级内容,以此类推. 一般来讲,设置级别最多到第3级就可以了.本示例截图,只到第2级,简化了. 具体操作:选中你要设置级别的段落,在大纲选项卡下的级别下拉框里选择你要设置的具体级别,比如一级. 第二步,保存这个word文件(设置好了级别). 第三步,在PPT程序里,开始,新建幻灯片,幻灯片(从大纲),选择那个保存的word文件,即可生

    解决word文字间距变大的方法 选中要修改的文字,点击“段落”.我们看到“常规的对齐方式”是——“两端对齐”. 如果整段都是纯文字,修改“对齐方式”——“左对齐”,点击“确定”就OK.再自己看情况调整下位置就行了. 因为我发现上面这个方式对我遇到的问题没有作用. 我怎么调,怎么删,想把下面的调上文字后面.就是不行. 原来,问题在这里,因为出问题的那一行下面是英文.因为一般情况下英文是不换行的,系统还没这么智能化,英文是不间断的,要是自动换行,可能意思就变了. 选中要修改的文字,右击,“段落”.在

    用word文档可以画出电脑显示器,你知道吗?如何做到?详细操作步骤请往下看. 最终效果: 步骤 1.新建文档,在文档的绘图工具栏中点“自选图形”右侧的三角形图标. 弹出的菜单中点“立方体”的图形. 2.然后,在文档中画下,画出个立方体: 双击立方体,弹出的操作框,在“填充颜色”右侧的三角形点下: 3.弹出的颜色选项中点选“黑色”: 在“线条颜色”这里点下三角形:弹出的颜色选项中点选“无线条颜色”: 然后,点确定. 立方体最后效果如图所示. 4.然后,调整立方体的大小. 立方体的四周有控制点,在左

    文字的呈现方法有很多种,比如在文字下方加下划线或者波浪线,以此来突出文字的重要性,那怎么在word文字上添加横线呢?我们来学习一下. 步骤 打开word文档,在文档中输入要添加文字的汉字,如百度经验. 然后选中文字,切换到开始-文wen-拼音指南. 点击全部删除按钮后,清除拼音. 在拼音文字中输入横线,再点击组合. 最后看一下最后效果,百度经验文字上添加了横线. 以上就是怎么在word文字上方添加横线方法介绍,操作很简单的,适合新手操作,希望大家喜欢!

    想要在word里绘制工艺流程图,应该怎么绘制?工艺流程图是指用于示意反应过程或化学加工的示意图,在分析产品.人员的运动中,工艺流程图对一步步的顺序提供了有价值的图解.工艺流程图主要利用图形符号的表达方式,能够十分清晰明了的表达工艺流程中各部分原件的结构以及工艺的运行过程.接下来小编就给大家说说在word里如何绘制工艺流程图? 在word里绘制工艺流程图的方法步骤 1.首先我们在打开的软件中点击插入,然后选择文本框. 2.在需要制作流程图的地方用鼠标推拉绘制文本框. 3.然后我们在文本框中输入工艺

    用word画饭盒,如图中的效果.详细操作步骤请往下看. 效果图: 步骤 1.新建文档: 在文档的绘图工具栏中点“圆角矩形”图标: 在文档上画出图形,调整图形大小: 2.图形在选中的状态下,点绘图工具栏中的“三维效果样式”图标: 弹出的菜单中点“三维设置”: 3.弹出三维设置工具箱,点“表面效果”图标: 在下拉的菜单中点“塑料效果”: 4.图形最后设置效果如图7: 现在来做饭盒的盖子: 鼠标右键点下刚才做好的图形,弹出的菜单中点“复制”,再按键盘的CTRL+V键,粘贴出另一个一样的图形: 5.按步

    word文件是我们学习,办公,工作等最需要的编辑软件,学校,企业,单位等都会用到,有时还是会遇到很多不懂的哦,可以在这里学习得到,每个方法简单实用.设置文字缩进很简单,步骤如下. 步骤 1.首先,鼠标单击选择文字 2.鼠标右键选择“段落”,如图 3.弹出段落选项窗口,找到“缩进”选项卡,如图 4.可以选择左侧或者右侧缩进多少字符,如图 5.也可以在右边“特殊格式”,下拉选择“首行缩进”和“悬挂缩进”,在“缩进值”那里选缩进需要的字符. 6.最后确定. 以上就是word文字怎么设置段落缩进方法介绍

    Word主要是用来编辑文本文档或者表格文档的,word是我们日常工作中不可缺少的办公软件,有需要的时候我们可能会画线,但是要是需要画直线的画在Word里应该怎样画呢?很多朋友都不还不知道,下面小编教大家如何在word中画线,请认真看哦.1.首先小编教大家一个很简单的快捷键,敲三下键盘上的减号,然后再点击回车键,直线就会自动画好了,敲三下键盘上的加号,然后再点击回车键,双直线就会自动画好了,是不是很简单呀: 2.在word里面也有,我们打开软件,新建一个文档,点击插入功能以后,再用鼠标在插功能栏下

    我们在做文字编辑时,经常会遇到要打出下划线的情况.像学生的考试试卷,或者合同书之类的.这里,我们讲讲word中写出下划线的三种方法,有需要的朋友可以参考本文,希望能对大家有所帮助. 方法一. 1.我们以劳动合同书为例.打开word2003,在word中输入甲方(用人单位)名称: 2.输完后,我们把输入法切换到“中文(中国)”或者是“美式键盘”, 3.回到word中,同时按住键盘上的shift+-键不放 4.这时word中就会出现下划线.我们在下划线出现了我们理想的长度就放开手.这时下划线就完成了

    Word是常用的文字编辑软件,有时我们需要直接引用一些文字上,会从网上复制粘贴到Word中,而有时复制的文字去掉文字格式后,还是会有多余的背景,今天小编就教大家去掉word文字背景的多种方法.具体方法一.字符底纹按钮1. 第一种方法,选中带背景的部分文字,点击上方菜单栏中"字体"上方的"字符底纹",点击一或两下就可以去掉文字背景啦.二.去掉突出显示1. 第二种方法,点击一下"字体颜色"按钮左侧的"以不同颜色突出显示文本".三.

    展开全文
  • Word2Vec原理及应用与文章相似度(推荐系统方法)

    Word2Vec与文章相似度(推荐系统方法)

    学习目标

    • 目标
      • 知道文章向量计算方式
      • 了解Word2Vec模型原理
      • 知道文章相似度计算方式
    • 应用
      • 应用Spark完成文章相似度计算

    1 文章相似度

    • 在我们的黑马头条推荐中有很多地方需要推荐相似文章,包括首页频道可以推荐相似的文章,详情页猜你喜欢
    • 需求
      • 首页频道推荐:每个频道推荐的时候,会通过计算两两文章相似度,快速达到在线推荐的效果,比如用户点击文章,我们可以将离线计算好相似度的文章排序快速推荐给该用户。此方式也就可以解决冷启动的问题
    • 方式:
      • 1、计算两两文章TFIDF之间的相似度
      • 2、计算两两文章的word2vec或者doc2vec向量相似度

    我们采用第二种方式,实践中word2vec在大量数据下达到的效果更好。

    2 Word2Vec模型介绍

    2.1为什么介绍Word2Vec

    • 计算相似度:寻找相似词、或者用于文章之间的相似度
    • 文本生成、机器翻译等

    2.2 词向量是什么

    定义:将文字通过一串数字向量表示

    • 词的独热表示

      :One-hot Representation

      • 采用稀疏方式 存储,简单易实现
      • 灯泡:[0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0]、灯管:[0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0]

    维度过大词汇鸿沟现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕”灯泡”和”灯管”这两个词是同义词也不行

    • 词的分布式表示

      :Distributed representation

      • 传统的独热表示( one-hot representation)仅仅将词符号化,不包含任何语义信息
      • Distributed representation 最早由 Hinton在 1986 年提出。它是一种低维实数向量,这种向量一般长成这个样子: [0.792, −0.177, −0.107, 0.109, −0.542, …]
      • 最大的贡献就是让相关或者相似的词,在距离上更接近了

    2.3 词向量原理

    • 统计语言模型: 统计语言模型把语言(词的序列)看作一个随机事件,并赋予相应的概率来描述其属于某种语言集合的可能性

    例如:一个句子由w1,w2,w3,w4,w5,…….这些词组,使得P(w1,w2,w3,w4,w5……)概率大(可以从训练语料中得出)

    • N-Gram
      • 语言是一种序列,词与词之间并不是相互独立
      • 一元模型(unigram model):假设某个出现的概率与前面所有词无关
        • P(s) = P(w1)P(w2)P(w3)…P(w4)
      • 二元模型(bigram model):假设某个出现的概率与前面一个词相关
        • P(s) = P(w1)P(w2|w1)P(w3|w2)…P(w_i|w_i-1)
      • 三元模型(trigram model):假设某个出现的概率与前面两个词相关
        • P(s) = P(w1)P(w2|w1)P(w3|w1,w2)…P(w_i|w_i-2,w_i-1)

    注:目前使用较多的是三元模型,由于训练语料限制,无法追求更大的N,并且N越大导致计算量越来越大

    2.4 词向量计算得出

    • 通过一个三层神经网络得出,由约书亚.本吉奥(Yoshua Bengio)提出word2vec模型

    在这里插入图片描述

    • 通过窗口输入句子中的连续三个词,w1,w2,w3
      • 输入网络中已是初始化的向量,如w1:[0,0,0,0,……,0],值的向量长度自定义
      • 三个词向量,输入到网络中,目标值为原句子的后面一个w4,通过onehot编码定义
      • 网络训练,网络参数更新,自动调整w1,w2,w3的向量值,达到经过最后的softmax(多分类概率),输出预测概率,与目标值计算损失

    3 文章词向量训练

    • 目的:通过大量历史文章数据,训练词的词向量

    由于文章数据过多,在开始设计的时候我们会分频道进行词向量训练,每个频道一个词向量模型。

    • 步骤:
      • 1、根据频道内容,读取不同频道号,获取相应频道数据并进行分词
      • 3、Spark Word2Vec训练保存模型

    根据频道内容,读取不同频道号,获取相应频道数据

    在setting目录汇总创建一个default.py文件,保存默认一些配置,如频道

    channelInfo = {
                1: "html",
                2: "开发者资讯",
                3: "ios",
                4: "c++",
                5: "android",
                6: "css",
                7: "数据库",
                8: "区块链",
                9: "go",
                10: "产品",
                11: "后端",
                12: "linux",
                13: "人工智能",
                14: "php",
                15: "javascript",
                16: "架构",
                17: "前端",
                18: "python",
                19: "java",
                20: "算法",
                21: "面试",
                22: "科技动态",
                23: "js",
                24: "设计",
                25: "数码产品",
            }
    

    创建word2vec.ipynb文件,用来训练模型:

    import os
    import sys
    # 如果当前代码文件运行测试需要加入修改路径,避免出现后导包问题
    BASE_DIR = os.path.dirname(os.path.dirname(os.getcwd()))
    sys.path.insert(0, os.path.join(BASE_DIR))
    
    PYSPARK_PYTHON = "/miniconda2/envs/reco_sys/bin/python"
    # 当存在多个版本时,不指定很可能会导致出错
    os.environ["PYSPARK_PYTHON"] = PYSPARK_PYTHON
    os.environ["PYSPARK_DRIVER_PYTHON"] = PYSPARK_PYTHON
    
    from offline import SparkSessionBase
    from setting.default import channelInfo
    from pyspark.ml.feature import Word2Vec
    
    
    
    class TrainWord2VecModel(SparkSessionBase):
    
        SPARK_APP_NAME = "Word2Vec"
        SPARK_URL = "yarn"
    
        ENABLE_HIVE_SUPPORT = True
    
        def __init__(self):
            self.spark = self._create_spark_session()
    
    
    w2v = TrainWord2VecModel()
    

    获取数据并分词处理,注意分词函数导入(这里只选取了18号频道部分数据进行测试)

    # 这里训练一个频道模型演示即可
    w2v.spark.sql("use article")
    article = w2v.spark.sql("select * from article_data where channel_id=18 limit 2")
    words_df = article.rdd.mapPartitions(segmentation).toDF(['article_id', 'channel_id', 'words'])
    

    Spark Word2Vec训练保存模型

    • 模块:from pyspark.ml.feature import Word2Vec
    • API:class pyspark.ml.feature.Word2Vec(vectorSize=100, minCount=5, numPartitions=1, stepSize=0.025, maxIter=1, seed=None, inputCol=None, outputCol=None, windowSize=5, maxSentenceLength=1000)
      • vectorSize=100: 词向量长度
      • minCount:过滤次数小于默认5次的词
      • windowSize=5:训练时候的窗口大小
      • inputCol=None:输入列名
      • outputCol=None:输出列名
    new_word2Vec = Word2Vec(vectorSize=100, inputCol="words", outputCol="model", minCount=3)
    new_model = new_word2Vec.fit(words_df)
    new_model.save("hdfs://hadoop-master:9000/headlines/models/test.word2vec")
    

    上传历史数据训练的模型

    在本地准备了训练一段时间每个频道的模型

    hadoop dfs -put ./word2vec_model /headlines/models/
    

    在这里插入图片描述

    4 增量更新-文章向量计算

    有了词向量之后,我们就可以得到一篇文章的向量了,为了后面快速使用文章的向量,我们会将每个频道所有的文章向量保存起来。

    • 目的:保存所有历史训练的文章向量
    • 步骤:
      • 1、加载某个频道模型,得到每个词的向量
      • 2、获取频道的文章画像,得到文章画像的关键词(接着之前增量更新的文章article_profile)
      • 3、计算得到文章每个词的向量
      • 4、计算得到文章的平均词向量即文章的向量

    加载某个频道模型,得到每个词的向量

    from pyspark.ml.feature import Word2VecModel
    channel_id = 18
    channel = "python"
    wv_model = Word2VecModel.load(
                    "hdfs://hadoop-master:9000/headlines/models/word2vec_model/channel_%d_%s.word2vec" % (channel_id, channel))
    vectors = wv_model.getVectors()
    

    获取新增的文章画像,得到文章画像的关键词

    可以选取小部分数据来进行测试

    # 选出新增的文章的画像做测试,上节计算的画像中有不同频道的,我们选取Python频道的进行计算测试
    profile = articleProfile.filter('channel_id = {}'.format(channel_id))
    
    profile.registerTempTable("incremental")
    articleKeywordsWeights = ua.spark.sql(
                    "select article_id, channel_id, keyword, weight from incremental LATERAL VIEW explode(keywords) AS keyword, weight")
    _article_profile = articleKeywordsWeights.join(vectors, vectors.word==articleKeywordsWeights.keyword, "inner")
    

    计算得到文章每个词的向量

    • 这里用词的权重 * 词的向量 = weights x vector=new_vector
    articleKeywordVectors = _article_profile.rdd.map(lambda row: (row.article_id, row.channel_id, row.keyword, row.weight * row.vector)).toDF(["article_id", "channel_id", "keyword", "weightingVector"])
    

    计算得到文章的平均词向量即文章的向量

    def avg(row):
        x = 0
        for v in row.vectors:
            x += v
        #  将平均向量作为article的向量
        return row.article_id, row.channel_id, x / len(row.vectors)
    
    articleKeywordVectors.registerTempTable("tempTable")
    articleVector = ua.spark.sql(
        "select article_id, min(channel_id) channel_id, collect_set(weightingVector) vectors from tempTable group by article_id").rdd.map(
        avg).toDF(["article_id", "channel_id", "articleVector"])
    

    对计算出的”articleVector“列进行处理,该列为Vector类型,不能直接存入HIVE,HIVE不支持该数据类型

    def toArray(row):
        return row.article_id, row.channel_id, [float(i) for i in row.articleVector.toArray()]
    
    articleVector = articleVector.rdd.map(toArray).toDF(['article_id', 'channel_id', 'articleVector'])
    

    最终计算出这个18号Python频道的所有文章向量,保存到固定的表当中

    • 创建文章向量表
    CREATE TABLE article_vector(
    article_id INT comment "article_id",
    channel_id INT comment "channel_id",
    articlevector ARRAY comment "keyword");
    

    保存数据到HIVE

    # articleVector.write.insertInto("article_vector")
    

    上传计算好的历史文章向量

    hadoop dfs -put ./article_vector /user/hive/warehouse/article.db/
    

    5 文章相似度计算

    • 目的:计算每个频道两两文章的相似度,并保存
    • 分析问题:
      • 1、是否需要某频道计算所有文章两两相似度?
      • 2、相似度结果数值如何保存?

    5.1 问题1

    我们在推荐相似文章的时候,其实并不会用到所有文章,也就是TOPK个相似文章会被推荐出去,经过排序之后的结果。如果我们的设备资源、时间也真充足的话,可以进行某频道全量所有的两两相似度计算。但是事实当文章量达到千万级别或者上亿级别,特征也会上亿级别,计算量就会很大。一下有两种类型解决方案

    每个频道的文章先进行聚类

    可以对每个频道内N个文章聚成M类别,那么类别数越多每个类别的文章数量越少。如下pyspark代码

    bkmeans = BisectingKMeans(k=100, minDivisibleClusterSize=50, featuresCol="articleVector", predictionCol='group')
                bkmeans_model = bkmeans.fit(articleVector)
                bkmeans_model.save(
                    "hdfs://hadoop-master:9000/headlines/models/articleBisKmeans/channel_%d_%s.bkmeans" % (channel_id, channel))
    

    但是对于每个频道聚成多少类别这个M是超参数,并且聚类算法的时间复杂度并不小,当然可以使用一些优化的聚类算法二分、层次聚类。

    局部敏感哈希LSH(Locality Sensitive Hashing)

    从海量数据库中寻找到与查询数据相似的数据是一个很关键的问题。比如在图片检索领域,需要找到与查询图像相似的图,文本搜索领域都会遇到。如果是低维的小数据集,我们通过线性查找(Linear Search)就可以容易解决,但如果是对一个海量的高维数据集采用线性查找匹配的话,会非常耗时,因此,为了解决该问题,我们需要采用一些类似索引的技术来加快查找过程,通常这类技术称为最近邻查找(Nearest Neighbor,AN),例如K-d tree;或近似最近邻查找(Approximate Nearest Neighbor, ANN),例如K-d tree with BBF, Randomized Kd-trees, Hierarchical K-means Tree。而LSH是ANN中的一类方法。

    • 基本思想:LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度

    经常使用的哈希函数,冲突总是难以避免。LSH却依赖于冲突,在解决NNS(Nearest neighbor search )时,我们期望:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wajdTPHm-1649232853147)(C:\Users\X\Desktop\001.png)]

    • 离得越近的对象,发生冲突的概率越高
    • 离得越远的对象,发生冲突的概率越低

    总结:那么我们在该数据集合中进行近邻查找就变得容易了,我们只需要将查询数据进行哈希映射得到其桶号,然后取出该桶号对应桶内的所有数据,再进行线性匹配即可查找到与查询数据相邻的数据。

    落入相同的桶内的哈希函数需要满足以下两个条件:

    1. 如果d(O1,O2)<r1,那么Pr[h(O1)=h(O2)] ≥ p1
    2. 如果d(O1,O2)>r2,那么Pr[h(O1)=h(O2)] ≤ p2

    LSH在线查找时间由两个部分组成:

    (1)通过LSH hash functions计算hash值(桶号)的时间;

    (2)将查询数据与桶内的数据进行比较计算的时间。第(2)部分的耗时就从O(N)变成了O(logN)或O(1)(取决于采用的索引方法)。

    注:LSH并不能保证一定能够查找到与query data point最相邻的数据,而是减少需要匹配的数据点个数的同时保证查找到最近邻的数据点的概率很大。

    实际中常见的LSH

    LSH详细过程

    mini hashing

    假设我们有如下四个文档D1,D2,D3,D4D1,D2,D3,D4的集合情况,每个文档有相应的词项,用{w1,w2,…w7}{w1,w2,…w7}表示。若某个文档存在这个词项,则标为1,否则标为0。

    在这里插入图片描述

    过程

    1、Minhash的定义为:** 特征矩阵按行进行一个随机的排列后,第一个列值为1的行的行号。

    在这里插入图片描述

    • 重复上述操作
      • 矩阵按行进行多次置换,每次置换之后统计每一列(对应的是每个文档)第一个不为0位置的行号,这样每次统计的结果能构成一个与文档数等大的向量,我们称之为签名向量
      • (如果两个文档足够相似,也就是说这两个文档中有很多元素是共有的,这样置换出来的签名向量,如果原来其中有一些文档的相似度很高,那么这些文档所对应的签名向量的相应的元素值相同的概率也很高。)

    初始时的矩阵叫做input matrix,由m个文档m,n个词项组成.而把由t次置换后得到的一个t×mt×m矩阵叫做signature matrix。

    在这里插入图片描述

    2、对Signature每行分割成若干brand(一个brand若干行),每个band计算hash值(hash函数可以md5,sha1任意),我们需要将这些hash值做处理,使之成为事先设定好的hash桶的tag,然后把这些band“扔”进hash桶中。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fmbc0IfD-1649232853148)(C:\Users\X\Desktop\005.png)]

    两个文档一共存在b个band,这b个band都不相同的概率是,r和b影响对应的概率.

    概率1−(1−sr)b就是最终两个文档被映射到同一个hash bucket中的概率。我们发现,这样一来,实际上可以通过控制参数r,b值来控制两个文档被映射到同一个哈希桶的概率。而且效果非常好。比如,令b=20,r=5

    s∈[0,1]是这两个文档的相似度,等于给的文当前提条件下:

    • 当s=0.8时,两个文档被映射到同一个哈希桶的概率是
      • Pr(LSH(O1)=LSH(O2))=1−(1−0.85)5=0.9996439421094793
    • 当s=0.2时,两个文档被映射到同一个哈希桶的概率是:
      • Pr(LSH(O1)=LSH(O2))=1−(1−0.25)5=0.0063805813047682

    参数环境下的概率图:

    在这里插入图片描述

    • 相似度高于某个值的时候,到同一个桶概率会变得非常大,并且快速靠近1
    • 当相似度低于某个值的时候,概率会变得非常小,并且快速靠近0

    Random Projection

    Random Projection是一种随机算法.随机投影的算法有很多,如PCA、Gaussian random projection - 高斯随机投影。

    随机桶投影是用于欧几里德距离的 LSH family。其LSH family将x特征向量映射到随机单位矢量v,并将映射结果分为哈希桶中。哈希表中的每个位置表示一个哈希桶。

    6 相似度计算

    • 目的:计算18号Python频道的文章之间相似度
    • 步骤:
      • 1、读取数据,进行类型处理(数组到Vector)
      • 2、BRP进行FIT

    读取数据,进行类型处理(数组到Vector)

    from pyspark.ml.linalg import Vectors
    # 选取部分数据做测试
    article_vector = w2v.spark.sql("select article_id, articlevector from article_vector where channel_id=18 limit 10")
    train = articlevector.select(['article_id', 'articleVector'])
    
    def _array_to_vector(row):
        return row.article_id, Vectors.dense(row.articleVector)
    
    train = train.rdd.map(_array_to_vector).toDF(['article_id', 'articleVector'])
    

    BRP进行FIT

    • class pyspark.ml.feature.BucketedRandomProjectionLSH(inputCol=None, outputCol=None, seed=None, numHashTables=1, bucketLength=None)
      • inputCol=None:输入特征列
      • outputCol=None:输出特征列
      • numHashTables=1:哈希表数量,几个hash function对数据进行hash操作
      • bucketLength=None:桶的数量,值越大相同数据进入到同一个桶的概率越高
      • method:
        • approxSimilarityJoin(df1, df2, 2.0, distCol=‘EuclideanDistance’)
        • 计算df1每个文章相似的df2数据集的数据
    from pyspark.ml.feature import BucketedRandomProjectionLSH
    
    brp = BucketedRandomProjectionLSH(inputCol='articleVector', outputCol='hashes', numHashTables=4.0, bucketLength=10.0)
    model = brp.fit(train)
    

    计算相似的文章以及相似度

    similar = model.approxSimilarityJoin(test, train, 2.0, distCol='EuclideanDistance')
    
    similar.sort(['EuclideanDistance']).show()
    

    7 问题3

    对于计算出来的相似度,是要在推荐的时候使用。那么我们所知的是,HIVE只适合在离线分析时候使用,因为运行速度慢,所以只能将相似度存储到HBASE当中

    • hbase

    8 文章相似度存储

    • 目的:将所有文章对应相似度文章及其相似度保存
    • 步骤:
      • 调用foreachPartition
        • foreachPartition不同于map和mapPartition,主要用于离线分析之后的数据落地,如果想要返回新的一个数据DF,就使用map后者。

    我们需要建立一个HBase存储文章相似度的表

    create 'article_similar', 'similar'
    
    # 存储格式如下:key:为article_id, 'similar:article_id', 结果为相似度
    put 'article_similar', '1', 'similar:1', 0.2
    put 'article_similar', '1', 'similar:2', 0.34
    put 'article_similar', '1', 'similar:3', 0.267
    put 'article_similar', '1', 'similar:4', 0.56
    put 'article_similar', '1', 'similar:5', 0.7
    put 'article_similar', '1', 'similar:6', 0.819
    put 'article_similar', '1', 'similar:8', 0.28
    

    定义保存HBASE函数,确保我们的happybase连接hbase启动成功,Thrift服务打开。hbase集群出现退出等问题常见原因,配置文件hadoop目录,地址等,还有

    • ntpdate 0.cn.pool.ntp.org或者ntpdate ntp1.aliyun.com
    • hbase-daemon.sh start thrift
    def save_hbase(partition):
        import happybase
        pool = happybase.ConnectionPool(size=3, host='hadoop-master')
    
        with pool.connection() as conn:
            # 建议表的连接
            table = conn.table('article_similar')
            for row in partition:
                if row.datasetA.article_id == row.datasetB.article_id:
                    pass
                else:
                    table.put(str(row.datasetA.article_id).encode(),
                             {"similar:{}".format(row.datasetB.article_id).encode(): b'%0.4f' % (row.EuclideanDistance)})
            # 手动关闭所有的连接
            conn.close()
    
    similar.foreachPartition(save_hbase)
    () as conn:
            # 建议表的连接
            table = conn.table('article_similar')
            for row in partition:
                if row.datasetA.article_id == row.datasetB.article_id:
                    pass
                else:
                    table.put(str(row.datasetA.article_id).encode(),
                             {"similar:{}".format(row.datasetB.article_id).encode(): b'%0.4f' % (row.EuclideanDistance)})
            # 手动关闭所有的连接
            conn.close()
    
    similar.foreachPartition(save_hbase)
    
    展开全文
  • Word2Vec与文章相似度

    2020-06-29 15:06:40
    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle ... 在我们的头条推荐中有很多地方需要推荐相似文章,包括首页频道可以推荐相似的文章,详情页猜你喜欢 需求 首页频道推荐:每个频道推荐的时
  • 简单好用的Word技巧一秒对齐文字在Word中如何对齐文字,我想十个人中有九个都会像三顿这样手打空格。只有短短几行倒还好说,如果是几十行甚至几百行,一定会打空格打到吐吧。标尺一秒对齐!只需要选中文字,在标尺处...
  • 我碰到一个问题是:在使用软件时报“检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005 ”这个错误,几番查找之后发现是电脑未装office的缘故。...
  • Word 文字处理实验报告

    千次阅读 2021-07-09 00:58:11
    ______________________ 年级(专业):_____________成绩:________ 实验时间:________________________实验地点:___________________________实验3-1:一、实验目的:掌握中文输入法及使用Word进行文字处理的基本...
  • 举例,如何用 Word2vec 寻找相似词: 对于一句话:『她们 夸 吴彦祖 帅 到 没朋友』,如果输入 x 是『吴彦祖』,那么 y 可以是『她们』、『夸』、『帅』、『没朋友』这些词 现有另一句话:『她们 夸 我 帅 到 没...
  • 基于SSM的个人博客系统设计软件程序源码+数据库+WORD毕业设计论文文档, 个人博客系统主要用于发表个人博客,记录个人生活日常,学习心得,技术分享等,供他人浏览,查阅,评论等。本系统结构如下: (1)博主端: ...
  • word转pdf转换器

    2021-06-05 02:50:32
    word转pdf转换器可将单文档、多文档快速转换为PDF,对于批量转换的用户来说节省了很多时间,提高了工作效率,是一款...相似软件版本说明软件地址5.3.7.0 电脑版查看3.25.6 电脑版查看2.21.411.0 电脑版查看word转pd...
  • PHP生成Word文档的方法

    2021-03-24 13:48:22
    由于Interop纯粹是一个Windows的特性,我们将在Windows平台下搭建Apache和PHP,下面,小编为大家搜索整理了PHP生成Word文档的方法,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!PHP生成word...
  • PHP生成word的三种方式PHP生成word原理利用windows下面的 com组件利用PHP将内容写入doc文件之中PHP生成word具体实现:利用windows下面的 com组件原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word....
  • php导出生成word的方法_PHP本文实例讲述了php导出生成word的方法。分享给大家供大家参考,具体如下:PHP导出...(3)点击下载后,(如果是图片的话,在保存为word时要使用绝对路径,这样才可以在保存的word中正常显示...
  • Facebook 在今年 3 月份发布了 Facebook AI 相似性搜索(简称 Faiss)项目,该项目提供的类库可以从多媒体文档中快速搜索出相似的条目——这个场景下的挑战是基于查询的传统搜索引擎无法解决的。Facebook 人工智能...
  • 一种方法是利用WORD 模板,在“文件”菜单中选择“新建”,在随后出现选单中选择新建模板,新建一模板文 件(与编辑一WORD 文档的过程相似),在页面设置中定义好相应参数,如在“字符数/行数”定义每页行数、字体...
  • PHP生成word的三种方式

    2018-07-28 18:11:59
    摘要: 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法。 btw:好像在博客园发表博客只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,
  • 【如果给你一个图片样张,让你设置字体字号颜色,颜色相近即可。字体的设置都能在字体的下选单中找到】。3.段落:设置段落对齐方式,设置段落大纲级别,设置文本缩进,设置段落间距、行距,设置对齐到网格线,插入项...
  • 而对于 Word 文本时同样也有对应的 Python库 Python-docx,在日常办公中,如果需要处理多个 word 文本,且操作步骤都是重复单调的,我想这个库就可以帮到你在了解 Python-docx 常用函数之前,需要知道 在 Python-...
  • 详解 Word2vec 之 Skip-gram 模型

    万次阅读 2021-10-07 16:37:04
    Skip−gram是一种获得词嵌入的模型,也是 Word2VecWord2Vec最基础的方法之一。
  • PHP生成word原理利用windows下面的 com组件利用PHP将内容写入doc文件之中具体实现:利用windows下面的 com组件原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成...
  • Word学习笔记分享

    千次阅读 多人点赞 2019-02-22 13:57:10
    第一章、Word 的常规排版 1-5 文字选择 Ctrl+鼠标选取——多选 Alt+鼠标选取——框选 1-11 文字效果 为文字添加填充与边框 1-13 字体其他效果 为字体添加着重号、删除线、上下标等效果 Ctrl+D ——打开字体选项栏 1-...
  • 最近工作遇到关于生成word的问题现在总结一下生成word的三种方法。btw:好像只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计博客园上net技术大牛比较多吧,如果把java,.net,...
  • 今天和大家分享很常用,很有效率的几个word办公小技巧。感兴趣的小伙伴快快收藏备用!一个页面显示多页内容:如果不想来回翻页,我们可以打开工具栏“视图”,在缩放处,点击“多页”就可以了,这样就不用每次都来回...
  • 一背景 非专业,业务又有这方面需要,强迫自己看一下NLP相关的背景知识。数学不高,不奢望能看懂,要是有大神能从小白的角度去讲解就...词嵌入:word embedding,相关理论:上下文相似的词,其语义也相似。而word e..
  • 有个用心的读者最近做了一篇论文,想知道Word2Vec的相关理论和应用方法,作为一个有强迫症的我,去翻查了大量的文献资料,决定从Word2Vec的上下文来温习一下这个NLP的基础以及做相关的知识体系的基本构建,为做Word2...
  • 一、PHP生成word的两种思路或原理1.利用windows下面的 com组件2.利用PHP将内容写入doc文件之中具体实现方法如下。二、利用windows下面的com组件原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word....
  • 课程介绍:本课程面向高校大学生,精讲计算机二级office高级应用中word难点部分。结合最新真题,一个知识点一个小视频,一个视频20分钟,轻松灵活。提供电子课件,课后qq群答疑。零基础也能学。支持多终端,手机、...
  • word常用快捷键、操作及实例:

    千次阅读 2019-10-26 09:48:02
    一、word基本设置: 1. 页面基础设置: 标尺:单击滚动条上方的‘标尺’按钮,可切换标尺 2.文章显示比例: 视图-显示比例-自己调整 3.视图-单页 将文档的单页显示在整个屏幕 视图-双页 将文档的两页显示在...
  • embedding之word2vec

    2021-04-21 11:01:46
    Word2Vec其实就是通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。Embedding其实就是一个映射,将单词从原先所属的空间映射到新的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,325
精华内容 3,730
关键字:

word怎么查找相似图片

友情链接: provoke-crashes.rar