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

2024-06-11 00:00:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要训练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教程示例代码相同。我用不同的批大小、跳过windwo大小、学习率等进行了几次运行,但结果还远远不能接受,大多数产生的同义词甚至都不是形容词。所以我的问题是:

  1. 如果我只在中心词是形容词时生成训练批,而不是形容词时简单地滑动窗口,这种方法是否被认为是无监督的?在
  2. generate_batch()函数中是否需要重新设计?有人告诉我,最好重新设计这个功能,以便更好地为这个特定的案例工作,但我不知道除了问题1方法还有什么可以改进的。在
  3. 如何产生形容词同义词?我曾经认为,一个4-7大小的跳窗会倾向于捕捉语义(如果我不明白我学错了什么),并将形容词与其他类型的词区分开来,但这不是我得到的。在
  4. 关于参数:跳窗大小、批大小、学习率,有没有常用的值来实验?在

任何关于如何改进的建议都将不胜感激!在


Tags: targetdatasizeindexlenbuffernpbatch
1条回答
网友
1楼 · 发布于 2024-06-11 00:00:26

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

特别是,我们所认为的“反义词”在词向量中通常表现得非常相似,因为这些词在大多数方面和它们出现的上下文中都非常相似,只是在某些特定的主题相关的方式上形成了对比。在

因此,大多数相似(最近邻)单词表往往包括同义词,但也包括其他相关单词。在

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

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

  • 测试不同的上下文窗口大小-通常小窗口强调功能上的相似性(“这个词可以用在同一个地方吗?”)以及更大的windows主题相似性(“这些词在同一讨论中使用吗?”)

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

相关问题 更多 >