我需要使用无监督学习从某个语料库中训练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教程中的样本代码相同。我已经用不同的批次大小、跳窗大小、学习率等运行了几次,但结果远未达到可接受的水平,大多数生成的同义词甚至不是形容词。所以我的问题是:
- 如果我只在中心词是形容词时生成训练批次,并且在不是形容词时简单地滑动窗口,这种方法是否被认为是无监督的?
- 在generate_batch()函数中是否需要重新设计什么?我被告知最好重新设计这个函数以更好地适用于这个特定情况,但我不知道除了问题1的方法外,还有什么可以改进的。
- 如何生成形容词同义词?我曾经认为大小为4-7的跳窗会倾向于捕捉语义含义(如果我没有误解我所学的内容),并区分形容词和其他类型的词,但这并不是我得到的结果。
- 关于参数:跳窗大小、批次大小、学习率,有没有通常使用的值来进行实验?
任何改进的建议都将不胜感激!
回答:
我们对“同义词”的语言学概念比word2vec类算法找到的词位置所反映的相似性要窄。
特别是,我们认为的“反义词”通常在词向量中表现得非常相似,因为这些词在大多数方面以及它们出现的上下文中确实非常相似——只是在某些特定的、与主题相关的方式上存在对比。
因此,最相似的(最近邻)词列表往往包括同义词,但也包括其他相关词。
为了获得更好的结果,可能的方向包括:
-
在训练前为词标注词性信息,然后过滤邻居列表,只包括形容词
-
测试不同的上下文窗口大小——通常较小的窗口强调功能相似性(“这个词是否可以在相同的地方使用?”),而较大的窗口强调主题相似性(“这些词是否在相同的讨论中使用?”)
(未经证实的想法:基于小上下文窗口和大上下文窗口的最相似列表的顶部可能会出现最佳的形容词同义词。)