`

简历打分排序

阅读更多

     部门给我找了点事做,帮筛选简历.估计是觉得我加班少了.为了不浪费时间,写了个简单的简历内容打分排序,以后直接排序转发

     代码如下:

     

package com.lu;

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.codec.binary.Base64;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

public class LuceneUtils {
	/**
	 * 获取分词结果
	 * 
	 * @param 输入的字符串
	 * @param 分词器
	 * @return 分词结果
	 */		
	// getWords("系统提供HTTP服务给其他系统用于实时数据交互,采用WebService与总行进行实时数据交互",
	// analyzer).forEach(System.out::println);
	public static List<String> getWords(String str, Analyzer analyzer) {
		List<String> result = new ArrayList<String>();
		TokenStream stream = null;
		try {
			stream = analyzer.tokenStream("content", new StringReader(str));
			CharTermAttribute attr = stream.addAttribute(CharTermAttribute.class);
			stream.reset();
			while (stream.incrementToken()) {
				result.add(attr.toString());
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result;
	}

	/**
	 * 使用 Map按value进行排序
	 * 
	 * @param map
	 * @return
	 */
	public static Map<String, Integer> sortMapByValue(Map<String, Integer> scoreMap) {
		if (scoreMap == null || scoreMap.isEmpty()) {
			return null;
		}
		Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();

		List<Map.Entry<String, Integer>> entryList = new ArrayList<Map.Entry<String, Integer>>(scoreMap.entrySet());

		entryList.stream().sorted(new Comparator<Map.Entry<String, Integer>>() {
			@Override
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				return Integer.compare(o1.getValue(), o2.getValue());
			}
		}).forEach(new Consumer<Entry<String, Integer>>() {
			@Override
			public void accept(Entry<String, Integer> t) {
				sortedMap.put(t.getKey(), t.getValue());
			}
		});
		return sortedMap;
	}

	public static Optional<String> checkGetContent(String content) {
		String regx = "(^[\\s|\\S]*?)Content-Type:text/html;charset=\"([\\s|\\S]*?)\"[\\s|\\S]*?Content-Transfer-Encoding:base64([\\S|\\s]*?)----boundary_([\\S|\\s]*?$)";
		Pattern compile = Pattern.compile(regx);
		Matcher matcher = compile.matcher(content);
		if (matcher.matches()) {
			if (matcher.groupCount() > 0) {
				String matchCharset = matcher.group(2);
				String matchContent = matcher.group(3);
				return Optional.of(decodeStr(matchContent, matchCharset));
			}
		}
		return Optional.of(content);
	}

	public static String decodeStr(String encodeStr, String charset) {
		byte[] b = encodeStr.getBytes();
		Base64 base64 = new Base64();
		b = base64.decode(b);
		String s;
		try {
			s = new String(b, charset);
			return s;
		} catch (UnsupportedEncodingException e) {
			s = new String(b);
			return s;
		}
	}

	public static Optional<Directory> openFSDirectory(String indexPath) {
		Path path = Paths.get(indexPath);
		try {
			FSDirectory fsDirectory = FSDirectory.open(path);
			return Optional.of(fsDirectory);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return Optional.empty();
	}

}

 

package com.lu;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PhraseQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;

public class ContentScoror {
	String indexPath = "lucene\\Index\\";

	Map<String, Integer> scoreMap = new HashMap<>();
	SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();

	public void eval(IndexSearcher searcher, Query query, Integer weight) throws IOException {
		TopDocs topDocs = searcher.search(query, 1000);
		ScoreDoc[] hits = topDocs.scoreDocs;
		for (int i = 0; i < hits.length; i++) {
			ScoreDoc hit = hits[i];
			Document hitDoc = searcher.doc(hit.doc);
			System.out.println("(" + hit.doc + "-" + hit.score + ")" + " name:" + hitDoc.get("name"));
			String filename = hitDoc.get("name");
			Integer score = scoreMap.get(filename);
			// 结果按照得分来排序。主要由 关键字的个数和权值来决定
			if (null == score) {
				score = 0;
				scoreMap.put(filename, 0);
			}
			scoreMap.put(filename, score + weight);
		}
	}

	public void checkIndexAndScore(Directory directory, Analyzer analyzer) {
		try {
			IndexReader ir = DirectoryReader.open(directory);
			IndexSearcher searcher = new IndexSearcher(ir);
			QueryParser parse = new QueryParser("content", analyzer);
 
			Query query = parse.parse("统招本科");
			eval(searcher, query, 1);

			query = parse.parse("计算机数学信息管理");
			eval(searcher, query, 1);

			query = parse.parse("Java Web App");
			eval(searcher, query, 1);

			query = parse.parse("struts");
			eval(searcher, query, 1);

			query = parse.parse("mybatis");
			eval(searcher, query, 1);

			query = parse.parse("ibatis");
			eval(searcher, query, 1);

			query = parse.parse("hibernate");
			eval(searcher, query, 1);

			query = parse.parse("spring");
			eval(searcher, query, 1);

			query = parse.parse("调优");
			eval(searcher, query, 2);

			query = parse.parse("webservice");
			eval(searcher, query, 1);

			query = parse.parse("axis");
			eval(searcher, query, 2);

			query = parse.parse("xfire");
			eval(searcher, query, 1);

			query = parse.parse("cxf");
			eval(searcher, query, 1);

			query = parse.parse("jax-ws jws");
			eval(searcher, query, 1);

			query = parse.parse("xml json");
			eval(searcher, query, 1);

			query = parse.parse("oracle mysql sqlserver db2");
			eval(searcher, query, 1);

			query = parse.parse("redis memcached");
			eval(searcher, query, 1);

			query = parse.parse("组长管理设计架构分析");
			eval(searcher, query, 1);

			Query pq = new PhraseQuery("content", "培训", "机构");
			eval(searcher, pq, *);
			ir.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	public void doScore() {
		Optional<Directory> dir = LuceneUtils.openFSDirectory(indexPath);
		if (dir.isPresent()) {
			checkIndexAndScore(dir.get(), analyzer);
		}
	}

	public void showResult() {
		LuceneUtils.sortMapByValue(scoreMap).forEach((k, v) -> System.out.println(k + "---->" + v));
	}

	public static void main(String[] args) {
		ContentScoror fie = new ContentScoror();
		fie.doScore();
		fie.showResult();
	}

}

 

 

package com.lu;

import java.io.File;
import java.io.IOException;
import java.util.Optional;
import java.util.stream.Stream;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;

public class FileIndexCreator {
	String indexPath = "lucene\\Index\\";
	String contentFilePath = "content";

	SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();

	public void addDoc(IndexWriter iw, File f) throws IOException {
		String str = FileUtils.readFileToString(f);
		Document doc = new Document();
		doc.add(new StringField("name", f.getName(), Field.Store.YES));
		doc.add(new TextField("content", LuceneUtils.checkGetContent(str).get(), Field.Store.YES));
		iw.addDocument(doc);
	}

	public void content(IndexWriter iw) {
		File file = new File(contentFilePath);
		File[] listFiles = file.listFiles();
		Stream.of(listFiles).forEach(f -> {
			try {
				addDoc(iw, f);
			} catch (IOException e) {
				e.printStackTrace();
			}
		});
	}

	public void createIndex() {
		// create index
		Optional<Directory> dir = LuceneUtils.openFSDirectory(indexPath);
		if (dir.isPresent()) {
			// 也可以存放到内存
			// Directory directory = new RAMDirectory();
			IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
			IndexWriter iw = null;
			try {
				iw = new IndexWriter(dir.get(), iwc);
				content(iw);
				iw.commit();
				iw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		// Analyzer analyzer = new SmartChineseAnalyzer();
		// getWords("系统提供HTTP服务给其他系统用于实时数据交互,采用WebService与总行进行实时数据交互",
		// analyzer).forEach(System.out::println);
		FileIndexCreator fie = new FileIndexCreator();
		fie.createIndex();
	}

}

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>l.l.h</groupId>
	<artifactId>domjj</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<dependencies>
		<!-- <dependency> <groupId>pull-parser</groupId> <artifactId>pull-parser</artifactId> 
			<version>2</version> </dependency> -->
		<dependency>
			<groupId>xml-resolver</groupId>
			<artifactId>xml-resolver</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>pull-parser</groupId>
			<artifactId>pull-parser</artifactId>
			<version>2.1.10</version>
		</dependency>

		<dependency>
			<groupId>org.dom4j</groupId>
			<artifactId>dom4j</artifactId>
			<version>2.0.0-RC1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-core</artifactId>
			<version>5.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-analyzers-common</artifactId>
			<version>5.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-queryparser</artifactId>
			<version>5.3.1</version>
		</dependency>
		<!-- 高亮 -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-highlighter</artifactId>
			<version>5.3.1</version>
		</dependency>
		<!-- 中文分词器 SmartChineseAnalyzer -->
		<dependency>
			<groupId>org.apache.lucene</groupId>
			<artifactId>lucene-analyzers-smartcn</artifactId>
			<version>5.3.1</version>
		</dependency>
		<!-- 文件操作jar包 -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>

		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.9</version>
		</dependency>

	</dependencies>
</project>

 

分享到:
评论

相关推荐

    简历自动筛选工具

    5. **评分与排序**:根据匹配度得分,将所有简历按照从高到低进行排序,使最符合要求的简历排在前面。 6. **可视化展示**:为用户提供清晰的筛选结果展示,如候选人列表、匹配详情和图表等,方便查看和下载。 7. *...

    MSCBSC简历管理应用

    4. **候选人评分与排名**:根据预设的职位要求和权重,对候选人进行智能评分和排序,帮助企业快速锁定优秀人才。 5. **数据分析与报告**:提供详细的统计分析,如各岗位申请人数、热门专业分布、平均工作经验等,为...

    企业简历管理系统.rar

    - 系统可以设定评估标准,对简历进行自动评分,帮助HR快速排序优先级。 - 集成AI算法,通过机器学习分析简历内容,提供初步的候选人能力评估。 5. **面试安排与通知** - 自动发送面试邀请邮件或短信,节省HR时间...

    GPT 和HR招募結合 python 實現,實現給簡歷打分

    随着人工智能技术的发展,结合GPT(Generative Pre-trained Transformer)模型和Python编程语言,我们可以构建一个自动简历分析系统,为应聘者的简历打分,从而提高HR部门的工作效率。本文将探讨如何实现这样一个...

    电信设备-简历信息处理方法及系统.zip

    3. **评分与排名系统**:系统可以依据预设的权重对简历进行评分,如根据候选人的技能匹配度、工作经验年限等。这有助于快速找出高潜力候选人,降低HR的工作负担。 4. **智能推荐系统**:基于大数据和人工智能的推荐...

    基于Python实现简历智能推荐算法【100011022】

    在实际应用中,这个系统可以集成到招聘网站或企业内部的招聘管理系统中,自动化地筛选和排序简历,减轻HR的工作负担,提高招聘效率。 总的来说,"基于Python实现简历智能推荐算法"项目展示了如何利用NLP技术和机器...

    个人简历的中英文对照.doc

    - 在简历中列出这些奖项时,应按重要性和相关性排序,将最能体现你核心竞争力的荣誉放在前面。 - 对于每个奖项,简要描述你的成就和它如何与应聘职位相关。 - 英文简历应确保语法准确,用词恰当,符合国际规范。 ...

    小J帮你改简历冲刺篇Ⅲ

    - **成绩与排名**:最好提供成绩的具体评分标准(如GPA的总分),以及成绩在班级中的排名情况。可以采用百分比的形式表示排名(如Top 10%),也可以直接给出名次(如第3名/200人)。 ### 荣誉与奖励撰写技巧 #### ...

    rezrank:简历审查工具

    2. **评分系统**:根据简历中的各项指标(如工作经验年限、相关技能、教育背景等)为候选人打分,便于快速排序。 3. **自定义设置**:允许用户根据不同的职位需求定制筛选规则和权重,以适应多种招聘场景。 4. **...

    基于神经网络的招聘系统改进.pdf

    本文主要介绍了一种基于神经网络的招聘系统,该系统可以自动将简历根据职位所需进行打分排序,减轻HR工作量同时也减少求职者等待时间。本系统包括信息互传功能、在线笔试面试、简历自动打分等功能,并且可以根据企业...

    mycvseach

    4. **评分系统**:可能有一个评分系统,对每份简历的匹配度进行量化评分,帮助 HR 快速排序简历。 5. **报表生成**:可能提供统计报表,展示简历的整体情况,如技能分布、平均工作经验等。 6. **API 集成**:为了...

    58同城推荐系统设计与实现.pptx

    - 离线算法、实验平台算法和排序打分算法的分离有助于保持系统的灵活性和可维护性。 6. **效果实时监测** - 效果监测系统用于收集推荐结果的反馈,如点击率,进行数据分析并实时展示,以便及时调整推荐策略。 总...

    招聘小程序源码demo

    这一模块的开发涉及试题库的管理、自动评分系统以及与简历的关联,需要良好的逻辑设计和后端技术支持。 面试预约模块是连接企业和求职者的桥梁。求职者可以选择合适的面试时间,企业则能查看并确认预约。这个功能...

    58同城内容推荐系统设计与实现(沈剑).pdf

    CTR的计算会考虑用户的历史行为、地理位置、职位相关性、薪酬范围、工作经验和学历等因素,以不同的权重加权这些因素,形成一个CTR预估打分公式。 综合排序: 最终的推荐结果需要根据CTR预估的结果进行综合排序。...

    Excel模板员工招聘表1.zip

    8. **筛选与排序功能**:通过Excel的筛选和排序功能,HR可以快速找到满足特定条件的候选人,如按学历、工作经验等进行排序,提高工作效率。 9. **版本控制**:在模板中设置版本号,便于团队协作时追踪修改历史,...

    人工智能支持的人才寻猎.pptx

    - **候选人评分与排名**:通过机器学习算法对候选人进行评分和排名,确保招聘决策的公平性和透明性。 - **预测性人才分析**:利用历史数据和情景分析,预测候选人在特定职位上的表现潜力,优化招聘策略。 #### 三、...

    CR300 - CRM Sales.pdf

    在销售机会评估阶段,则可以利用系统中的工具对每个机会进行评分和排序,以便优先处理最有可能成交的机会。 ##### 2. 客户信息管理 - **定义**:客户信息管理是指收集、存储和维护客户数据的过程,这些数据可以用于...

    企业人才招聘管理.pdf

    通常来说,一份好的简历应当控制在2-3张A4纸的长度,且内容应当根据重要程度进行排序。 招聘过程中,面试官通常会基于六个维度进行面试,这些维度通常被称为“通用六个维度”。世界500强企业尤其看重这些维度的能力...

    Excel模板员工招聘表2.zip

    同时,该工作表设计有便于筛选和排序的格式,使得从大量简历中快速识别出潜在合格候选人的过程变得更加高效。 “面试安排”工作表则扮演着协调整个面试流程的角色,它详细记录了每一轮面试的安排,包括面试的日期、...

    工作易系统源码

    在候选人评估方面,源码可能包含评分系统和比较功能,这需要数据库查询优化和排序算法的支持。最后,录用决策环节可能涉及到合同生成和电子签名技术,这部分可能需要集成第三方服务或者自定义开发。 通过分析工作易...

Global site tag (gtag.js) - Google Analytics