如何训练word2vec模型以更好地生成形容词的同义词?

我需要使用无监督学习从某个语料库中训练word2vec模型,以生成任何用户输入的形容词的同义词,并且理想情况下,生成的同义词也是形容词。

我在预处理语料库时已经删除了所有标点符号和空格,将所有数字和专有名词分别视为相同的术语,并进行了词形还原处理。

我使用了Skip Gram模型(不确定这是否是解决此问题的最高效方法),并使用来自TensorFlow的generate_batch()函数生成训练批次,该函数生成(center_word, context_word)对:

def generate_batch(batch_size, num_skips, skip_window):  global data_index  assert batch_size % num_skips == 0  assert num_skips <= 2 * skip_window  batch = np.ndarray(shape=(batch_size), dtype=np.int32)  labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32)  span = 2 * skip_window + 1  # [ skip_window target skip_window ]  buffer = collections.deque(maxlen=span)  if data_index + span > len(data):    data_index = 0  buffer.extend(data[data_index:data_index + span])  data_index += span  for i in range(batch_size // num_skips):    target = skip_window  # target label at the center of the buffer    targets_to_avoid = [skip_window]    for j in range(num_skips):      while target in targets_to_avoid:        target = random.randint(0, span - 1)      targets_to_avoid.append(target)      batch[i * num_skips + j] = buffer[skip_window]      labels[i * num_skips + j, 0] = buffer[target]    if data_index == len(data):      buffer[:] = data[:span]      data_index = span    else:      buffer.append(data[data_index])      data_index += 1  # Backtrack a little bit to avoid skipping words in the end of a batch  data_index = (data_index + len(data) - span) % len(data)  return batch, labels

基本上,训练模型的代码也几乎与TensorFlow教程中的样本代码相同。我已经用不同的批次大小、跳窗大小、学习率等运行了几次,但结果远未达到可接受的水平,大多数生成的同义词甚至不是形容词。所以我的问题是:

  1. 如果我只在中心词是形容词时生成训练批次,并且在不是形容词时简单地滑动窗口,这种方法是否被认为是无监督的?
  2. generate_batch()函数中是否需要重新设计什么?我被告知最好重新设计这个函数以更好地适用于这个特定情况,但我不知道除了问题1的方法外,还有什么可以改进的。
  3. 如何生成形容词同义词?我曾经认为大小为4-7的跳窗会倾向于捕捉语义含义(如果我没有误解我所学的内容),并区分形容词和其他类型的词,但这并不是我得到的结果。
  4. 关于参数:跳窗大小、批次大小、学习率,有没有通常使用的值来进行实验?

任何改进的建议都将不胜感激!


回答:

我们对“同义词”的语言学概念比word2vec类算法找到的词位置所反映的相似性要窄。

特别是,我们认为的“反义词”通常在词向量中表现得非常相似,因为这些词在大多数方面以及它们出现的上下文中确实非常相似——只是在某些特定的、与主题相关的方式上存在对比。

因此,最相似的(最近邻)词列表往往包括同义词,但也包括其他相关词。

为了获得更好的结果,可能的方向包括:

  • 在训练前为词标注词性信息,然后过滤邻居列表,只包括形容词

  • 测试不同的上下文窗口大小——通常较小的窗口强调功能相似性(“这个词是否可以在相同的地方使用?”),而较大的窗口强调主题相似性(“这些词是否在相同的讨论中使用?”)

(未经证实的想法:基于小上下文窗口和大上下文窗口的最相似列表的顶部可能会出现最佳的形容词同义词。)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注