免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2973 | 回复: 6
打印 上一主题 下一主题

一个关键词分组的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-18 10:29 |只看该作者 |倒序浏览
现有一组关键词表,如下:

会计一个月工资多少钱
挖掘机一个月工资多少钱
化妆师一个月工资多少钱
美容师工资多少钱
育婴师工资多少钱
化妆师工资多少钱
咖啡师工资多少钱
理财工资分配
会计工资分配
银行工资分配
如何进行工资分配
......

同类关键词的最长后缀是一样的,想根据关键词后缀来进行分组,最终效果如下:

会计一个月工资多少钱 >> 一个月工资多少钱
挖掘机一个月工资多少钱 >> 一个月工资多少钱
化妆师一个月工资多少钱 >> 一个月工资多少钱
美容师工资多少钱 >> 工资多少钱
育婴师工资多少钱 >> 工资多少钱
化妆师工资多少钱 >> 工资多少钱
咖啡师工资多少钱 >> 工资多少钱
理财工资分配 >> 工资分配
会计工资分配 >> 工资分配
银行工资分配 >> 工资分配
如何进行工资分配 >> 工资分配
......


关键词总共有4w个,咋实现...

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
2 [报告]
发表于 2015-08-18 11:21 |只看该作者
本帖最后由 ssfjhh 于 2015-08-18 11:22 编辑
  1. 会计工资分配 >> 工资分配
  2. 银行工资分配 >> 工资分配
复制代码
要是再来个“工商银行工资分配”,该怎么算呢?

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
3 [报告]
发表于 2015-08-18 15:26 |只看该作者
回复 1# GoGo闯


育婴师工资多少钱
化妆师工资多少钱
咖啡师工资多少钱

最长后缀是

师工资多少钱

论坛徽章:
0
4 [报告]
发表于 2015-08-18 18:30 |只看该作者
分词都是要先有词典的
代码相对容易,可以参考开源的ik之类
分词的工具,一般直接用elasticsearch

评分

参与人数 1信誉积分 +5 收起 理由
substr函数 + 5 赞一个! 分词都是要先有词典的

查看全部评分

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2015-08-19 12:34 |只看该作者
如果确定是词后缀的话,也许可以通过逆序数据后建立一个树来进行分类.
比如:
会计一个月工资多少钱 => 钱少多资工月个一计会
然后,
一个字一个节点建立树,每个节点上加一个本节点被访问几次.
钱少多资工月个一计会
钱少多资工月个一机掘挖
这两个数据建立的结构就是:
从"钱"到"一"的访问次数都是2,后面的是1.
然后,在叶子结点上把原始字符串记录上.
这样,把所有数据都加入进这个树之后,就可以设定一个阈值来进行划分了.
比如:可以设定为当一个节点访问5次以上才作为共同结点,这时候,下级的所有叶子可以在这一个结点合并在一起.
然后,当所有节点过滤完成之后,把内容输出就可以了.
因为排出路径的同时,数据也已经是按照对应的词分组了.

评分

参与人数 1信誉积分 +10 收起 理由
ssfjhh + 10 很给力!

查看全部评分

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
6 [报告]
发表于 2015-09-07 15:43 |只看该作者
哈哈,这个问题我一般这样做的,
先造一个词库,然后把这好几万数据都处理一下,如果有的条目没有找到后缀,就把后缀打印出来,手工(活自动)加到词库
然后再跑一次,直到没有例外

人脑加电脑.手动加自动,不全自动也不全手动

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
7 [报告]
发表于 2015-09-07 23:22 |只看该作者
我的解决方案对应的代码如下:
其中,假定所有词保存在"data.txt"文件中,并且,每个词一行。
然后,在main中调用时,以长度3(可以直接把3更换成需要的次数)作为关键词出现的最低标准。
  1. def addWordToTree(word, statistics):
  2.     """
  3.     Add a word element into statistics tree
  4.     """
  5.     sequence = word[::-1]
  6.     start = statistics
  7.     for item in sequence:
  8.         if start.has_key(item):
  9.             start[item][0] += 1
  10.         else:
  11.             start[item] = [1, {}]
  12.         start = start[item][1]

  13. def readData(filename):
  14.     """
  15.     Read data from specified data file
  16.     """
  17.     result = {}
  18.     with open(filename, "r") as handle:
  19.         for line in handle.readlines():
  20.             line = line.strip()
  21.             addWordToTree(line.decode("utf-8"), result)
  22.     return result

  23. def filterData(data, key, status, bar = 4):
  24.     """
  25.     Filter built words tree with expected bar
  26.     """
  27.     for item in data.keys():
  28.         if data[item][0] < bar:
  29.             for subItem in data[item][1]:
  30.                 buildResult(data[item][1][subItem][1], key, status, item + subItem)
  31.         else:
  32.             filterData(data[item][1], key + item, status, bar)
  33.     return status

  34. def buildResult(data, key, status, content):
  35.     """
  36.     Build filtered result, [::-1] is used to ensure key and value in correct direction
  37.     """
  38.     if len(data) == 0:
  39.         if status.has_key(key[::-1]):
  40.             status[key[::-1]].append(content[::-1])
  41.         else:
  42.             status[key[::-1]] = [content[::-1]]
  43.     else:
  44.         for item in data.keys():
  45.             buildResult(data[item][1], key, status, content + item)

  46. def main():
  47.     data = readData("data.txt")
  48.    
  49.     result = {}
  50.     filterData(data, "", result, 3)
  51.     for key, value in result.iteritems():
  52.         print "=" * 80
  53.         print key.encode("utf-8")
  54.         print "-" * 60
  55.         for item in value:
  56.             print item.encode("utf-8")

  57. if __name__=="__main__":
  58.     main()
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP