Word2Vec将音乐变成向量

本文探讨了如何利用Word2vec技术将音乐转化为语义向量,以此来捕获音乐的调性和和弦信息。通过在音乐数据集上训练skip-gram模型,结果显示,音乐切片的语义被有效捕获,和弦间的音调关系以及调的信息在嵌入空间中得以体现,证明了音乐和语言在向量化表示上的相似性,为音乐生成和其他应用奠定了基础。

机器学习算法在视觉领域和自然语言处理领域已经带来了很大的改变。但是音乐呢?近几年,音乐信息检索领域一直在飞速发展。这篇文章写的是NLP的一些技术是如何移植到音乐领域的。探寻了一种使用流行的 NLP 技术 word2vec 来表示复调音乐的方法。让我们来探究一下这是如何做到的……

Word2vec

词嵌入模型使我们能够通过有意义的方式表示词汇,这样机器学习模型就可以更容易地处理它们。这些词嵌入模型让我们可以用包含语义的向量来表示词汇。Word2vec 是一个流行的词向量嵌入模型,由 Mikolov 等人于 2013 年开发,它能够以一种十分有效的方式创建语义向量空间。

Word2vec 的本质是一个简单的单层神经网络,它有两种构造方式:1)使用连续词袋模型(CBOW);或 2)使用 skip-gram 结构。这两种结构都非常高效,并且可以相对快速地进行训练。在本研究中,我们使用的是 skip-gram 模型,因为 Mikolov 等人在 2013 年的工作中提到,这个方法对于较小的数据集更加高效。Skip-gram 结构使用当前词 w_t 作为输入(输入层),并尝试预测在窗口范围内与之前后相邻的词(输出层):

由于一些在网上流传的图片,人们对于 skip-gram 结构的样子存在一些疑惑。网络的输出层并不包含多个单词,而是由上下文窗口中的一个单词组成的。那么它如何才能表示整个上下文窗口呢?当训练网络时,我们实际会使用抽样对,它由输入单词和一个上下文窗口中的随机单词组成。

这种类型的网络的传统训练目标包含一个用 softmax 函数来计算 𝑝(𝑤_{𝑡+𝑖}|𝑤_𝑡) 的过程,而它的梯度计算代价是十分大的。幸运的是,诸如噪音对比估计(Gutmann 和 Hyvärine 于 2012 发表论文)和负采样(Mikolov 等人于 2013 年发表论文)等技术为此提供

### 如何将Word2Vec生成的词向量转换为句向量 为了将Word2Vec生成的词向量转化为句向量,可以采用多种策略。以下是几种常见的方法及其实现方式: #### 平均池化法 最简单的方式是对句子中所有单词的词向量取平均值作为该句子的句向量。这种方法假设每个单词对整个句子的意义贡献相同。 ```python import numpy as np from gensim.models import Word2Vec def sentence_to_vector(sentence, model, num_features): words = sentence.split() feature_vec = np.zeros((num_features,), dtype="float32") # 初始化一个向量 n_words = 0 for word in words: if word in model.wv.key_to_index: # 如果这个词存在于模型词汇表中 n_words += 1 feature_vec = np.add(feature_vec, model.wv[word]) # 将词向量累加起来 if n_words > 0: feature_vec = np.divide(feature_vec, n_words) # 取平均值 return feature_vec # 假设已经有一个训练好的Word2Vec模型model sentences = ["这是一个测试句子", "另一个例子"] sentence_vectors = [sentence_to_vector(sent, model=model, num_features=100) for sent in sentences] print(sentence_vectors) ``` 此代码片段展示了如何利用`gensim`库加载预训练的Word2Vec模型并计算给定句子的平均向量[^2]。 #### 加权平均法 相比简单的平均池化,可以通过引入权重机制使某些重要词语具有更大的影响。TF-IDF是一个常用的权重方案。 ```python from sklearn.feature_extraction.text import TfidfVectorizer tfidf_model = TfidfVectorizer().fit(corpus) def tfidf_weighted_sentence_to_vector(sentence, model, tfidf_model, num_features): weights = tfidf_model.transform([sentence]).toarray()[0] words = sentence.split() feature_vec = np.zeros((num_features,), dtype="float32") for i, word in enumerate(words): if word in model.wv.key_to_index and word in tfidf_model.vocabulary_: weight = weights[tfidf_model.vocabulary_[word]] feature_vec = np.add(feature_vec, model.wv[word]*weight) return feature_vec / len(weights) weighted_sentence_vectors = [tfidf_weighted_sentence_to_vector(s, model=model, tfidf_model=tfidf_model, num_features=100) for s in sentences] print(weighted_sentence_vectors) ``` 这里我们结合了TF-IDF权重与Word2Vec向量来构建更复杂的句向量表示[^3]。 #### 使用上下文敏感模型替代 如果希望进一步提升效果,可考虑使用像BERT这样的上下文敏感的语言模型代替传统的Word2Vec。它们能更好地捕捉多义词的不同含义以及复杂语境下的细微差别[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘训灼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值