Python - 如何使用 ML 为 NLP 产品标题缩短算法的最后阶段分配最佳权重,以挑选最具描述性的部分

数据挖掘 机器学习 Python
2022-03-05 11:42:30

TLDR:如何使用 ML 自动分配可能的最佳权重,以便我的算法知道每个特征的价值多少,以根据训练数据做出决策?

大家好!

我的项目:

我正在使用 Python 创建一个产品标题缩短算法,该算法执行以下操作:

INPUT: 3.5mm Jack Wireless Bluetooth-compatible 5.0 Receiver Adapter Wireless Aux Receiver Adapter For Headphone PC Music MP3

OUTPUT (60 chars max): 3.5mm Wireless Bluetooth 5.0 Adapter for Headphone

除了我正在使用的标题是葡萄牙语。该程序通过一个基于标题语法分割的简单 NLP 算法来实现这一点,这意味着它本质上将标题拆分为名词块,然后在适当的情况下智能地将这些块合并在一起以产生新的块。

在标题被分段后,我通过一个不完整的优先级算法运行它,到目前为止,只考虑分段长度和位置来输出最终缩短的标题,这意味着首先出现的较长的分段优先。可能需要强调的是,对于 75% 的案例,我目前拥有的非 ML 算法已经选择了最佳选择,但它没有使用我在下面描述的许多潜在相关功能中的任何一个,在我看来还有很大的提升空间。

我的问题:

我通过添加更多要考虑的特征来扩展此优先级算法,例如名词/形容词/连接词/已知词/未知词的数量、大型文本语料库(如维基百科)中的词频、所有标题中的词频、词频在产品描述等中。我还提取了每个可能的相邻单词组合以形成数百万个 N-gram,然后只保留那些重复 5 次或更多次的单词,以形成一个包含数千个术语的列表,长度范围为 2-7 个单词理论上,由于它们的重复性,应该在本质上更具描述性。

现在,这些参数太多了,我无法决定每个参数的价值。在我看来,这似乎是 ML 的完美应用!

我对机器学习的体验:

我该怎么做呢?多年前,我按照 Andrew Ng 的著名课程从头开始创建了一个神经网络,但这就是我在 ML 方面的经验。不久前,我还参加了 Kaggle 的短期入门课程。

最后的问题:

  1. 这个特定问题的最佳算法/库是什么?理想情况下,我想要一些非常强大的东西,即使它的设置不是完全微不足道的,我也可以在 Python 中运行。

  2. 多少训练样本就足够了?

  3. 还有其他提示吗?

非常感谢大家!!!

1个回答

一个不错的选择是使用定制的 Bert 库。

因此,您需要一些自定义标记来检测一些关键部分,例如使用 ByteLevelBPETokenizer 之类的标记器的“5.0”。

from tokenizers import ByteLevelBPETokenizer

import os
    
tokenizer = ByteLevelBPETokenizer()

tokenizer.train(your training data)

os.mkdir('./your_tokenizer')

tokenizer.save_model('your_tokenizer')

然后,您可以使用一些序列分类来至少知道句子的类别。

from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch

tokenizer = AutoTokenizer.from_pretrained("your_tokenizer")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased")

现在您可能需要微调您的模型,但您可以尝试不对其进行微调:

classes = ["Headphone", "Keyboard"]

sequence_0 = "USB keyboard"
sequence_1 = "3.5 Headphone white"
sequence_2 = "Portuguese keyboard"

keyboard = tokenizer(sequence_0, sequence_2, return_tensors="pt")
headphone = tokenizer(sequence_0, sequence_1, return_tensors="pt")

keyboard_classification_logits = model(**keyboard).logits
headphone_classification_logits = model(**headphone).logits

keyboard_results = torch.softmax(keyboard_classification_logits, dim=1).tolist()[0]
headphone_results = torch.softmax(headphone_classification_logits, dim=1).tolist()[0]

# Should be keyboard
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(keyboard_results[i] * 100))}%")

# Should be a headphone
for i in range(len(classes)):
    print(f"{classes[i]}: {int(round(headphone_results[i] * 100))}%")

代码的灵感来自这个网站:https ://huggingface.co/transformers/task_summary.html

有了足够的数据,您应该能够使用其他语言训练您的模型。数量取决于可能名称的可变性。

注意:您可以在之后尝试较小的模型,因为单词的结构比经典文学更简单。