我和我的朋友正在做一个关于歌曲推荐的 NLP 项目,我们最初的计划是根据随机输入的语料库(来自文献等)给出一个歌词最相似的推荐歌曲播放列表。 但是我们真的没有具体的想法如何实现它,所以现在我们正在努力寻找与随机歌词相似的歌词作为输入。
所以我们使用句子 BERT 模型(sbert)和余弦相似度来查找歌曲之间的相似度,但输出数字似乎有意义,足以找到最相似的歌词。 有没有其他方法可以改进这种方法?我们想使用 BERT 模型,所以请尽可能提出任何可以在 BERT 之上使用的建议,但是如果有任何其他模型应该用来代替 BERT,我也想知道! 请帮助我们..:'(
计算余弦相似度
您可以使用
util.cos_sim(embeddings1, embeddings2)
包中的 sentence-transformers
来计算两个嵌入的余弦相似度。
或者,您也可以将
scikit-learn
与 sklearn.metrics.pairwise.cosine_similarity(X, Y, dense_output=True)
一起使用
表示和模型的改进
由于您想要在 BERT 之上提供建议,因此您可以考虑 RoBERTa 以及 BERT 的 Wordpeice 分词器上的分词器字节对编码。将 roberta-base 模型视为 HuggingFace
transformers
包中的特征提取器。
from transformers import RobertaTokenizer, RobertaModel
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
model = RobertaModel.from_pretrained('roberta-base')
text = "song lyrics in text."
encoded_input = tokenizer(text, return_tensors='pt')
output = model(**encoded_input)
分词器在语法和语义的各种文本粒度级别上工作。如果针对正确的任务和模型进行微调,每个都可以产生不同且更好的结果。
您可以考虑的其他一些分词器是: 字符级 BPE、字节级 BPE、WordPiece(BERT 使用此)、SentencePiece 和带有 LM 字符的 Unigram 分词器。
还可以考虑探索 HuggingFace 官方 Tokenizer Library 指南这里.