# autoClassifyLines **Repository Path**: bighippo78/autoClassifyLines ## Basic Information - **Project Name**: autoClassifyLines - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-04 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 线路拼团自动分类 -- 目前在一家旅行社工作,每季度甚至每个月,公司都会有做一些新线路上架销售;某些线路是可以互相拼团的。 比如说现在有一新系列叫梦游海南,下分梦游海南经济版、梦游海南豪华版,仅仅只是住宿酒店不同。 再后来,这条梦游海南线路又多了一条可拼团的衍生线路,叫梦遗海南,区别仅仅是第三晚改住南山景区里的酒店,所以我们又多了梦遗海南经济版、梦遗海南豪华版; 再往后来,为了配合线上半自助产品的需求,我们又做了一条半自助,前两天和行程梦游海南一样,最后两天行程是自由活动的,暂且管它叫梦飞海南2+2吧; 再后来,为了促进游艇出海和千古情景区的销售,我们又做了梦飞海南加强版,也就是在2+2半自助的基础上第三天可以选择游艇出海或者千古情景区。 目前为止我们已经有了梦游海南、梦遗海南、梦飞海南2+2,梦飞海南2+2加强版;每个版本按出游天数又有分5天4晚、6天5晚、按进出港的不同又有分海口进出、三亚进出、海进三出,按住宿标准的不同又有分经济版、豪华版。所以我们手上已经有了4 * 3 * 3 * 2 = 72条线路,而这72条线路其实是同一个系列的,实际操作过程中可以互相拼团。 结果到了下个季度,梦游海南产品又做了行程变化,为了区分行程变化以后收进来的订单,新订单录入时选择的线路名称叫梦游海南(8月),然后衍生的线路也一一改了名字。 当我们需要对这一整个系列做统计分析的时候,发现从数据库里导出来的是海量的线路名称。只有找到最初设计线路的人,才回忆得起来哪些线路其实是同一系列的。 再然后,设计线路的人离职/忘记了…… 所以,我们现在手上只有像这样的一个表: | 销售单号 | 线路名称 | 团号 | | ------ | ------| ------| |150001|海口梦游海南经济版5天4晚| 20150113A| |150002|海口梦游海南豪华版6天5晚| 20150113A| |150003|三亚梦遗海南豪华版4天3晚| 20150114C| |150004|三亚梦飞海南2+2半自助5天4晚| 20150114C| |150005|海口梦飞海南2+2千古情版5天4晚|20150115B| |150006|三亚梦飞海南2+2半自助5天4晚|20150115B| |150007|奥特兰克山谷豪华团5天4晚|20150118F| |150008|哨塔高地5人精致小团6天5晚|20150118F| |150009|冰雪墓地清明季怀古之旅4天3晚|20150118F| |150010|海口梦游海南豪华版6天5晚|20150119C| |150011|海口梦飞海南2+2千古情版5天4晚|20150119C| ...... 整个表大概十几万行的样子。 我们只清楚一个规则,就是曾经拼到同一个团里的线路,也就是团号相同的线路,它们是同一系列的。 现在要利用这十几万拼团记录,来给几百个不同的线路归类。 实际用的数据只有两列,就是线路名称[lineName],还有团号[saleLineGroupID],销售单号直接用删掉了。 我这里的处理步骤是:先给整个表增加一列[style],一开始都设为0。表就变成了下面这样: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|0| |1|海口梦游海南豪华版6天5晚| 20150113A|0| |2|三亚梦遗海南豪华版4天3晚| 20150114C|0| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|0| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|0| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|0| |6|奥特兰克山谷豪华团5天4晚|20150118F|0| |7|哨塔高地5人精致小团6天5晚|20150118F|0| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|0| |9|海口梦游海南豪华版6天5晚|20150119C|0| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|0| 然后从第一行开始遍历,当某行的[style]值为0时,将它变成[index] + 1, 同时将整个表中有相同[lineName]的行里的[style]值也改成相同的值。遍历完以后表如下: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|2| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|4| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|5| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|6| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|8| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|9| |9|海口梦游海南豪华版6天5晚|20150119C|2| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|5| 这里我们就得到了初始化的数据。 接下来先遍历所有的[saleLineGroupID],将所有同团的行里的[style]值,都改成最小的那个值。遍历完以后表如下: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|1| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|3| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|5| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|5| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|7| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|7| |9|海口梦游海南豪华版6天5晚|20150119C|2| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|2| 然后再遍历所有的[lineName],将所有相同线路名称的行里的[style]值,都改成最小的那个值。遍历完以后表如下: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|1| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|3| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|2| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|5| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|7| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|7| |9|海口梦游海南豪华版6天5晚|20150119C|1| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|2| 到这里为止就完成了一个循环,我们可以看到[style]的值从一开始的9个,变成了5个。 接下来继续,先遍历所有的[saleLineGroupID],将所有同团的行里的[style]值,都改成最小的那个值; 再遍历所有的[lineName],将所有相同线路名称的行里的[style]值,都改成最小的那个值。遍历完以后表如下: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|1| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|3| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|1| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|2| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|7| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|7| |9|海口梦游海南豪华版6天5晚|20150119C|1| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|1| [style]的值又被消去了一个,变成了4个。如果再来一次循环,结果如下: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|1| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|3| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|1| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|1| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|7| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|7| |9|海口梦游海南豪华版6天5晚|20150119C|1| |10|海口梦飞海南2+2千古情版5天4晚|20150119C|1| [style]值又被消去了一个,变成了3个。如果再继续循环,已经无法再消去[style]的值,所以循环结束。 现在我们去掉所有重复的[lineName],就得到了我们需要的分类结果: | index | lineName | saleLineGroupID |style| | ------ | ------| ------|------| |0|海口梦游海南经济版5天4晚| 20150113A|1| |1|海口梦游海南豪华版6天5晚| 20150113A|1| |2|三亚梦遗海南豪华版4天3晚| 20150114C|3| |3|三亚梦飞海南2+2半自助5天4晚| 20150114C|3| |4|海口梦飞海南2+2千古情版5天4晚|20150115B|1| |5|三亚梦飞海南2+2半自助4天3晚|20150115B|1| |6|奥特兰克山谷豪华团5天4晚|20150118F|7| |7|哨塔高地5人精致小团6天5晚|20150118F|7| |8|冰雪墓地清明季怀古之旅4天3晚|20150118F|7| 所以我的算法大致如上。 如果大家有更好的算法,还请赐教。