如何训练 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、学习率等 运行 几次,但结果远不能接受,大多数产生的同义词甚至都不是形容词。所以我的问题是:
- 如果我只在中心词是形容词时生成训练批次,而在不是形容词时简单地滑动window,这种方法是否被认为是无监督?
- generate_batch()函数有什么需要重新设计的吗?我被告知最好重新设计此功能以更好地适应这种特定情况,但我不知道除了问题 1 方法之外还有什么可以改进的。
- 如何产生形容词的同义词?我曾经认为大小为 4-7 的 skip-window 会倾向于捕捉语义(如果我不明白我学错了什么),并将形容词与其他类型的词区分开来,但事实并非如此我得到了什么。
- 关于参数: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.)
我需要训练 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、学习率等 运行 几次,但结果远不能接受,大多数产生的同义词甚至都不是形容词。所以我的问题是:
- 如果我只在中心词是形容词时生成训练批次,而在不是形容词时简单地滑动window,这种方法是否被认为是无监督?
- generate_batch()函数有什么需要重新设计的吗?我被告知最好重新设计此功能以更好地适应这种特定情况,但我不知道除了问题 1 方法之外还有什么可以改进的。
- 如何产生形容词的同义词?我曾经认为大小为 4-7 的 skip-window 会倾向于捕捉语义(如果我不明白我学错了什么),并将形容词与其他类型的词区分开来,但事实并非如此我得到了什么。
- 关于参数: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.)