【其他工具】亲戚关系计算器

转眼间又快到春节了,去年的春节由于疫情原因促生了云拜年,经过众多白衣天使的艰苦奋战,今年春节整体环境好了很多,但疫情防控仍然不能松懈。

春节期间免不了给七大姑八大姨拜年的传统习俗,在中国的亲戚的关系"错综复杂",有时候一些亲戚该怎么称呼可能都不太清楚。这时,机智的程序员创造出了亲戚关系计算器。

目前网上各种版本都已比较成熟,在此就不做过多介绍了,本文主要介绍亲戚计算器实现中的一些语法与其他小细节。并对以下的python版本进行一些细节上的优化。
参考版本:https://zhuanlan.zhihu.com/p/56144138

算法实现思路:
通过将输入的关系拆分为对应的关系链(关系链由最基本的原子称呼组成,表1),进而对关系链进行简化,从而得到最终的关系表示,最后直接查找"关系链-称呼"映射即可得到最终称呼。

具体的实现方式与思想可参考:
https://www.jianshu.com/p/74290f1ae838
https://zhuanlan.zhihu.com/p/56144138

算法定义了如下12中基本的原子称呼。
表1:原子称呼表

符号全称含义符号全称含义
ffather父亲xbx brother兄弟
mmother母亲obolder brother哥哥
hhusband丈夫lblittle brother弟弟
wwife妻子xsx sister姐妹
sson儿子osolder sister姐姐
ddaughter女儿lslittle sister妹妹

同时为了减小性别、年龄带来的影响,还额外定义了一些修饰符。
表2:关系修饰符

符号含义符号含义
1男性0女性
&o年长&l年幼
#隔断[a|b]并列

通过观察"关系链-称呼"(_data变量),不难发现以w开头的关系,其性别sex都是男性(妻子的…),而以h开头的关系,其性别sex都是女性(丈夫的…)。

因此,在我们将关系拆分成所有可能的关系链后,我们可以对subject的性别做一个简单的推断,以此提高最终关系计算的准确率。
亲测有效~

selectors = self.get_selectors(gx.strip())
result = []  # 匹配结果
for s in selectors:  # 遍历所有可能性
    # 根据关系,简单推断当前人的性别
    if sex == -1:
        if re.search(r'[,]h', s):
            sex = 0
        elif re.search(r'[,]w', s):
            sex = 1

另外,还发现关系链简化过程中,正则匹配的顺序会影响最终的关系推断,需要注意。

目前修改后的亲戚关系计算器已集成到个人公众号【NLPer笔记簿】,欢迎关注体验~

输入格式如下,主要包括【找称呼】和【查关系】两大类。
其中,1表示我是男性,0表示我是女性

【找称呼1】老婆的妈妈
我可能称呼对方:岳母
对方可能称呼我:女婿

【找称呼0】老公的妈妈
我可能称呼对方:婆婆
对方可能称呼我:儿媳妇

【找称呼1】老公的妈妈
抱歉!未找到相关称呼~

【查关系1】岳母
我与对方的关系:老婆的妈妈

【查关系0】婆婆
我与对方的关系:老公的妈妈

【查关系1】婆婆
抱歉!未找到相关关系~

【找称呼】的输出结果为我可能称呼对方对方可能称呼我,由于性别及年龄的不确定性,输出可能会存在多个称呼。
【查关系】的输出结果为我与对方的关系,同样输出结果可能存在多种关系。

对于抱歉!未找到相关称呼~抱歉!未找到相关关系~说明无结果输出。
以上面例子中【找称呼1】老公的妈妈来说,男性(1表示我是男性)是没有老公这一说的。同理,【查关系1】婆婆中,男性(1表示我是男性)也是没有婆婆这一说的。因此,无结果输出。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值