我需要训练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大小、学习率等进行了几次运行,但结果还远远不能接受,大多数产生的同义词甚至都不是形容词。所以我的问题是:
任何关于如何改进的建议都将不胜感激!在
我们对“同义词”的语言学概念比类似于word2vec算法的单词位置所反映的相似性要窄。在
特别是,我们所认为的“反义词”在词向量中通常表现得非常相似,因为这些词在大多数方面和它们出现的上下文中都非常相似,只是在某些特定的主题相关的方式上形成了对比。在
因此,大多数相似(最近邻)单词表往往包括同义词,但也包括其他相关单词。在
取得更好结果的可能方向包括:
在训练前用词性信息标记单词,然后过滤邻居列表以只包含形容词
测试不同的上下文窗口大小-通常小窗口强调功能上的相似性(“这个词可以用在同一个地方吗?”)以及更大的windows主题相似性(“这些词在同一讨论中使用吗?”)
(未经验证的想法:基于小上下文窗口、和大上下文窗口,最佳形容词同义词可能出现在最相似列表的顶部附近。)
相关问题 更多 >
编程相关推荐