• 请不要在回答技术问题时复制粘贴 AI 生成的内容
axwz88
V2EX  ›  程序员

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

  •  
  •   axwz88 · Sep 27, 2019 · 5346 views
    This topic created in 2600 days ago, the information mentioned may be changed or developed.
    比如一个字符串“北京大学软件工程”,“北京大学”和“软件工程”分别是学校名称和专业名称的变量,
    假如有 2000 个学校和 1000 个专业,怎么识别出哪一部分是学校名称,哪一部分是专业名称呢?
    用 2000 个学校去查询,再用 1000 个专业去查询,那查一次最多要查 3000 次,请问大家有没有好的解决方案。
    28 replies  •  2019-09-27 13:06:54 +08:00
    OhYee
    OhYee
    Sep 27, 2019 via Android
    1
    直接用大学或者学院把字符串分开就行吧,应该所有学校都是这俩词结尾吧
    RicardoY
    RicardoY
    Sep 27, 2019 via Android
    2
    绝大部分学校按照大学和学院截断就可以解决问题了吧..截断以后查一下 hashset 确认一下是不是一个合法的解
    Enya
    Enya
    Sep 27, 2019 via iPhone
    3
    先截学院,后截大学。

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

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

    这个问题如果不用数据库的话,绝对用 hash 最快啊,逐一阶段,然后去 hash 里面比对,就立刻找到属于哪个学校了
    passerbytiny
    passerbytiny
    Sep 27, 2019
    13
    人是怎么处理的,程序就怎么处理,以下为自动化层次逐步增高的几种方式:
    逐条手工识别和拆分
    ↓
    按已知规则自动拆分,然后人工逐条审核和纠正
    ↓
    同上,每次审核后再将新发现的规则融合到拆分规则中(已初步是 AI )
    ↓
    上一层次执行多次后,将审核、融合新规则也弄成程序自动处理(已是 AI 或者人工智障)
    passerbytiny
    passerbytiny
    Sep 27, 2019
    14
    @nevin47 #11 ⁉ hash 还能部分匹配原文?
    zenan9001
    zenan9001
    Sep 27, 2019
    15
    先考虑通用情况,把"大学"作为截断关键字,再考虑特殊情况,括号什么的比较少,可以特殊处理
    no1xsyzy
    no1xsyzy
    Sep 27, 2019
    16
    @passerbytiny
    做 hashtable,然后拿部分去判断。
    能从 3000 降到 length(输入字符串)^2
    dog82
    dog82
    Sep 27, 2019
    17
    先粗匹配学校,然后人肉修正一遍,专业的名字用正则就行
    RicardoY
    RicardoY
    Sep 27, 2019 via Android
    18
    @aguesuka 用 trie 确实是一个好办法
    no1xsyzy
    no1xsyzy
    Sep 27, 2019
    19
    @passerbytiny BTW,你的世界不完整,推荐用 Red 而不是 Block /t/592670 /t/596604
    LeeSeoung
    LeeSeoung
    Sep 27, 2019
    20
    正则。。
    muxixi
    muxixi
    Sep 27, 2019
    21
    都是 学校+院系的组合

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

    感谢,用 ac 自动机可以高效实现,trie 树和 kmp 算法实现 ac 自动机,用 hashtable 对字符串碰撞也可以实现,受教了,没想到自己这么菜
    axwz88
    axwz88
    OP
    Sep 27, 2019 via Android
    27
    每条回复我都认真看了,的确解决问题的方式不止一种,综合大家的回复我考虑用 ac 自动机去实现
    axwz88
    axwz88
    OP
    Sep 27, 2019 via Android
    28
    感谢大家
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   515 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 20:03 · PVG 04:03 · LAX 12:03 · JFK 15:03
    ♥ Do have faith in what you're doing.