V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
axwz88
V2EX  ›  程序员

有一个学校专业的字符串,怎样识别出哪部分是学校名称和专业名称( Java 实现)

  •  
  •   axwz88 · 2019-09-27 00:32:48 +08:00 · 3973 次点击
    这是一个创建于 1888 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个字符串“北京大学软件工程”,“北京大学”和“软件工程”分别是学校名称和专业名称的变量,
    假如有 2000 个学校和 1000 个专业,怎么识别出哪一部分是学校名称,哪一部分是专业名称呢?
    用 2000 个学校去查询,再用 1000 个专业去查询,那查一次最多要查 3000 次,请问大家有没有好的解决方案。
    28 条回复    2019-09-27 13:06:54 +08:00
    OhYee
        1
    OhYee  
       2019-09-27 00:40:00 +08:00 via Android
    直接用大学或者学院把字符串分开就行吧,应该所有学校都是这俩词结尾吧
    RicardoY
        2
    RicardoY  
       2019-09-27 00:41:09 +08:00 via Android
    绝大部分学校按照大学和学院截断就可以解决问题了吧..截断以后查一下 hashset 确认一下是不是一个合法的解
    Enya
        3
    Enya  
       2019-09-27 00:44:47 +08:00 via iPhone
    先截学院,后截大学。

    因为会有类似北京航空航天大学大学北海学院这种存在。
    lihongming
        4
    lihongming  
       2019-09-27 00:52:27 +08:00 via iPhone
    用 SVM 吧,万一有很多不按规则说话的呢?
    axwz88
        5
    axwz88  
    OP
       2019-09-27 00:57:30 +08:00 via Android   ❤️ 1
    @OhYee
    @RicardoY
    @Enya
    感谢回复,截断的确是个最直接的方法,但很多学校名称不规则,比如"XX 集团 XX 所",还有些大学有注释,比如"中国石油大学(华东)",所以这种办法就行不通了。
    Yourshell
        6
    Yourshell  
       2019-09-27 01:06:40 +08:00 via iPhone
    想匹配不规则字符串的话只有 ml 之类的了
    aguesuka
        7
    aguesuka  
       2019-09-27 01:10:26 +08:00 via Android
    所有大学,塞一个 trietree 里面,先匹配大学,后面的就是专业课。嫌麻烦可以用 treemap
    AX5N
        8
    AX5N  
       2019-09-27 02:52:35 +08:00
    2000 个学校不算多,我觉得直接预先把所有学校拉出来最好。
    wmc
        9
    wmc  
       2019-09-27 03:13:48 +08:00 via Android   ❤️ 1
    想起《数学之美》中 Google 地图关于地址信息的解析,这应该算是一种比较简单的上下文有关文法,Google 的做法是用自动机来进行 街道->地区->城市->州 的各个部分的匹配,感觉思路可能比较接近🤔
    littlecap
        10
    littlecap  
       2019-09-27 05:51:29 +08:00
    先下载一个高校库,然后匹配一下就好了。如果需要我可以发给你。
    mcorley
        11
    mcorley  
       2019-09-27 08:52:21 +08:00
    excel 导出,分列,剩下几十个特殊的手动一下就好了
    nevin47
        12
    nevin47  
       2019-09-27 08:55:56 +08:00 via Android
    我要把这个帖子转给我的同事哈哈哈哈。

    自从我司开始考试,我就天天听到一个论调就是考算法的东西完全没用😂😂😂终于发现一个实际问题了

    这个问题如果不用数据库的话,绝对用 hash 最快啊,逐一阶段,然后去 hash 里面比对,就立刻找到属于哪个学校了
    passerbytiny
        13
    passerbytiny  
       2019-09-27 09:01:43 +08:00
    人是怎么处理的,程序就怎么处理,以下为自动化层次逐步增高的几种方式:
    逐条手工识别和拆分

    按已知规则自动拆分,然后人工逐条审核和纠正

    同上,每次审核后再将新发现的规则融合到拆分规则中(已初步是 AI )

    上一层次执行多次后,将审核、融合新规则也弄成程序自动处理(已是 AI 或者人工智障)
    passerbytiny
        14
    passerbytiny  
       2019-09-27 09:06:32 +08:00
    @nevin47 #11 ⁉ hash 还能部分匹配原文?
    zenan9001
        15
    zenan9001  
       2019-09-27 09:06:42 +08:00
    先考虑通用情况,把"大学"作为截断关键字,再考虑特殊情况,括号什么的比较少,可以特殊处理
    no1xsyzy
        16
    no1xsyzy  
       2019-09-27 09:10:57 +08:00
    @passerbytiny
    做 hashtable,然后拿部分去判断。
    能从 3000 降到 length(输入字符串)^2
    dog82
        17
    dog82  
       2019-09-27 09:11:16 +08:00
    先粗匹配学校,然后人肉修正一遍,专业的名字用正则就行
    RicardoY
        18
    RicardoY  
       2019-09-27 09:11:53 +08:00 via Android
    @aguesuka 用 trie 确实是一个好办法
    no1xsyzy
        19
    no1xsyzy  
       2019-09-27 09:13:19 +08:00
    @passerbytiny BTW,你的世界不完整,推荐用 Red 而不是 Block /t/592670 /t/596604
    LeeSeoung
        20
    LeeSeoung  
       2019-09-27 09:24:28 +08:00
    正则。。
    muxixi
        21
    muxixi  
       2019-09-27 11:35:49 +08:00
    都是 学校+院系的组合

    先排序 按前几个字符分组,然后随便算算相同的前缀,找出学校名,然后院系就出来了。
    LudwigWS
        22
    LudwigWS  
       2019-09-27 11:46:01 +08:00
    V 站各路大神啊
    MaiKuraki
        23
    MaiKuraki  
       2019-09-27 12:17:57 +08:00
    正则表达式?
    wysnylc
        24
    wysnylc  
       2019-09-27 12:21:49 +08:00
    正则筛选+人工纠错
    换什么方式都逃不掉人工纠错
    yianing
        25
    yianing  
       2019-09-27 12:55:41 +08:00 via iPhone
    想到了最长前缀匹配,计算机网络学了这个匹配路由的,可以用来匹配学校吧
    axwz88
        26
    axwz88  
    OP
       2019-09-27 13:03:43 +08:00 via Android
    @aguesuka
    @nevin47
    @wmc
    @no1xsyzy

    感谢,用 ac 自动机可以高效实现,trie 树和 kmp 算法实现 ac 自动机,用 hashtable 对字符串碰撞也可以实现,受教了,没想到自己这么菜
    axwz88
        27
    axwz88  
    OP
       2019-09-27 13:06:38 +08:00 via Android
    每条回复我都认真看了,的确解决问题的方式不止一种,综合大家的回复我考虑用 ac 自动机去实现
    axwz88
        28
    axwz88  
    OP
       2019-09-27 13:06:54 +08:00 via Android
    感谢大家
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:17 · PVG 00:17 · LAX 08:17 · JFK 11:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.