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

How to train word2vec model to work better on producing synonym of adjective words?

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

我去掉了所有的标点符号,space,把所有的数字和专有名词分别当作同一个词,预处理语料时做了词形还原。

我使用 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教程示例代码差不多。我用不同的批量大小、skip-windwo-size、学习率等 运行 几次,但结果远不能接受,大多数产生的同义词甚至都不是形容词。所以我的问题是:

  1. 如果我只在中心词是形容词时生成训练批次,而在不是形容词时简单地滑动window,这种方法是否被认为是无监督
  2. generate_batch()函数有什么需要重新设计的吗?我被告知最好重新设计此功能以更好地适应这种特定情况,但我不知道除了问题 1 方法之外还有什么可以改进的。
  3. 如何产生形容词的同义词?我曾经认为大小为 4-7 的 skip-window 会倾向于捕捉语义(如果我不明白我学错了什么),并将形容词与其他类型的词区分开来,但事实并非如此我得到了什么。
  4. 关于参数:skip-window-size, batch-size, learning-rate,有没有常用的值可以实验?

如有任何改进建议,我们将不胜感激!

我们对 'synonym' 的语言学概念比类似 word2vec 算法发现的词位置所反映的相似性更窄。

特别是,我们认为“反义词”通常在词向量中看起来非常相似,因为词 在大多数方面和它们出现的上下文中非常相似– 仅以某些特定的、与主题相关的方式进行对比。

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

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

  • 在训练前用词性信息标记单词,然后过滤邻居列表以仅包含形容词

  • 测试不同的上下文 -window 大小 - 通常小 windows 强调功能相似性 ("can this word be used in the same places?") 和较大 windows 主题相似性 ("are these words used in the same discussions?")

(未经验证的想法:最好的形容词同义词可能会出现在最相似列表的顶部附近,基于小上下文-windows、 大上下文- windows.)