将文本排序为职位描述的算法和工具

数据挖掘 神经网络 nlp 朴素贝叶斯分类器
2022-02-07 15:00:57

我们正在根据与空缺的相似程度对文本进行排名。我们有来自社交网络的自定义搜索提要的 4 年数据集(≈1M 文本)。我们还从该集合中手动选择了空缺职位(≈30K)。

现在,职位空缺分两个阶段进行选择:

  1. 我们通过 API 在社交网络上进行几个特定的​​搜索查询(即“需要翻译”),接收并将搜索提要合并为一个。

  2. 然后我们查看其中的每个帖子以查找真正的职位空缺。通常,它应该包含对口译服务的请求。它通常包含一些工作细节(如地点、薪水、主题、截止日期、语言、联系人)和语言的风格特征(即问候、感叹、要求私下写作、寻求建议等)。

在第 2 点之前,我们希望在最后的审核中首先提供最有可能是空缺的文本。我们将尝试使用朴素贝叶斯分类器或自然语言处理进行排名,但这并不像看起来那么简单:有很多不同的工具、方案、模型。

问题是,在我们的案例中,哪些算法和工具可以提供帮助?我们应该注意什么?

2个回答

如果我正确理解了这个问题,可以采取几种方法。

我们将从最不面向深度学习的解决方案开始,然后慢慢进入深度学习的范围。这种选择主要是出于成本和难度的原因。在某些情况下,您可以通过深度学习解决方案找到的错误数量可能非常难以理解,这会导致原型制作速度变慢,最终导致生产时间变慢。

从根本上讲,您的问题涉及根据工作与特定工作的相关程度对工作进行排名。排名问题的文献非常丰富,我将在我的答案后面加上这些论文或研究的链接。我还要说,与其将其作为排名问题来处理,还可能有另一种解决方法。但是,这取决于您拥有的数据类型。如果您知道每个查询肯定是在寻找特定类型的工作。然后,您可以将其分解为一个多任务问题,其中一项任务是确定是否有空缺,第二个任务是确定空缺是否与搜索查询有任何关系。

解决方案 1:获取数据集并手工制作一组您认为与输出分类过程相关的特征。为了有效地做到这一点,您应该知道某些您认为将输入特征与最终标签相关联的核心特征(这里我使用输入特征来表示您认为可以很好地代表您的特征的特征。例如,一些可能相关的特征是关于发布标题的个人或实体的信息(在第 2 阶段),如果他们是该领域的知名公司(这可以通过一些智能网络抓取和文本检索方法访问)。那么,它可能更有可能是一个帖子,对吧?现在假设你已经构建了这组特征。现在,对于这组特征中的每一个,你都有一个对应的标签来表明是否有空缺。将这种方法转化为排名问题非常简单。您所要做的就是观察置信度(softmax 概率足够好),概率越高的排名越高)。即使使用简单的前馈神经网络,这个解决方案也很容易实现。您还可以从测试 SVM 或随机森林等简单分类器中受益。还必须记住,实际的句子必须嵌入到某个数字空间中,例如 您还可以从测试 SVM 或随机森林等简单分类器中受益。还必须记住,实际的句子必须嵌入到某个数字空间中,例如 您还可以从测试 SVM 或随机森林等简单分类器中受益。还必须记住,实际的句子必须嵌入到某个数字空间中,例如Rn. 该解决方案没有详细说明所有显式步骤,但提供了一个通用框架,您应该能够使用它来解决问题。

缺点上述方法需要花费大量时间来手工制作特征集,并且会进行大量迭代,因为特征集永远不会完美。总会有一些你可能错过的东西。其次,训练一个好的词嵌入并不是一件容易的事。您可能需要花费大量时间来运行它,特别是如果您希望嵌入以某种方式与您的单词相关。

解决方案 2这个解决方案开始触及深度学习的围栏。该解决方案是比较源话语和目标话语中的注意力编码。源话语是“需要看门人”这样的短语。现在你应该在单词序列上训练一个注意力模型,并观察哪些单词被给予了最大的关注。一旦你知道了这一点,问题就变成了以某种有意义的方式巩固注意力并通过一些度量空间比较源和目标之间的距离的问题。所以你当然应该注意基于注意力的模型(哈哈!)。同样,在弄清楚有多少注意力实际影响输出以及它是否是您的数据的好模型的过程中会出现一些问题。L2规范或任何其他地图RnR.

缺点注意距离是一个很好的指标,但是,它们非常以数据为中心。例如,如果广告很长,则模型可能没有选择合适的词来关注。

现在我们获得了一些可能有用的资源,以便准确了解答案的不同组成部分是如何工作的。

  1. https://en.wikipedia.org/wiki/Learning_to_rank
  2. http://www.shivani-agarwal.net/Events/SDM-10-Tutorial/sdm10-tutorial.pdf
  3. https://towardsdatascience.com/learning-to-rank-with-python-scikit-learn-327a5cfd81f
  4. http://times.cs.uiuc.edu/course/598f16/l2r.pdf
  5. https://www.stat.uchicago.edu/~lekheng/meetings/mathofranking/slides/agarwal.pdf

现在关于关注的帖子:

  1. http://www.wildml.com/2016/01/attention-and-memory-in-deep-learning-and-nlp/

  2. http://akosiorek.github.io/ml/2017/10/14/visual-attention.html

  3. https://medium.com/syncedreview/a-brief-overview-of-attention-mechanism-13c578ba9129

最后,我的答案的最后一部分将涉及准确评估您使用指标的表现。我在上面的答案中添加了一些指标,但是还有另一个指标特别表示输入查询和输出查询之间的语法相似性。

  1. https://en.wikipedia.org/wiki/BLEU

我的建议是使用深度学习的序列分类方法,特别是循环神经网络,它在文本处理中被证明是强大的。对于快速原型设计,您应该使用Keras API(带有 Tensorflow 后端)。

简而言之:

  1. 标记您的数据集(2 类:空缺或非空缺)
  2. Embedding使用Keras 层将数据集中的每个单词嵌入到整数向量中
  3. 在数据集中查找“X”个最常用的词,其中“X”取决于数据集的大小
  4. 将数据集限制为仅包含这些单词并删除其余单词
  5. 使用填充或截断序列以具有相同的长度keras.preprocessing.sequence.pad_sequences()
  6. 在标记的数据集上训练LSTM-RNN(只需LSTM在 Keras 中插入一个层),然后对其进行测试

改进的额外提示:使用Dropout层来减少模型的方差,并尝试通过将其与卷积神经网络 (CNN) 相结合来利用数据中的空间关系来改进它。如果您在图层之前插入一个图层,这可以很容易地实现。Conv1DLSTM

我在网上找到的一个很好的参考是这个