精华内容
下载资源
问答
  • iOS 展示html文本两种方式

    千次阅读 2018-08-29 09:51:47
    目录 一、webview展示,链接跳转到系统safari ...2、跳转自定义,因为文本并没有占据整个页面,设计也未增加网页返回等内容,所以跳转到浏览器相对好一点,我这里跳转到safari控制器,在WKNavigationDelegate...

    目录

    一、webview展示,链接跳转到系统safari

    1、字体大小设置有两种方法:

    1.1、直接拼接在html字符串里面,可以设置字体值:

    1.2、WKNavigationDelegate 代理里面进行缩放:

    2、跳转自定义,因为文本并没有占据整个页面,设计也未增加网页返回等内容,所以跳转到浏览器相对好一点,我这里跳转到safari控制器,在WKNavigationDelegate 代理里面处理:

    二、传统label展示,这里链接不能点击

    1、将html转换为富文本:

    2、富文本高度计算:


    近做了个展示html富文本的内容,自己发现有两种写法,就提供出来吧,希望大家有什么好的建议或新的方法可以提出来

    环境:swift4  iOS 9.0 *

    一、webview展示,链接跳转到系统safari

    我这里使用的是wkwebview

     private let webView : WKWebView = {
            let view = WKWebView()
            let meta = "document.getElementsByName(\"viewport\")[0].content = \"width=self.view.frame.size.width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no\""   //宽度设置
            view.evaluateJavaScript(meta, completionHandler: nil)
            return view
        }()

    1、字体大小设置有两种方法:

    1.1、直接拼接在html字符串里面,可以设置字体值:

      let html =  "<html> \n  <head> \n <style type=\"text/css\"> \n  body {font-size:40;}\n </style>\n </head>\n <body>\(model?.content ?? "")</body> \n </html>"
      webView.loadHTMLString(html, baseURL: nil)

    1.2、WKNavigationDelegate 代理里面进行缩放:

      func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
            let js = "document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '300%'"   //这里放大3倍,写的300%,具体可以自己调整
            webView.evaluateJavaScript(js, completionHandler: nil)
       }

    2、跳转自定义,因为文本并没有占据整个页面,设计也未增加网页返回等内容,所以跳转到浏览器相对好一点,我这里跳转到safari控制器,在WKNavigationDelegate 代理里面处理:

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            
            guard let url = navigationAction.request.url else {
                decisionHandler(.allow)
                return
            }
           
             if url.absoluteString.hasPrefix("http"){
                    let safari = SFSafariViewController(url: url)
    //                self.navigationController?.pushViewController(safari, animated: true)
                    self.show(safari, sender: nil)  //nav和show这里展示效果一致
                     decisionHandler(.cancel)
               }else{
                    decisionHandler(.allow)
             }
     
        }

    二、传统label展示,这里链接不能点击

    1、将html转换为富文本:

    //htmlString  要转换的html字符串
    //width webview宽度,不设置图片有可能展示一半
      public static func `init`(htmlString:String,width:CGFloat = SCREEN_WIDTH) ->NSAttributedString{
            do {
                // 转换成atrributeString
                let aboutStr : String = htmlString as String
                
                let str1 = "<head><style>img{max-width:"
                let str2 = width
                let str3 = " !important;}</style></head>"
                
                let newStr = (str1 + "\(str2)" + str3 + aboutStr) as NSString
                //"<head><style>img{max-width:width!important;}</style></head>" 设置文本宽度,适配图片展示
    
                let strData = newStr.data(using: String.Encoding.unicode.rawValue, allowLossyConversion: true)!
                let attr = try NSMutableAttributedString.init(data: strData, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType] , documentAttributes: nil)
                return attr
            }catch let error as NSError {
                print(error.localizedDescription)
            }
            return NSAttributedString.init(string: "")
        }

    2、富文本高度计算:

    extension NSAttributedString{
    
        public func getSpaceLabelHeightwithSpeace(_ speace : CGFloat,font:UIFont,width:CGFloat) -> CGFloat {
            let size = self.boundingRect(with: CGSize.init(width: width, height: CGFloat(MAXFLOAT)), options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil)
            return size.height
        }
    }

    label设置富文本字体,子间距,然后直接赋值展示就可以啦,大家有什么问题或者好的想法可以评论回复哟

    推荐一个swift网络请求封装,很好用

    展开全文
  • 结构:   预览图片:   项目地址及下载: 本帖隐藏的内容 https://github.com/1002698389/breadtrip-master  breadtrip-master-master.zip (64.94 KB, 下载次数: 31)
    结构:
     

    预览图片:
     

    项目地址及下载:

    本帖隐藏的内容

    https://github.com/1002698389/breadtrip-master
     breadtrip-master-master.zip (64.94 KB, 下载次数: 31)
    展开全文
  • 文本相似度的设计与实现

    万次阅读 热门讨论 2017-01-20 15:37:38
    文本相似度的设计与实现 摘要:本文主要设计并实现了一个文本相似度系统,该系统主要功能计算文档之间的相似度,通过使用向量空间模型(VSM,Vector Space Model)及余弦相似度计算公式计算文档之间的相似度,数据...

    欢迎关注“程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^

    文本相似度的设计与实现

    摘要:本文主要设计并实现了一个文本相似度系统,该系统主要功能计算文档之间的相似度,通过使用向量空间模型(VSM,Vector Space Model)及余弦相似度计算公式计算文档之间的相似度,数据预处理过程中加入word2vec模型进行语义扩充,从而能够匹配到更多相关文档。

    1. 向量空间模型

    向量空间模型(VSM, Vector SpaceModel)由Salton等人于20世纪70年代年提出[1,2]。向量空间模型的主要思想是将文本内容的处理简化为向量空间中的向量运算,这样将空间上的相似度转化为语义上的相似度。当文档被表示为文档空间的向量时,便可通过计算向量之间的相似性来度量文档间的相似性。文本处理中最常用的相似性度量方式是余弦距离。

    向量空间模型的基本思想:

    给定一篇文档D=D(T1,T2,…Ti,…,Tn),若Ti在文档中既可以重复出现又存在先后次序,因此分析起来会较为困难。针对上述情况,暂不考虑Ti的顺序,并要求Ti互异,此时可将T1,T2,…Ti,…,Tn看作n维坐标,每一维对应相应值Wi,因此D(W1,W2,…,Wi,…,Wn)便可以看作一个n维向量。

    例如:有一篇文档D={大家好,才是真的好},首先进行分词后转换为D={大家/好/才是/真的/好},之后提取出公因词D={大家,好,才是,真的},最后通过向量空间模型将文档转换为对应的向量D={1,2,1,1}。

    向量空间模型只是将文档转换为方便计算的格式,若进行相似度计算,还需使用相似度计算公式进行计算。本文使用余弦相似度计算公式。

    2. 余弦相似度

    余弦相似度计算公式广泛应用于文本数据之间的相似度计算过程中。其数学表达如下:

    计算过程如下:

    例如,有2个文档D1={大家好},D2={才是真的好},首先将D1、D2分词后,D1={大家/好},D2={才是/真的/好},其次提取出公因词D={大家,好,才是,真的},然后通过向量空间模型转换成向量表达,D1={1,1,0,0},D2={0,1,1,1},最后进行相似度计算

    3. 文本相似度系统

    本文主要使用向量空间模型及余弦相似度距离公式进行文本相似度计算任务,系统的基本架构如下图1所示:

    其基本思想为:将文档输入系统,对文档进行数据预处理操作,数据预处理完成后使用向量空间模型将词组转化为向量,之后使用余弦相似度计算公式求解文档之间的相似度,最终将计算后的结果展示出来。

    数据预处理阶段,包括分词、取停用词、word2vec语义扩展,其流程如下图2所示:

    在word2vec语义扩展阶段,Word2vec是Google于2013年发布的一款基于深度学习的开源工具包,主要用于将单词以向量形式表示[3]。Word2vec首先使用语料训练模型,待模型训练结束后,将新的单词输入模型进行预测,模型可按相关度排序将最相近的预测单词展现给用户,通常而言,会将top30展示给用户。

    针对文档语义扩充,系统会先使用搜狗新闻语料训练CBOW模型,待模型训练结束后,将本档中的单词输入CBOW模型进行预测,最终将预测结果扩充回文档中,用于向量空间模型。

    同样以之前的2篇文档为例,D1={大家/好},D2={才是/真的/好},通过word2vec模型后,D1={大家/好/很好/不错},D2={才是/真的/好/很好/不错},提取出公因词D={大家,好,很好,不错,才是,真的},然后通过向量空间模型转换成向量表达,D1={1,1,1,1,0,0},D2={0,1,1,1,1,1},最后进行相似度计算

    通过比较两次的Score值可得出,通过word2vec能够提高文本相似度的计算分值。

    另外系统会计算文档中每一句话所对应的最大匹配及其相似度值,针对文档与文档的相似度计算,本文提出一种平均相似度计算公式,即:

    其中n(dicList1)是所求文档中包含的句子个数,公式的主要思路即将每句话的最大匹配相似度叠加后求取平均值。

    4. 系统设计

    相应代码如下:

    	/**
    	 * 程序运行入口
    	 * @throws IOException 
    	 */
    	public static void main(String[] args) throws IOException {
    		String dir,inputPath1,inputPath2,outputPath,word2vecModel,str1,str2;
    		long start,end,dur;
    		start = System.currentTimeMillis();
    		dir = "data/test/";
    		inputPath1 = dir + "doc3.txt";
    		inputPath2 = dir + "doc3.txt";
    		dir = "data/result/";
    		outputPath = dir + "out3_3.txt";
    		word2vecModel = "model/vectors-sougou.bin";
    		
    		FileHandler fh = new FileHandler();
    		List<String> docList1 = fh.putFileToList(inputPath1);
    		List<String> docList2 = fh.putFileToList(inputPath2);
    		Tool.initWriter1(outputPath);
    		
    		Word2VEC w = new Word2VEC() ;
            	w.loadGoogleModel(word2vecModel) ;
            
            	Model model = new Model();
            	model.run(docList1, docList2 ,w);
            
            	end = System.currentTimeMillis();
            	dur = end - start;
            	System.out.println("dur time = " + (1.0 * dur / 1000) + " s");
            	System.out.println("dur time = " + (1.0 * dur / (1000 * 60)) + " min");
            
    	}/**
    	 * 程序运行入口
    	 * @throws IOException 
    	 */
    	public static void main(String[] args) throws IOException {
    		String dir,inputPath1,inputPath2,outputPath,word2vecModel,str1,str2;
    		long start,end,dur;
    		start = System.currentTimeMillis();
    		dir = "data/test/";
    		inputPath1 = dir + "doc3.txt";
    		inputPath2 = dir + "doc3.txt";
    		dir = "data/result/";
    		outputPath = dir + "out3_3.txt";
    		word2vecModel = "model/vectors-sougou.bin";
    		
    		FileHandler fh = new FileHandler();
    		List<String> docList1 = fh.putFileToList(inputPath1);
    		List<String> docList2 = fh.putFileToList(inputPath2);
    		Tool.initWriter1(outputPath);
    		
    		Word2VEC w = new Word2VEC() ;
            	w.loadGoogleModel(word2vecModel) ;
            
            	Model model = new Model();
            	model.run(docList1, docList2 ,w);
            
            	end = System.currentTimeMillis();
            	dur = end - start;
            	System.out.println("dur time = " + (1.0 * dur / 1000) + " s");
            	System.out.println("dur time = " + (1.0 * dur / (1000 * 60)) + " min");
            
    	}
    

    数据预处理阶段如下:

    public class FileHandler {
    	
    	public static FileReader fr=null;
    	public static BufferedReader br=null;
    	public static String line=null;
    	
    	/**
    	 * input:path
    	 * 将文件内容添加入list中,一句一条
    	 */
    	public List<String> putFileToList(String path) {
    		
    		List<String> docList = new ArrayList<String>();
    		try {
    			fr = new FileReader(path);
    			br = new BufferedReader(fr);
    			while ((line = br.readLine()) != null) {
    				String[] strArr;
    				if(line.contains(".")){
    					strArr = line.split(".");
    					System.out.println(strArr.length);
    				}else if (line.contains("。")) {
    					strArr = line.split("。");
    				}else if (line.contains(".")) {
    					strArr = line.split(".");
    				}else if (line.contains(";")) {
    					strArr = line.split(";");
    				}else {
    					strArr = new String[1];
    					strArr[0] = line;
    				}
    				int i,n;
    				n = strArr.length;
    				for(i = 0;i < n;i++){
    					docList.add(strArr[i]);
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return docList;
    	}
    	
    	/**
    	 * input:path
    	 * output:List<String>
    	 * 读取词典信息,以list返回词典
    	 */
    	public List<String> readDic(String path) {
    		List<String> list = new ArrayList<String>();
    		try {  
                fr=new FileReader(path);
    			br=new BufferedReader(fr);
                while ((line=br.readLine()) != null ) {  
                    StringTokenizer st = new StringTokenizer(line);
                    while(st.hasMoreElements()){
                    	list.add(st.nextToken());
                    }
    			}
                br.close();
                br.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    		return list;
    	}
    	
    }
    

     

    public class StringHandler {
    	
    	public static byte[] bt;
    	public static InputStream is;
    	public static Reader read;
    	public static Lexeme t;
    	public static IKSegmenter iks;
    	
    	/**
    	 * input:str
    	 * 将字符串分词转换成数组
    	 */
    	public List<String> stringToArray(String str) {
    		
    		List<String> list = new ArrayList<String>();
    		bt = str.getBytes();
    		is = new ByteArrayInputStream(bt);
    		read = new InputStreamReader(is);
    		iks = new IKSegmenter(read, true);
    		try {
    			while ((t = iks.next()) != null) {
    				list.add(t.getLexemeText());
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return list;
    		
    	}
    	
    	/**
    	 * input:arr
    	 * 使用word2vec将字符数组内容扩充
    	 */
    	public List<String> extendWord(Word2VEC w, List<String> list) {
    	
    		List<String> tempList = new ArrayList<String>();
    		Set<WordEntry> temp;
    		Iterator iter;
    		WordEntry entry;
    		int i,n;
    		n = list.size();
    		for(i = 0;i < n;i++){
    			temp = w.distance(list.get(i));
    			iter = temp.iterator();
    			if(!tempList.contains(list.get(i))){
    				tempList.add(list.get(i));
    			}
    			while(iter.hasNext()){
    				entry = (WordEntry) iter.next();
    				if(!tempList.contains(entry.name)){
    					tempList.add(entry.name);
    				}
    			}
    		}
    		return tempList;
    		
    	}
    	
    	/**
    	 * input:list,stopWordsPath
    	 * 删除停用词,通过读取stopWordsPath中的停用词表,将list中的停用词删除,并返回去除停用词后的list
    	 */
    	public List<String> deleteStopWords(List<String> list, String path2) {
    		
    		FileHandler fh = new FileHandler();
    		List<String> stopDic = fh.readDic(path2);
    		List<String> temp = new ArrayList<String>();
    		int i,n;
    		n = list.size();
    		try {  
    			for(i = 0;i < n;i++){
    				if(!stopDic.contains(list.get(i))){
    					temp.add(list.get(i));
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return temp;
    		
    	}
    }
    
    
     

    模型计算阶段如下:

    public class Model {
    
    	/**
    	 * input:docList1,docList2 主方法入口及控制器
    	 */
    	public void run(List<String> docList1, List<String> docList2, Word2VEC w) {
    		int i, j, n1, n2;
    		double[] similarArr;
    		int[] locArr;
    		double max, temp;
    		int loc;
    		n1 = docList1.size();
    		n2 = docList2.size();
    		similarArr = new double[n1];
    		locArr = new int[n1];
    		for (i = 0; i < n1; i++) {
    			max = 0.0;
    			temp = 0.0;
    			loc = 0;
    			for (j = 0; j < n2; j++) {
    				try {
    					temp = getSimilar(docList1.get(i), docList2.get(j), w);
    				} catch (IOException e) {
    					temp = 0.0;
    					e.printStackTrace();
    				}
    				if (temp > max) {
    					max = temp;
    					loc = j;
    				}
    			}
    			similarArr[i] = max;
    			locArr[i] = loc;
    		}
    		Tool.output(docList1, docList2, locArr, similarArr);
    	}
    
    	/**
    	 * input:str1,str2 计算2个字符串之间的相似度
    	 */
    	public double getSimilar(String str1, String str2, Word2VEC w) throws IOException {
    
    		double ret = 0.0;
    		// 创建向量空间模型,使用map实现,主键为词项,值为长度为2的数组,存放着对应词项在字符串中的出现次数
    		Map<String, int[]> vectorSpace = new HashMap<String, int[]>();
    		int[] itemCountArray = null;// 为了避免频繁产生局部变量,所以将itemCountArray声明在此
    		Iterator iter;
    		double vector1Modulo = 0.00;// 向量1的模
    		double vector2Modulo = 0.00;// 向量2的模
    		double vectorProduct = 0.00; // 向量积
    		List<String> list1,list1_temp,list2,list2_temp,temp1,temp2;
    		
    		StringHandler sh = new StringHandler();
    		
    		list1_temp = sh.stringToArray(str1);
    		list2_temp = sh.stringToArray(str2);
    		
    		/*
    		//使用word2vec扩充语义
    		temp1 = sh.stringToArray(str1);
    		temp2 = sh.stringToArray(str2);
    		list1 = sh.extendWord(w, temp1);
    		list2 = sh.extendWord(w, temp2);
    		*/
    		list1 = sh.deleteStopWords(list1_temp, Conf.stopWordsPath);
    		list2 = sh.deleteStopWords(list2_temp, Conf.stopWordsPath);
    		
    		int i,n;
    		n = list1.size();
    		for (i = 0; i < n; ++i) {
    			if (vectorSpace.containsKey(list1.get(i)))
    				++(vectorSpace.get(list1.get(i))[0]);
    			else {
    				itemCountArray = new int[2];
    				itemCountArray[0] = 1;
    				itemCountArray[1] = 0;
    				vectorSpace.put(list1.get(i), itemCountArray);
    			}
    		}
    		
    		// 对str2处理
    
    		n = list2.size();
    		for (i = 0; i < n; ++i) {
    			if (vectorSpace.containsKey(list2.get(i)))
    				++(vectorSpace.get(list2.get(i))[1]);
    			else {
    				itemCountArray = new int[2];
    				itemCountArray[0] = 0;
    				itemCountArray[1] = 1;
    				vectorSpace.put(list2.get(i), itemCountArray);
    			}
    		}
    
    		// 计算相似度
    		iter = vectorSpace.entrySet().iterator();
    		while (iter.hasNext()) {
    			Map.Entry entry = (Map.Entry) iter.next();
    			itemCountArray = (int[]) entry.getValue();
    			vector1Modulo += itemCountArray[0] * itemCountArray[0];
    			vector2Modulo += itemCountArray[1] * itemCountArray[1];
    			vectorProduct += itemCountArray[0] * itemCountArray[1];
    		}
    		vector1Modulo = Math.sqrt(vector1Modulo);
    		vector2Modulo = Math.sqrt(vector2Modulo);
    		// 返回相似度
    		ret  = (vectorProduct / (vector1Modulo * vector2Modulo));
    		return ret;
    
    	}
    
    }
    

     

     

    参考文献:

     

    [1]Salton G, Lesk M E. Computer Evaluation of Indexing and Text Processing[J].Journal of the Acm, 1968, 15(1):8-36.

    [2]Salton. The SMART Retrieval System—Experiments in Automatic DocumentProcessing[C]// Prentice-hall, Inc Upper Saddle River. Prentice-Hall, Inc.1971.

    [3]苏增才.基于word2vec和SVMperf的网络中文文本评论信息情感分类研究[D].河北科技大学,2015.


    本文代码下载地址:

    http://download.csdn.net/detail/u013473512/9742055

    https://github.com/Emmitte/DocDistance

    欢迎关注“程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^

    展开全文
  • 爬虫1.1 整体思路1.2 网页爬取和解析1.3 数据存储反爬虫对抗2 探索性分析与文本数据预处理2.1 探索性分析2.2 数据预处理2.3词云展示3 文本的情感分析3.1 先上结果3.2 文本特征提取(TF-IDF)3.3 机器学习建模3.4 ...


    1.前言

    今天应同学要求,介绍一篇关于大数据处理的毕业设计,基于大数据挖掘分析的大众点评评论文本挖掘。


    2.爬虫

    1.1 整体思路

    爬取大众点评十大热门糖水店的评论,爬取网页后从html页面中把需要的字段信息(顾客id、评论时间、评分、评论内容、口味、环境、服务、店铺ID)提取出来并存储到MYSQL数据库中。

    1.2 网页爬取和解析

    链接格式为"http://www.dianping.com/shop/" + shopID + “/review_all/” + pi,如:http://www.dianping.com/shop/518986/review_all/p1 ,一页评论有20条。我们使用for循环构造链接URL,使用requests库发起请求并把html页面爬取下来,通过BeautifulSoup和re库解析页面提取信息。

    我们发现完整的评论都存储在’div’,'main-review’中,且部分页面口味、环境、服务并不是每一页都有,因此需要使用try…except…防止程序中断,BeautifulSoup部分代码如下:

    for item in soup('div','main-review'):
        cus_id = item.find('a','name').text.strip()
        comment_time = item.find('span','time').text.strip()
        comment_star = item.find('span',re.compile('sml-rank-stars')).get('class')[1]
        cus_comment = item.find('div',"review-words").text.strip()
        scores = str(item.find('span','score'))
        try:
            kouwei = re.findall(r'口味:([\u4e00-\u9fa5]*)',scores)[0]
            huanjing = re.findall(r'环境:([\u4e00-\u9fa5]*)',scores)[0]
            fuwu = re.findall(r'服务:([\u4e00-\u9fa5]*)',scores)[0]
            except:
                kouwei = huanjing = fuwu = '无'
    

    1.3 数据存储

    我们使用MYSQL数据库,安装教程参考菜鸟教程,python连接MYSQL数据推荐使用pymysql,同样是推荐菜鸟教程菜鸟教程。我们需要先建立一个数据库和表,然后连接并定义游标,然后写对应的sql语句,最后执行事务,存储部分的代码如下:

    #连接MYSQL数据库
    db = pymysql.connect("localhost","root","","TESTDB" )
    cursor = db.cursor()
    #存储爬取到的数据
    def save_data(data_dict):
        sql = '''INSERT INTO DZDP(cus_id, comment_time, comment_star, cus_comment, kouwei, huanjing,           fuwu, shopID) VALUES(%s,%s,%s,%s,%s,%s,%s,%s)'''
        value_tup = (data_dict['cus_id']
                     ,data_dict['comment_time']
                     ,data_dict['comment_star']
                     ,data_dict['cus_comment']
                     ,data_dict['kouwei']
                     ,data_dict['huanjing']
                     ,data_dict['fuwu']
                     ,data_dict['shopID']
                     )
        try:
            cursor.execute(sql,value_tup)
            db.commit()
        except:
            print('数据库写入失败')
        return
    

    反爬虫对抗

    • 修改请求头中浏览器信息:使用fake_useragent第三方库,修改request中的headers参数,用法如下:
    from fake_useragent import UserAgent
    ua = UserAgent()
    headers = {'User-Agent':ua.random}
    
    • 设置跳转路径:在访问评论时,一般的浏览行为是从某一页跳转到下一页这样的,而不是直接通过连接访问,为了更好的伪装成一个正常的访问,我们需要设置一下跳转的路径,修改headers中的Referer参数
    headers = {
            'User-Agent':ua.random,
            'Cookie':cookie,
            'Referer': 'http://www.dianping.com/shop/518986/review_all'
    }
    
    • 设置Cookies:评论数据需要登录后才能获取,下面介绍一种非常简单方便的绕过登录的方法。

    • 在网页上进行登录
      使用Chrome浏览器的开发者工具,查询当前请求的cookie
      复制浏览器中的cookie,使用此cookie对我们的请求进行伪装
      使用IP代理池:这里使用西刺代理的免费代理,构建一个爬虫爬取西刺代理的ip,然后进行验证,筛掉不可用的ip,构建出ip池供后续调用,代码来自网络。但是经过测试,大众点评对一个账号不同ip访问监控非常严格,使用IP代理池不更换账号的话,死的更快,封你账号,然而构建账号池比较麻烦,我们先暂缓。

    • 降低爬取频率:一个简单又有效的方法就是降低爬取频率,毕竟高频率的爬取对服务器也是一个考验,如果对速度的要求不是很高的话,建议把频率放慢一点,你好我好大家好!

    import random
    import time
    time.sleep(6*random.random() + 4)
    

    2 探索性分析与文本数据预处理

    2.1 探索性分析

    查看数据大小以及基础信息 ,浏览数据

    在这里插入图片描述
    样本分布
    在这里插入图片描述
    各店铺评分分布
    在这里插入图片描述
    点评数的的时间分布
    在这里插入图片描述
    查看评论长度对结果影响
    在这里插入图片描述

    2.2 数据预处理

    去除非文本数据:可以看出,爬虫获取的数据非常多类似“\xa0”的非文本数据,而且都还有一些无意义的干扰数据,如结尾的“收起评论”

    data['cus_comment'] = data['cus_comment'].str.replace(r'[^\u4e00-\u9fa5]','').str.replace('收起评论','')
    

    中文分词:中文文本数据处理,怎么能离开中文分词呢,我们使用jieba库,简单又好用。这里我们把文本字符串处理为以空格区隔的分词字符串

    import jieba
    data['cus_comment'] = data['cus_comment'].apply(lambda x:' '.join(jieba.cut(x)))
    

    去除停用词:文本中有很多无效的词,比如“着”,“和”,还有一些标点符号,这些我们不想在文本分析的时候引入,因此需要去掉,因为wordcloud和TF-IDF都支持停用词,因此就不额外处理了

    2.3词云展示

    在这里插入图片描述

    3 文本的情感分析

    3.1 先上结果

    在这里插入图片描述
    模型的效果还可以的样子,yeah~接下来我们好好讲讲怎么做的哈,我们通过爬虫爬取了大众点评广州8家最热门糖水店的3W条评论信息以及评分作为训练数据,前面的分析我们得知样本很不均衡。接下来我们的整体思路就是:文本特征提取(TF-IDF)—机器学习建模—模型评价。

    我们先不处理样本不均衡问题,直接建模后查看结果,接下来我们再按照两种方法处理样本不均衡,对比结果。

    3.2 文本特征提取(TF-IDF)

    模型不能直接处理文本数据,因此需要先把文本数据转为向量,方法有词库表示法、TF-IDF、word2vec等

    3.3 机器学习建模

    这里我们使用文本分类的经典算法朴素贝叶斯算法,而且朴素贝叶斯算法的计算量较少。特征值是评论文本经过TF-IDF处理的向量,标签值评论的分类共两类,好评是1,差评是0。情感评分为分类器预测分类1的概率值。

    3.4 最后输出的准确率

    #从大众点评网找两条评论来测试一下
    test1 = '很好吃,环境好,所有员工的态度都很好,上菜快,服务也很好,味道好吃,都是用蒸馏水煮的,推荐,超好吃' #5星好评
    test2 = '糯米外皮不绵滑,豆沙馅粗躁,没有香甜味。12元一碗不值。' #1星差评
    print('好评实例的模型预测情感得分为{}\n差评实例的模型预测情感得分为{}'.format(ceshi(classifier,test1),ceshi(classifier,test2)))
    
    >>>好评实例的模型预测情感得分为0.8638082706675478
    >>>差评实例的模型预测情感得分为0.7856544482460911
    

    最后

    获取源码方式

    在这里插入图片描述

    展开全文
  • 文本处理

    千次阅读 2020-10-23 09:12:16
    所有类 Unix 的操作系统都非常依赖于被用于几种数据类型存储的文本文件。所以这很有道理, 有许多用于处理文本的工具。在这一章中,我们将看一些被用来“切割”文本的程序。在下一章中, 我们将查看更多的文本处理...
  • 【网页设计关于一个静态展示类网站的建立

    千次阅读 热门讨论 2016-01-30 15:51:37
    1、用一种色彩。这里是指先选定一种色彩,然后调整透明度或者饱和度,(说得通俗些就是将色彩变淡或则加深),产生新的色彩,用于网页。这样的页面看起来色彩统一,有层次感。...这种配色方法在网站设计种最为常用。 4
  • UEditor,自定义文本控件,表单设计
  • 关于clob字段:富文本提交后传入后台的是html格式,所以我在ajax用html格式传递:这样后台提交之后的格式就是html格式,但是传入后台我用的是String 会将“&lt;”“&gt;”自动转义成“&amp;lt”“&...
  • swift UI专项训练19 TextView 多行文本

    千次阅读 2015-02-28 01:33:49
    有时候我们所要展示的内容一行文本放不下,这就需要多行文本TextView,拖拽的时候注意上界不要超过电池的小图标。 可以在属性编辑器中对多行文本的内容进行更改,按住control键和回车键换行。 运行...
  • 计算机设计大赛-校赛展示

    千次阅读 2018-04-13 16:49:44
    产品录屏展示 云朵开场白 BGM响起后,云朵出现 屏幕上巨大的“书蕴” 简单介绍项目 书中自有颜如玉,书中自有黄金屋。 大家好,我是书蕴的项目负责人陈睿。 书蕴,是基于书评内容的书籍推荐系统。 ...
  • 文本识别系统实现

    2019-11-07 14:05:36
    本文主要介绍一种入门级文本识别系统的大致实现方法,其主要技术主要涉及要文本目标检测、OCR识别以及GUI界面设计等。闲话少说,下面先来看一下简单的系统样子: 由于本人使用的是笔记本电脑,分辨率不足所以界面...
  • 关于文本相似度计算开发包的构想

    千次阅读 2006-08-12 11:51:00
    最近有一个想法,想用python实现一个小型开发包,以方便的实现并测试各种文本相似度计算算法,输入之一是一个精心建立的小型测试文本语料库,之二则是检索请求文本,输出则可以依据配置的相似度计算方法输出排好序的...
  • 文本可视化研究

    万次阅读 2017-10-23 19:28:32
    文本可视化技术综合了文本分析、数据挖掘、数据可视化、计算机图形学、人机交互、认知科学等学科的理论和方法,为人们理解复杂的文本内容、结构和内在的规律等信息的有效手段。 1.2文本可视化作用和重要性 问题 ...
  • ABCNet文本识别

    千次阅读 2020-07-06 15:41:05
    尽管最近取得了巨大的进展[10,41,27,35,26,42],但由于文本在大小、纵横比、字体样式、透视失真和形状等方面的多样性,在野外检测和识别文本仍然是一个悬而未决的问题。虽然深度学习的出现大大提高了场景文本识别...
  • 关于tableau里面展示部分时间段的问题简述 需求:给的销售量是6月到10月的每一天的数据,现在只想要9月到10月的数据, 把日期的维度拖到列,把单量拖到行,注意这个时间的日期维度。 选择适合自己时间方式 根据自己...
  • 前后端交互-一些关于接口设计的思考

    万次阅读 多人点赞 2017-11-18 11:04:14
    原文链接:前后端交互-一些关于接口设计的思考 作者:安东尼_Anthony 前言最近在工作中和后端童鞋打交道,前后端沟通最为重点的就是接口API,这里整理一下接口设计的一些考虑点并做分析,希望对大家有帮助 。兵马未...
  • 输出文本在第一章里,例子程序HelloCE调用DrawText函数显示了一行文本。代码如下:DrawText (hdc, TEXT ("Hello Windows CE!"), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);DrawText是一个相当高级的函数...
  • 这种时候,设计师就会提出行间距的需求,希望让文本展示得更美观。类似的标注就会像这样: 通常来说既然设计师要求的是行间距,那么我们直接设置lineSpacing就好。但是 UILabel 是没有这么一个直接暴露的属性的,...
  • 文本可视化教学

    千次阅读 2017-06-27 10:30:50
    文字是传递信息最常用的载体。在当前这个信息爆炸的时代,人们接收信息的速度...这一方面说明人们对图形的接受程度比枯燥的文字要高很多,另一方面说明人们急需一种更高效的信息接收方式,文本可视化正是解药良
  • 通过scikit-learn计算文本内容的tfidf并构造N*M矩阵(N个文档 M个特征词); 2.调用scikit-learn中的K-means进行文本聚类; 3.使用PAC进行降维处理,每行文本表示成两维数据; 4.最后调用Matplotlib显示聚类效果图...
  • 如果你想对一个陌生的文本进行分类处理,例如新闻、游戏或是编程相关。那么贝叶斯分类算法应该正是你所要找的了。贝叶斯分类算法是统计学中的一种分类方法,它利用概率论中的贝叶斯公式进行扩展。下面我们就针对朴素...
  • 背景说明可以说在分析...想要实现这个任务,首先需要给出一组类别,然后根据这些类别收集相应的文本集合,构成训练数据集,训练集既包括分好类的文本文件也包括类别信息。 今天,在互联网的背景下自动化的文本分类被广
  • Java课设——文本编辑器

    千次阅读 多人点赞 2018-12-02 19:54:11
    编程实现一个文本编辑器,使其具有新建、打开、保存,编辑(查找、替换、大小写转换等)、统计(字数、行数、字符数等)、格式(字体设置、字体大小、字体颜色、背景颜色等)等功能。 要求:基于JFrame窗体设计、...
  • 文本图像畸变矫正

    千次阅读 2020-06-01 14:47:01
    二十世纪六十年代兴起的OCR(Optical Character Recognition,光学字符识别)技术,使得文档能以图像的形式被分析与识别,一定程度上实现了文本识别的自动化。然而,文档图像识别效果的优劣与其质量有着密切的联系,...
  • CSS:文本过长显示省略号

    千次阅读 2018-08-02 20:21:11
    我们在web页面开发中,经常遇到一个区域固定宽度,这时候文字可能会过长,如果折行显示太难看,增加区域宽度,又违背了设计的初衷。这时候可以考虑将过长的文本显示为省略号。通过css属性text-overflow:ellipsis就...
  • c语言结课课程设计,希望有大佬可以指点一下小白 单词词频统计 设计内容: 写程序处理英语文本文件,统计文件中所出现的各单词在文本中出现的频次。 设计功能: 1、 将英文段落以文本文件,并在屏幕上显示。 2...
  • 本文将介绍腾讯 AI Lab 发表于 EMNLP 2018 的两篇论文,论文关注的是文本文本生成研究领域中的文本风格转化及对话生成任务。其中,在文本风格的论文中,作者提...
  • 文章目录ABCNet 导读:使用自适应贝塞尔曲线网络进行进行实时场景文本定位ABCNet:Real-time Scene Text Spotting with Adaptive Bezier-Curve NetworkAbstract 摘要介绍1.1 相关工作2.自适应贝塞尔曲线网络(ABCNet)...
  • 文本的威力

    千次阅读 2010-05-26 14:49:00
    实践证明,持久地存储知识的最佳格式是纯文本(Plain Text),通常不是二进制文件。纯文本的优点1. 保证不过时对于二进制文件,数据的含义被封装在了解析文件的程序中,也就是人为地使数据与其含义分离开来;如果没有...
  • photoshop查看文本大小和颜色

    千次阅读 2017-02-05 14:50:28
    查看图层中文本图层的文本大小和颜色和简单,用左侧栏目的文本工具,选中图层,在ps上方的工具栏会展示文本颜色和大小。如下图:     从顶部工具栏可以看到文本大小为42像素,颜色为红色。  以上是psd的图层...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,239
精华内容 60,095
关键字:

关于展示设计文本