精华内容
下载资源
问答
  • ![图片说明](https://img-ask.csdn.net/upload/201801/19/1516347263_306003.png)如图的数据文档,想要知道有多少个,应该怎么写代码呢?谢谢!
  • NbChar_intxtFile Python代码只计算文本文件中的字母
  • 计算文本相似度

    2017-11-14 22:41:19
    基于关键词Jarccard距离的文本相似度计算 "TF/IDF算法:主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很高的关键度。\n", "\n", "TF-IDF是一种...
  • 下载地址 GitHub源码或者Demo下载 想获得所有字体,如下: //获取到所有的字体名称 NSArray *familyNames = [UIFont familyNames];...对于单行文本来说,直接使用sizeWithAttributes方法,如下: - ...

    下载地址 GitHub源码 或者 Demo下载

    想获得所有字体,如下:

     

    //获取到所有的字体名称
        NSArray *familyNames = [UIFont familyNames];
        NSLog(@"所有字体名称--%@",familyNames);

     

    一、单行文本

    对于单行文本来说,直接使用sizeWithAttributes方法,如下:

     

    - (void)viewDidLoad {
        [super viewDidLoad];
        //获取到所有的字体名称
        NSArray *familyNames = [UIFont familyNames];
        NSLog(@"所有字体名称--%@",familyNames);
        UILabel *lbl_text = [[UILabel alloc]init];
        lbl_text.backgroundColor = [UIColor greenColor];
        lbl_text.text = @"我们是一家人";
        // 设置Label的字体 HelveticaNeue  Courier
        UIFont *fnt = [UIFont fontWithName:@"Courier New" size:24.0f];
        lbl_text.font = fnt;
        // 根据字体得到NSString的尺寸
        CGSize size = [lbl_text.text sizeWithAttributes:[NSDictionary dictionaryWithObjectsAndKeys:fnt,NSFontAttributeName,nil]];
        // 名字的H
        CGFloat nameH = size.height;
        // 名字的W
        CGFloat nameW = size.width;
        lbl_text.frame = CGRectMake(100,100, nameW,nameH);
        [self.view addSubview:lbl_text];
    }

     

    如图:

    二、多行文本

    首先UILabel的numberOfLines设置为0,其次通过- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context方法来计算CGSize,具体代码如下

     

    - (void)viewDidLoad {
        [super viewDidLoad];
        //获取到所有的字体名称
        NSArray *familyNames = [UIFont familyNames];
        NSLog(@"所有字体名称--%@",familyNames);
        [self setMultiLine];
    }
    
    - (void)setMultiLine
    {
        UILabel *lbl_text = [UILabel new];
        lbl_text.font = [UIFont systemFontOfSize:14];
        lbl_text.text = @"文字在语言学中指书面语的视觉形式,古代把独体字叫做“文”,把合体字叫做“字”,如今联合起来叫做“文字”,文字的基本个体叫做“字”。在日常生活中,“文字”还可以指书面语、语言、文章、字等。视觉符号形式,突破口语的时间和空间限制。例如汉字、拉丁字母。";
        lbl_text.backgroundColor = [UIColor greenColor];
        lbl_text.numberOfLines = 0;//多行显示,计算高度
        lbl_text.textColor = [UIColor lightGrayColor];
        CGSize lblSize = [lbl_text.text boundingRectWithSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 20, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;
        lbl_text.frame = CGRectMake(10, 100, lblSize.width, lblSize.height);
        [self.view addSubview:lbl_text];
    }
    

    如图:

     

     

    展开全文
  • 在Swift中我们计算文本的宽度和高度可以使用一下方式://.usesFontLeading 使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算 //.usesLineFragmentOrigin 整个文本将以每行组成的矩形...

    在Swift中我们计算文本的宽度和高度可以使用一下方式:

    //.usesFontLeading 使用字体的行间距来计算文本占用的范围,即每一行的底部到下一行的底部的距离计算 
    //.usesLineFragmentOrigin 整个文本将以每行组成的矩形为单位计算整个文本的尺寸 
    //.usesDeviceMetrics 将文字以图像符号计算文本占用范围,而不是以字符计算。也即是以每一个字体所占用的空间来计算文本范围
    //.truncatesLastVisibleLine 当文本不能适合的放进指定的边界之内,则自动在最后一行添加省略符号。如果NSStringDrawingUsesLineFragmentOrigin没有设置,则该选项不生效 
    
    
        /// 返回文本的高度
        ///
        /// - Parameters:
        ///   - font: 字体
        ///   - width: 宽度
        /// - Returns: 高度
        func textHeight(font:UIFont,width:CGFloat)->CGFloat{
    
            let height =   self.boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options:  NSStringDrawingOptions(rawValue: NSStringDrawingOptions.usesDeviceMetrics.rawValue |   NSStringDrawingOptions.usesFontLeading.rawValue |    NSStringDrawingOptions.usesLineFragmentOrigin.rawValue |
              NSStringDrawingOptions.truncatesLastVisibleLine.rawValue
            ), attributes: [NSFontAttributeName:font], context: nil).size.height;
            return height;
    
        }
    
        /// 返回文本的宽度
        ///
        /// - Parameters:
        ///   - font: 字体
        ///   - height: 高度
        /// - Returns: 宽度
        func textWidth(font:UIFont,height:CGFloat)->CGFloat{
    
            let width =   self.boundingRect(with: CGSize(width: CGFloat(MAXFLOAT), height: height), options: NSStringDrawingOptions(rawValue:  NSStringDrawingOptions.usesFontLeading.rawValue |    NSStringDrawingOptions.usesLineFragmentOrigin.rawValue |
                NSStringDrawingOptions.truncatesLastVisibleLine.rawValue)
                , attributes: [NSFontAttributeName:font], context: nil).size.width;
            return width;
        }

    细心的同学们,肯定会发现在计算文本的宽度的时候,少了一个
    NSStringDrawingOptions.usesDeviceMetrics.rawValue
    在使用的时候,发现在计算高度的时候,没有什么问题。但是在计算文本的宽的时候,就会出现问题。只要在NSStringDrawingOptions有.usesDeviceMetrics 文本的宽度就会出现以下问题,其余的值单独使用或者一起使用,都没有这个问题。
    这里写图片描述

    
            self.view.addSubview(self.getCodeBtn);
            let width = "获取验证码".textWidth(font: FONT(30), height: NEWHEIGHT(30));
    
            self.getCodeBtn.snp.makeConstraints { (make) in
                make.rightMargin.equalTo(-kRightMarin);
                make.height.centerY.equalTo(self.codeTF);
                make.width.equalTo(width);
            }
    展开全文
  • 文本相似度计算

    2015-10-12 10:33:37
    通过文本距离,实现文本相似度的计算。利用的是LevenShiten Distance距离法
  • 使用simhash计算文本相似度

    千次阅读 2020-01-30 17:37:56
    文本相似度计算常用于网页去重以及NLP里文本分析等场景。文本相似度,可以分为两种,一种是字面相似度,另一种是语义相似度。本文记录的是文本的字面相似度的计算及实现,语义相似度计算则需要海量数据去计算语义值...

    1. 使用simhash计算文本相似度
    2. 使用余弦相似度计算文本相似度
    3. 使用编辑距离计算文本相似度
    4. jaccard系数计算文本相似度


    文本相似度计算常用于网页去重以及NLP里文本分析等场景。文本相似度,可以分为两种,一种是字面相似度,另一种是语义相似度。本文记录的是文本的字面相似度的计算及实现,语义相似度计算则需要海量数据去计算语义值,较为复杂。

    最常用的且最简单的两种文本相似检测方法:局部敏感hash、余弦相似度

    1.局部敏感hash(LSH)

    使用一种hash算法,对你于相似的文本得到近似的hash值。LSH的实现方式有多种,常用的就是simhash。

    计算出simhash值后,再计算hash值的汉明距离,即可得到文本的相似性。

    汉明距离:

    定义:两个长度相同的字符串对应位字符不同的个数

    两个关键点:

    • 长度相同
    • 对应位字符不同

    这里的长度相同并不是指输入的字符串长度相同,而是指经过计算后得到的hash字符的长度(一般固定为64位)。

    1.1 使用汉明距离计算文本相似性步骤

    主要的6个步骤为:分词、hash、加权、合并、降维、计算汉明距离,前5个步骤本质上是simhash算法的流程,思路很简单易懂。

    • 分词
      分词工具有很多,例如Ansj、JieBa、HanLP等等,本文使用的 是HanLP。
      为了减小无关词的影响(降噪),可以将标点等过滤掉,并移除停用词,只留下有意义的词语。

    • hash(64位)
      使用MurmurHash3.hash64(byte[] data)来得到词语的hash值。需要注意的是它返回的是Long类型,如果转换为二进制表示后不足64位,需要在补齐64位(高位补0)

    • 加权
      词频是衡量一个词语在句子中的常用方法之一,除此之外还有TF-IDF、词语的情感色彩值等等,本文使用词频作为词语的权重。

    • 合并
      对每个词语计算到的加权后的hash值按位求和

    • 降维
      对求和后的数据进行降维,即对于每一位,大于0的位变为1,小于0的位变为0,得到一个二进制数(或者字符串),即为最终的simhash值。

    • 计算汉明距离
      对以上步骤得到的两个simhash值计算其汉明距离,即统计两个64位的二进制数中对应位不同的个数(异或后1的个数),最终得到汉明距离。一般根据经验值,汉明距离小于等于3的即可认为相似

    汉明距离为一个整数,似乎不能很直观的反应两个文本的相似度(0 ~ 1),所以这里通过实验的方法找了条类似正态分布的函数来将汉明距离转化为一个0~1之间的数来表示相似度,更直观一些,方程如下:

    y = 1 2 π ⋅ 0.16 e ( − ( 0.01 x − 0.01 ) 2 2 ⋅ 0.045 9 2 ) y=\frac{1}{\sqrt{2\pi\cdot0.16}}e^{\left(-\frac{\left(0.01x-0.01\right)^{2}}{2\cdot0.0459^{2}}\right)} y=2π0.16 1e(20.04592(0.01x0.01)2)

    在这里插入图片描述

    1.2 使用汉明距离计算文本相似性举例

    待比较文本:

    	s1:今天天气不错!
    	s2:今天天气真好!
    
    • 分词
      分词时过滤掉标点符号。

        [今天, 天气, 不错]
      
        [今天, 天气, 真好]
      
    • hash(64位)

      “今天天气不错!”分词后hash结果:

      wordhash
      天气1000011110110011101100010101001101011111101101011101001110101010
      今天0001111100111100111101110100100001010001011111001000100100110011
      不错0010000001000111010010010000010101101111000111010101101011010111

      “今天天气真好!”分词后hash结果:

      wordhash
      今天0001111100111100111101110100100001010001011111001000100100110011
      天气1000011110110011101100010101001101011111101101011101001110101010
      真好1111000111100001100011010011001111011110100000000011110011101011
    • 加权

      “今天天气不错!”hash加权结果:

      wordhash
      天气1000011110110011101100010101001101011111101101011101001110101010
      今天0001111100111100111101110100100001010001011111001000100100110011
      不错0010000001000111010010010000010101101111000111010101101011010111

      “今天天气真好!”hash加权结果:

      wordhash
      今天0001111100111100111101110100100001010001011111001000100100110011
      天气1000011110110011101100010101001101011111101101011101001110101010
      真好1111000111100001100011010011001111011110100000000011110011101011

      权重都为1,所以没变化。

    • 合并

      sentencehash
      今天天气不错-1-3-1-1-1111-1-111-11111111-1-1-13-31-3-1-1-1-11-33-111113-1-11313-3111-311-3111-111-1-131
      今天天气真好1-1-11-11131-131-1-1-113-111-11-13-31-11-1-311-13-3311111-111-11-3-11-1-111-1-111-13-11-331
    • 降维

      sentencehash
      今天天气不错0000011100110111111100010100000101011111001111011101101110110011
      今天天气真好1001011110110001101101010101001101011111101101001001100110101011
    • 计算汉明距离

    计算以上两个二禁止字符串中对应位不同的位数:

    0000011100110111111100010100000101011111001111011101101110110011

    1001011110110001101101010101001101011111101101001001100110101011

    共有16处不同,所以汉明距离为16,转化为相似度位0.004799039154476354。可以看出不是很准确。

    1.3 汉明距离计算相似性存在的问题

    通过上边的举例也可以看出,两个相似的句子:

    	s1:今天天气不错!
    	s2:今天天气真好!
    

    得出的汉明距离居然有16,相似度仅仅位0.004。

    造成这种问题的原因是:利用局部hash+汉明距离计算相似度时,只适用于长文本,对短文本的判别效果不是很好。

    现在输入两个较长的文本进行测试:

    以下两个样本摘自一段豆瓣对《爱情公寓5》的影评,其中样本一和二是相似的,样本三和一、二是不相似的。

    样本一(s1):

    太喜欢短评里的一句话了,如果你带着偏见去看,那你永远都不会满意。
    本来影评是没有这段的,但看了一些影评后还是决定再写一下,为什么看了半集或者看了几分钟就来打一星,最可怕的是我看到一个短评说打两星以上都是傻逼,不想多说什么,跟没有教养的人没有讨论的价值。热评里有一篇文章写为什么要喜欢爱情公寓,而不去喜欢其他的喜剧,他列举了很多国内优秀喜剧,并且狠狠的讽刺谩骂了爱情公寓,我告诉你为什么。我出生于00年,一个标准的零零后,那么我从小到大在电视上看过什么喜剧呢?武林外传,爱情公寓,家有儿女,没有了。这就是我们这一代人接触过的喜剧,而我们为什么喜欢爱情公寓,因为我们没有别的喜剧可以喜欢,我同样喜欢武林外传,可爱情公寓的题材与设定更适合我们当时的审美与理解能力,所以爱情公寓才会有了如此多的粉丝,那些无限贬低的人,当时不也是一集集看完的吗
    说到抄袭,没得洗,但如果你想发表你的看法应该去前几季,这部剧目前还没有能证明抄袭的证据。美剧和抄袭剧还是有区别,我接触美剧大概是初中,看行尸走肉,血族,看过几集生活大爆炸,也是抄袭的受害者之一,说实话,那时候的我并不喜欢这部剧,因为他太成人化了,有太多我看不懂的段子以及大量成人笑话,别说什么看爱情公寓的人都青春其实都是美剧,一个电视剧哪来什么青春不青春的,就图一乐呵,看着有意思,这把美剧在电视上放,也不一定有多火,但实际上,大部分人在那时候上接触不到美剧的。

    样本二(s2):

    太喜欢短评里的一句话了,如果你带着偏见去看,那你永远都不会满意。本来影评是没有这段的,但看了一些影评后还是决定再写一下,为什么看了半集或者看了几分钟就来打一星,最可怕的是我看到一个短评说打两星以上都是傻逼,不想多说什么,跟没有教养的人没有讨论的价值。热评里有一篇文章写为什么要喜欢爱情公寓,而不去喜欢其他的喜剧,他列举了很多国内优秀喜剧,并且狠狠的讽刺谩骂了爱情公寓,我告诉你为什么。我出生于00年,一个标准的零零后,那么我从小到大在电视上看过什么喜剧呢?武林外传,爱情公寓,家有儿女,没有了。这就是我们这一代人接触过的喜剧,而我们为什么喜欢爱情公寓,因为我们没有别的喜剧可以喜欢,我同样喜欢武林外传,可爱情公寓的题材与设定更适合我们当时的审美与理解能力,所以爱情公寓才会有了如此多的粉丝,那些无限贬低的人,当时不也是一集集看完的吗?说到抄袭,没得洗,但如果你想发表你的看法应该去前几季,这部剧目前还没有能证明抄袭的证据。美剧和抄袭剧还是有区别,说实话,那时候的我并不喜欢这部剧,因为他太成人化了,有太多我看不懂的段子以及大量成人笑话,别说什么看爱情公寓的人都青春其实都是美剧,一个电视剧哪来什么青春不青春的,就图一乐呵,这把美剧在电视上放,也不一定有多火,但实际上,大部分人在那时候上接触不到美剧的。

    样本三(s3):

    爱5可谓后劲十足,被前几集劝退的观众可能会错过很多,豆瓣逐渐升高的评分也证明了爱5得到真正看下去的观众的认可,不在只是搞笑的喜剧可以让人看到演员的演技,也更能体会导演要表达东西
    虽然感情戏部分要讲的道理并不复杂,无非是一群年轻人长大后面临的生活困境,信任危机,他们不再只是无忧无虑的年轻人,他们要考虑未来,自己的工作,家庭,梦想,越来越多的压力是每个人成熟的必经之路,爱情公寓现实了许多,你更能找到与自身的相同点,也更愿意去思考
    感谢一些网友对我影评的认可,能够在骂声一片的评论区收获赞同是我的荣幸,也有许多持反对意见的朋友提出了质疑与不满,也对我的思考提供了帮助,让我认识到自己观点的不当之处,也试着去理解大家的看法
    爱情公寓系列以及这些事情一直存在争议,也很难有个结果,我不希望大家随波逐流,而是应该有自己的思考与认识,无论你对爱情公寓爱不释手还是嗤之以鼻,都不应该被网络的谩骂左右了观点。写这篇影评就是希望大家能够客观冷静的对待这部剧,虽然争吵避免不了,但还是希望大家能够和平探讨,尽量不要用极端的形容或是偷换概念,也请大家尊重每一位观众,我也会积极与大家沟通交流

    计算结果如下:
    d(s1,s2)=0
    d(s1,s3)=14
    d(s2,s3)=14

    结果还是比较准确的。

    另外尝试了其他文本量较大的样本,识别准确率都不错。因此基于simhash和汉明距离的文本相似性计算适用于文字较多的文本,对短文本的识别是很不准确的。

    另外,由于任何hash函数都不可避免的存在冲突,所以,也会出现完全不相干的两段文本计算的hash值相同,导致汉明距离很小而误判为相似。

    1.4 simhash关键代码

    
    	@Getter
        static class WordTerm extends Term {
            int frequency;
            long hash;
            List<Integer> weightedHash;
    
            public WordTerm(String word, Nature nature) {
                super(word, nature);
            }
    
            @Override
            public String toString() {
                return JSONObject.toJSONString(this);
            }
        }
     private static String simhash(String s) {
            //分词
            List<Term> segment = segment(s);
            Map<String, WordTerm> wordMap = new HashMap<>();
            //计算词频
            for (Term term : segment) {
                WordTerm wordTerm = wordMap.get(term.word);
                if (wordTerm == null) {
                    wordTerm = new WordTerm(term.word, term.nature);
                    //词频
                    wordTerm.frequency = 1;
                    //hash
                    wordTerm.hash = MurmurHash3.hash64(term.word.getBytes());
                    wordMap.put(term.word, wordTerm);
                } else {
                    wordTerm.frequency += 1;
                }
            }
            //加权hash
            for (Map.Entry<String, WordTerm> wordTermEntry : wordMap.entrySet()) {
                WordTerm wordTerm = wordTermEntry.getValue();
                int frequency = wordTerm.frequency;
                long hash = wordTerm.hash;
                String hashBinaryString = Long.toBinaryString(hash);
                String[] hashArray = hashBinaryString.split("");
                List<Integer> collect = Lists.newArrayList(hashArray).stream().map(x -> {
                    if ("0".equals(x)) {
                        return -frequency;
                    } else return frequency;
                }).collect(Collectors.toList());
                int len = 64 - collect.size();
                for (int i = 0; i < len; i++) {
                    collect.add(i, -frequency);
                }
                wordTerm.weightedHash = collect;
            }
            //生成64位simhash
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 64; i++) {
                //合并
                int sum = 0;
                for (Map.Entry<String, WordTerm> wordTermEntry : wordMap.entrySet()) {
                    WordTerm wordTerm = wordTermEntry.getValue();
                    sum += wordTerm.weightedHash.get(i);
                }
                //降维
                if (sum > 0) {
                    sb.append(1);
                } else {
                    sb.append(0);
                }
            }
            return sb.toString();
        }
    

    All efforts, only for myself, no longer for others
    展开全文
  • 使用编辑距离计算文本相似度

    千次阅读 2020-02-05 19:56:16
    1. 使用simhash计算文本相似度 2. 使用余弦相似度计算文本相似度 3. 使用编辑距离计算文本相似度 3. 最小编辑距离计算文本相似度 3.1 编辑距离 概念: 通俗来讲,编辑距离Edit Distance(ED),是指将一个字符串...

    1. 使用simhash计算文本相似度
    2. 使用余弦相似度计算文本相似度
    3. 使用编辑距离计算文本相似度
    4. jaccard系数计算文本相似度


    3. 最小编辑距离计算文本相似度

    3.1 编辑距离

    概念:

    通俗来讲,编辑距离Edit Distance(ED),是指将一个字符串转化为另一个字符串所需的最少操作数。操作包含以下几种:

    • 增:增加一个字符
    • 删:删除一个字符
    • 改:修改一个字符

    举例:

    将“abc”转化为“acb”。

    通过2次替换操作(即修改)将abc转化为了acb(使用删除再增加操作也可以),所以其最小编辑距离为2。

    理论求解:

    本质是一个递归问题,即对于两个长度为 L 1 L_1 L1 L 2 L_2 L2的文本,要计算整个文本的最小编辑距离,就要算出 L 1 − 1 L_1-1 L11 L 2 L_2 L2的编辑距离,然后再加1(针对增加操作的情况,添加最后一个字符),或者算出 L 1 L_1 L1 L 2 − 1 L_2-1 L21的编辑距离,然后再加1(针对删除操作的情况,删除最后一个字符),或者算出 L 1 − 1 L_1-1 L11 L 2 − 1 L_2-1 L21的编辑距离,然后再加1(针对修改操作的情况,修改一个字符),然后取这三个的最小值作为上一步的最小编辑距离,以此类推到第一个字符。

    简化下以上文字:

    假设有两个字符串 A A A, B B B,其长度分别为 L A L_A LA L B L_B LB,那么对于3种操作的编辑距离为:

    • 增加操作:
      d 1 = E D ( A i − 1 , B j ) + 1 d_1=ED(A_{i-1},B_j)+1 d1=ED(Ai1,Bj)+1

    • 删除操作:
      d 2 = E D ( A i , B j − 1 ) + 1 d_2=ED(A_i,B_{j-1})+1 d2=ED(Ai,Bj1)+1

    • 修改操作:
      d 3 = { E D ( A i − 1 , B j − 1 ) ( A i = B j ) E D ( A i − 1 , B j − 1 ) + 1 ( A i ≠ B j ) d_3=\left\{ \begin{aligned} &ED(A_i-1,B_j-1)&(A_i=B_j) \\ &ED(A_i-1,B_j-1)+1&(A_i≠B_j) \end{aligned} \right. d3={ED(Ai1,Bj1)ED(Ai1,Bj1)+1(Ai=Bj)(Ai=Bj)
      取这3个中的最小的一个即为最小编辑距离。

    所以可以得到一个状态转移方程:
    E D A i B j = { m a x ( L A , L B ) ( L A = 0 ∣ ∣ L B = 0 ) m i n { E D ( A i − 1 , B j ) + 1 E D ( A i , B j − 1 ) + 1 E D ( A i − 1 , B j − 1 ) ( A i = B j ) E D ( A i − 1 , B j − 1 ) + 1 ( A i ≠ B j ) ED_{A_iB_j}=\left\{ \begin{aligned} &max(L_A,L_B) &(L_A=0 ||L_B=0)\\ &min\left\{ \begin{aligned} &ED(A_{i-1},B_j)+1 \\ &ED(A_i,B_{j-1})+1 \\ &\begin{aligned} &ED(A_i-1,B_j-1)&(A_i=B_j) \\ &ED(A_i-1,B_j-1)+1&(A_i≠B_j) \end{aligned} \end{aligned} \right. \end{aligned} \right. EDAiBj=max(LA,LB)minED(Ai1,Bj)+1ED(Ai,Bj1)+1ED(Ai1,Bj1)ED(Ai1,Bj1)+1(Ai=Bj)(Ai=Bj)(LA=0LB=0)

    3.2 计算编辑距离(递归)

    public static void main(String[] args) {
            String s1 = "abc";
            String s2 = "acb";
            System.out.println(dis(s1, s2, s1.length(), s2.length()));
            //2
        }
    
        static int d = 0;
    
        private static int dis(String s1, String s2, int i, int j) {
            if (i == 0 || j == 0) {
                return Math.max(i, j);
            }
            int op1 = dis(s1, s2, i - 1, j) + 1;
            int op2 = dis(s1, s2, i, j - 1) + 1;
            int op3 = dis(s1, s2, i - 1, j - 1);
            if (s1.charAt(i - 1) != s2.charAt(j - 1)) {
                op3 += 1;
            }
            return Math.min(Math.min(op1, op2), op3);
        }
    
    

    3.3 计算编辑距离(动态规划)

    public static void main(String[] args) {
            String s1 = "abc";
            String s2 = "acb";
            System.out.println(dis(s1, s2));
            //2
        }
    
        private static int dis(String s1, String s2) {
            int[][] temp = new int[s1.length()][s2.length()];
            for (int i = 0; i < s1.toCharArray().length; i++) {
                temp[i][0] = i;
            }
            for (int j = 0; j < s2.toCharArray().length; j++) {
                temp[0][j] = j;
            }
            for (int i = 1; i < s1.toCharArray().length; i++) {
                for (int j = 1; j < s2.toCharArray().length; j++) {
                    if (s1.charAt(i) == s2.charAt(j)) {
                        temp[i][j] = temp[i - 1][j - 1];
                    } else {
                        int op1 = temp[i - 1][j] + 1;
                        int op2 = temp[i - 1][j - 1] + 1;
                        int op3 = temp[i][j - 1] + 1;
                        temp[i][j] = Math.min(Math.min(op1, op2), op3);
                    }
                }
            }
            System.out.println(Arrays.deepToString(temp));
            return temp[s1.length() - 1][s2.length() - 1];
        }
    

    3.4 最小编辑距离计算相似度

    计算公式:
    s i m i l a r i t y = 1 − E D A B m a x ( L A , L B ) similarity = 1-\frac{ED_{AB}}{max(L_A,L_B)} similarity=1max(LA,LB)EDAB

    举例:

    A:今天天气真好,适合去逛街,也适合晒太阳。;
    B:今天天气不错,适合去玩,也适合去晒太阳。;
    

    最小编辑距离: E D A B = 5 ED_{AB}=5 EDAB=5

    相似度: s i m i l a r i t y = 1 − E D A B m a x ( L A , L B ) = 1 − 5 20 = 0.75 similarity = 1-\frac{ED_{AB}}{max(L_A,L_B)}=1-\frac{5}{20}=0.75 similarity=1max(LA,LB)EDAB=1205=0.75

    3.5 总结

    最小编辑距离很直接的从字面上反映了两个文本间的差异程度,即两个文本越相似,其编辑距离就越小。但是由这种普通的编辑距离来计算相似度还是有些缺陷,比如:

    • 耗时长
      对于短文本来说,速度还是比较快的,但是对于长文本,其速度就不是很理想了。其次,基于动态规划计算时使用的矩阵也会增加不少空间复杂度。以下是对1000字符内,以10为增量,在没有优化的情况下得到的最小编辑距离计算相似度的耗时:
      在这里插入图片描述
    • 计算不准确
      由于只是从文本字面本身来计算的,没有更多的特征来进行进一步判断,所以其结果不是很准确。个人认为可改进的方法有:计算分词后的词语的编辑距离,而不是一个字符的;在计算过程中加入权重等参数进行距离调整;基于同义词词库进行距离调整等等。这个后面陆续再总结。

    So many ways to calculate the distance, but how to calculate the missing distance?
    展开全文
  • IOS开发计算文本尺寸

    2014-06-02 22:47:28
    在IOS开发中例如微博,QQ聊天界面中要显示大量的...下面是IOS 7.0计算文本尺寸的方法。 - (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attrib
  • Java文本处理10-计算文本平均句长

    千次阅读 2019-02-20 13:23:19
    本节任务是计算文本平均句长,可以再上一节任务《Java文本处理9-计算文本句子数》的基础上来进行,并且还需要使用到《Java文本处理3-统计文本行数、字符数、汉字、数字、字母数等》里面关于计算文本总字数的相关方法...
  • 在excel里有些文本和数字混合在一起,但又想对其中的数字进行求和计算,这时应该怎么办呢? 这个混合文本数字求和.bas就起作用了。
  • CAD LISP 含文本数字求和,纯数字、含文本的数字等均可计算
  • 动态添加多个文本到父容器内,根据宽度自动换行,
  • excel中怎样计算文本单元格的数量

    千次阅读 2018-07-15 09:41:40
    需要显示数量的单元格"=COUNTIF("查找单元格的范围","&lt;&gt;")
  • 主要给大家介绍了关于利用Swift如何计算文本的size的相关资料,文中通过示例代码介绍的非常详细,对各位iOS开发者们的工作或者学习具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • jQuery文本值转数字的计算

    千次阅读 2017-09-21 22:31:07
    //测试价格少于36,自动+6 $("#price").blur(function(){ alert("price") var p1=document.getElementById("price").value; if (p1) { $("#price").val(p1*1+6);//p1*1将p1原来的String类型转为int ...
  • 自然语言处理学习中的一个小例子。具体请见 http://www.cnblogs.com/finallyliuyu/archive/2010/03/12/1684015.html
  • 词向量余弦算法计算文本相似度

    千次阅读 2019-07-28 16:39:58
    计算文本相似度有多种方式,这里简单介绍一下其中的一种:词向量余弦。 词向量余弦 词向量余弦算法,是将文本作为一个多维空间的向量,计算两个文本的相识度即计算判断两个向量在这个多维空间中的方向是否是一样的。...
  • python计算txt文本多少单词

    千次阅读 2017-11-25 13:36:24
    值得注意的是,如果文本中放的是数字,而不是字母(单词),则不需要用split()来分割,否则会出错,这是因为分割split()将一串数字看成一个字符引起的。如上面的pi_digits.txt的文本如下: 3.1415926535 ...
  • 这是一个功能强大的NLP工具,可提供各种api,包括文本预处理,表示,相似度计算文本搜索和分类。 此外,它还支持英语和中文。 强调 在文本预处理中支持英语和中文 提供各种文本表示算法,包括BOW,TF-IDF,LDA,...
  • simhash文本相似度计算

    千次阅读 2016-08-03 21:07:59
    常见文本相似度计算方法:1 向量空间模型VSM(Vector Space Model)。使用VSM计算相似度,先对文本进行分词,然后建立文本向量,把相似度的计算转换成某种特征向量距离的计算,比如余弦角、欧式距离、Jaccard相似...
  • 利用余弦相似度计算文本相似度

    万次阅读 2017-10-28 11:14:38
    利用余弦相似度计算文本相似度
  • 计算文本信息熵

    千次阅读 2018-06-16 15:44:01
    //读取文件,统计同类出现次数,以(k,v)存储,k为,v为该的数量 Map, Long> map = Files.lines(Paths.get(path), Charset.defaultCharset()) .flatMap(line -> Arrays.stream(line.split("\n"))) .flatMap...
  • 当然总高度的计算必须是文字所在的 DOM 没有对高度的限制,随着文本的增加 DOM 要随之变高才行;最后还要考虑 DOM 的样式padding和margin对高度的影响。这样一来我们就可以计算文本的行数了。总结一下我们需要如下...
  • 计算文本相似度计算方法之一

    千次阅读 2017-08-08 14:04:46
    1)余弦相似度:通过对两个文本分词,TF-IDF算法向量化,对比两者的余弦夹角,夹角越小相似度越高,但由于有可能一个文章的特征向量词特别多导致整个向量维度很高,使得计算的代价太大不适合大数据量的计算。...
  • simhash计算文本相似度

    千次阅读 2016-09-08 22:31:33
    通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相似度、...
  • public class FrequencyCalculator { public static void main... //定义需要计算字母出现频率的文本 String text="some off#acebooksea3rl255 yinvestorssoldofftheirstockatthefirstchancetheygotbutceomarkz
  • 利用YYLabel准确计算文本的高度,可用于带表情的评论

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 483,796
精华内容 193,518
关键字:

怎样计算文本多少字