Python 方程latex码的余弦相似性

Python 方程latex码的余弦相似性,python,python-2.7,math,trigonometry,cosine-similarity,Python,Python 2.7,Math,Trigonometry,Cosine Similarity,我有一个扩展的问题&比较两个乳胶方程。这是两个二次方程的例子 eqn1 = "*=\frac{-*\pm\sqrt{*^2-4ac}}{2a}" eqn2 = "x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}" 我需要比较它们是否正确,因为我用*来代替x,b。我所做的就是把方程式转换成单词表 eqn1_word = [*,frac,*,pm,sqrt,*,2,4ac,2a] eqn2_word = [x,frac,b,pm, sqrt, b, 2, 4ac, 2a] 所以向

我有一个扩展的问题&比较两个乳胶方程。这是两个二次方程的例子

eqn1 = "*=\frac{-*\pm\sqrt{*^2-4ac}}{2a}"
eqn2 = "x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}"
我需要比较它们是否正确,因为我用*来代替x,b。我所做的就是把方程式转换成单词表

eqn1_word = [*,frac,*,pm,sqrt,*,2,4ac,2a]
eqn2_word = [x,frac,b,pm, sqrt, b, 2, 4ac, 2a]
所以向量是

eqn1_vec= Counter({'*': 3, 'frac': 1, 'sqrt': 1, '2': 1, '2a': 1, '4ac': 1, 'pm': 1})
eqn2_vec = Counter({'b': 2, 'frac': 1, 'sqrt': 1, '2': 1, '2a': 1, '4ac': 1, 'x': 1, 'pm': 1})
现在我的扩展是,我正在检查eqn1_单词中*的百分比,然后用答案给出的正余弦相似性进行检查。最后,我加上两个值,几乎等于1

这在大多数情况下都适用(如果一个变量被*替换)。对于方程n1,这里的*值是3,在方程n2中,b=2,x=1

有关更多说明和更好的理解,请检查此项。 根据那个参考,我的代码是这样的

def get_cosine(self, c_eqn1_eqn, c_eqn2_eqn):
    print 'c_eqn1_eqn = ', c_eqn1_eqn
    print 'c_eqn2_eqn = ', c_eqn2_eqn
    _special_symbol = float(c_eqn1_eqn.count("*"))
    cos_result = 0
    symbol_percentage = 0
    try:
        eqn1_vector = Counter(self.get_word(c_eqn1_eqn))# get word will return word list
        eqn2_vector = Counter(self.get_word(c_eqn2_eqn))
        _words = sum([x for x in eqn1_vector.values()])
        if eqn2_vector.has_key("*"):
            _special_symbol -= eqn2_vector["*"]
        print '_special_symbol = ', _special_symbol
        print '_words @ last = ', _words
        try:
            symbol_percentage = _special_symbol / _words
        except ZeroDivisionError:
            symbol_percentage = 0.0
    except Exception as exp:
        print "Exception at converting equation to vector", exp
        traceback.print_exc()
    else:
        intersection = set(eqn1_vector.keys()) & set(eqn2_vector.keys())
        numerator = sum([eqn1_vector[x] * eqn2_vector[x] for x in intersection])
        _sum1 = sum([eqn1_vector[x]**2 for x in eqn1_vector.keys()])
        _sum2 = sum([eqn2_vector[x]**2 for x in eqn2_vector.keys()])
        denominator = math.sqrt(_sum1) * math.sqrt(_sum2)
        print 'numerator = ', numerator
        print 'denominator = ', denominator
        if not denominator:
            cos_result = 0
        else:
            cos_result = float(numerator) / denominator
        print cos_result
    final_result = float(symbol_percentage) + cos_result
    return final_result if final_result <= 1.0 else 1
def get_cosine(self,c_eqn1_eqn,c_eqn2_eqn):
打印“c_eqn1_eqn=”,c_eqn1_eqn
打印“c_eqn2_eqn=”,c_eqn2_eqn
_特殊符号=浮点(c_eqn1_eqn.计数(“*”))
cos_结果=0
符号_百分比=0
尝试:
eqn1_vector=计数器(self.get_word(c_eqn1_eqn))#get word将返回单词列表
eqn2_向量=计数器(自获取字(c_eqn2_eqn))
_words=sum([x代表eqn1_vector.values()]中的x)
如果等式n2_向量具有_键(“*”):
_特殊_符号-=eqn2_向量[“*”]
打印“\u特殊\u符号=”,\u特殊\u符号
打印“\u words@last=”,\u words
尝试:
符号\百分比=\特殊\符号/\字
除零误差外:
符号_百分比=0.0
例外情况除外:
打印“将等式转换为向量时出现异常”,exp
traceback.print_exc()
其他:
交集=集合(eqn1_vector.keys())和集合(eqn2_vector.keys())
分子=和([eqn1_向量[x]*eqn2_向量[x]表示相交处的x])
_sum1=总和([eqn1_向量[x]**2表示eqn1_向量.keys()中的x)
_sum2=总和([eqn2_向量[x]**2表示eqn2_向量中的x.keys())
分母=数学sqrt(_sum1)*数学sqrt(_sum2)
打印“分子=”,分子
打印“分母=”,分母
如果不是分母:
cos_结果=0
其他:
cos_结果=浮点数(分子)/分母
打印cos_结果
最终结果=浮动(符号百分比)+cos结果

如果final_result我得到了此问题的解决方案,则返回final_result

由于我们可以/不应该增加分子值,我决定改为处理分母。我的逻辑是,如果等式2中*的数量和非相交值的数量相同,则减少分母值。如果没有,就让它过去吧。现在我不必计算“*”的百分比,也不必在余弦结果中加上它

def get_cosine(c_eqn1, c_eqn2):
    _special_symbol = float(c_eqn1.count("*"))
    cos_result = 0
    try:
        eqn1_vector = Counter(get_word(c_eqn1))
        eqn2_vector = Counter(get_word(c_eqn2))
        _special_symbol = 0
        spe_list = list()
        # Storing number of * & the value contains *
        for _val in eqn1_vector.keys():
            if _val.__contains__("*"):
                _special_symbol += eqn1_vector[_val]
                spe_list.append(_val)
        if eqn2_vector.has_key("*"):
            _special_symbol -= eqn2_vector["*"]
    except Exception as exp:
        print "Exception at converting equation to vector", exp
        traceback.print_exc()
    else:
        intersection = set(eqn1_vector.keys()) & set(eqn2_vector.keys())
        numerator = sum([eqn1_vector[x] * eqn2_vector[x]
                         for x in intersection])
        non_intersection_sum = 0
        non_intersection_value = list()
        # storing no of non_matched value
        for _val in eqn2_vector.keys():
            if _val not in intersection:
                non_intersection_sum += eqn2_vector[_val]
                non_intersection_value.append(_val)
        # Join both non intercet lists
        if non_intersection_value:
            non_intersection_value.extend(spe_list)
        # If both non intersect value are not same
        # Empty the list
        if _special_symbol != non_intersection_sum:
            non_intersection_value = list()
        # Cosine similarity formula
        _sum1 = sum([eqn1_vector[x]**2 for x in eqn1_vector.keys() if x not in non_intersection_value])
        _sum2 = sum([eqn2_vector[x]**2 for x in eqn2_vector.keys() if x not in non_intersection_value])
        denominator = math.sqrt(_sum1) * math.sqrt(_sum2)
        if not denominator:
            cos_result = 0
        else:
            cos_result = float(numerator) / denominator
    return cos_result if cos_result <= 1.0 else 1
def get_cosine(c_eqn1,c_eqn2):
_特殊符号=浮点(c_等式1.计数(“*”))
cos_结果=0
尝试:
eqn1_向量=计数器(获取单词(c_eqn1))
eqn2_向量=计数器(获取字(c_eqn2))
_特殊符号=0
spe_list=list()
#存储*的编号&该值包含*
对于eqn1_vector.keys()中的_val:
如果_val.u包含u(“*”):
_特殊符号+=eqn1向量[\u val]
spe_list.append(_val)
如果等式n2_向量具有_键(“*”):
_特殊_符号-=eqn2_向量[“*”]
例外情况除外:
打印“将等式转换为向量时出现异常”,exp
traceback.print_exc()
其他:
交集=集合(eqn1_vector.keys())和集合(eqn2_vector.keys())
分子=和([eqn1_向量[x]*eqn2_向量[x]
对于交叉点中的x])
非交点和=0
非交叉点值=列表()
#存储不匹配值的数量
对于等式n2_vector.keys()中的_val:
如果_val不在交叉口:
非交和=eqn2向量[\u val]
非相交值。追加(_val)
#连接两个非组间列表
如果非交叉点的值:
非交叉点值扩展(spe列表)
#如果两个不相交的值不相同
#清空列表
如果(特殊)符号!=非交叉和:
非交叉点值=列表()
#余弦相似公式
_sum1=总和([eqn1_向量[x]**2表示eqn1_向量中的x.keys(),如果x不在非_交点_值中])
_sum2=总和([eqn2_向量[x]**2表示eqn2_向量中的x.keys(),如果x不在非_交点_值中])
分母=数学sqrt(_sum1)*数学sqrt(_sum2)
如果不是分母:
cos_结果=0
其他:
cos_结果=浮点数(分子)/分母

如果cos_result在我的问题上有任何错误,请返回cos_result。我认为这是一个新的在所有格式。但为什么没有回应…可能是tl;博士现象。那是很多代码…哦。。。。最后一部分只是参考阅读你所有的问题,似乎核心问题是“分子变小”。但我不明白为什么这是一个问题:当两个向量的交集很小,即几乎没有共同点时,你会认为分子很小。或者你的问题是,应该以某种方式考虑
*
的特殊含义,并导致更大的分子?如果是的话,你对这个会计的数学公式是什么?从代码中读取它并不有趣。@MvG感谢您的回复,是的,我需要用其他变量替换“*”。为此,我找到了一个解决办法。请核对我的答案