使用 word2vec 扩展词汇表以对文本进行分类
Use word2vec to expand a glossary in order to classify texts
我有一个包含大约 300 万条文本(推文)的数据库。我将干净的文本(删除停用词、标签...)放在名为 sentences
的标记列表中(因此它包含每个文本的标记列表)。
经过这些步骤,如果我写
model = Word2Vec(sentences, min_count=1)
我获得了大约 400,000 个单词的词汇量。
我还有一个单词列表(属于同一主题,在本例中为:经济学),名为 terms
。我发现 7% 的文本至少包含其中一个词(所以我们可以说 7% 的推文都在谈论经济学)。
我的目标是扩展列表 terms
以检索更多属于经济主题的文本。
那我用
results = model.most_similar(terms, topn=5000)
在标记列表 sentences
中查找与 terms
中包含的词最相似的词。
最后,如果我创建数据框
df = pd.DataFrame(results, columns=['key', 'similarity'])
我得到了类似的东西:
key similarity
word1 0.795432
word2 0.787954
word3 0.778942
... ...
现在我想我有两种可能来定义扩展词汇表:
- 我取前N个字(N的值应该是多少?);
- 我一个一个地看建议词,根据我的知识决定把哪个词收进扩展词汇表(这个词真的属于经济词汇表吗?)
遇到这种情况我该如何处理?
对于截止值应该是多少,或者您应该使用自己的手动判断与更粗糙的(但 fast/automatic)流程相比,没有一般的答案。这些本质上是决策,将在很大程度上受到您的数据、模型质量和目标的影响——因此您必须尝试不同的方法,看看哪些方法有效。
如果你有一个目标是你想要占原始语料库的多少百分比——比如,14% 而不是 7%——你可以根据需要尽可能深入地进入 'similar words' 的排名候选列表,以达到 14% 的目标。
请注意,当您检索 model.most_similar(terms)
时,您要求模型首先对 terms
中的所有单词进行平均,然后 return 个单词接近那个平均点。在某种程度上,您的种子术语集紧紧围绕 economics
的想法,这可能会找到接近该通用平均想法的单词 – 但可能找不到其他有趣的单词,例如您刚刚使用的种子单词的紧密同义词没想到为此,您可能不想为一个通用平均点获得 5000 个邻居,而是(比如说)为每个单独的项获得 3 个邻居。在某种程度上,该主题的 'shape' 并不是围绕 word-vector-space 中某处的完美球体,而是一些块状的复杂体积,这可能更好地反映您的意图。
与其单独判断一个词是否与economics
相关,不如看一个词唯一引入的文本。即对于新词X,查看包含该词的 N 篇文章。在对他们的全文进行全面判断时,有多少应该属于您的 'economics' 子集?只有当它高于某个阈值 T 时,您才会将 X 移到您的词汇表中。
但是这样的练习可能只是强调:使用一个简单的词汇表——“对于这些 hand-picked N 个词中的任何一个,每个提到至少一个词的文本都在”——是一种相当粗略的评估文本的主题。还有其他方法可以自动实现“选择相关子集”的目标。
例如,您可以将任务视为训练文本二元分类器以将文本分类为 'economics' 或 'not-economics'。
在这种情况下,您将从一些训练数据开始 - 一组已经标记为 'economics' 或 'not-economics' 的示例文档,可能通过个人人工审查,或者可能通过一些粗略的引导(比如用一组词汇表单词标记所有文本为 'economics',以及所有其他的 'not-economics')。然后,您将从所有潜在的 text-preprocessing、text-feature-extracton 和分类选项中汲取灵感,以训练和评估为您做出判断的分类器。然后你会 evaluate/tune 那些 - 一个过程也可能会改善你的训练数据,因为你添加新的明确 'economics' 或 'not-economics' 文本 - 并最终确定一个运作良好的。
或者,您可以使用其他一些更丰富的 topic-modeling 方法(LDA、word2vec 派生 Doc2Vec
、更深层的神经模型等)对整个数据集进行建模,然后从一些 seed-set确定的 'economics' 文本,从它们向外扩展 – 找到 nearest-examples 到 known-good 文档,auto-including 它们或 hand-reviewing 它们。
单独:min_count=1
几乎总是 word2vec 和相关算法中的错误,如果你 丢弃 单词会更好,它们缺乏多种用法示例该算法需要生成良好的 word-vectors.
我有一个包含大约 300 万条文本(推文)的数据库。我将干净的文本(删除停用词、标签...)放在名为 sentences
的标记列表中(因此它包含每个文本的标记列表)。
经过这些步骤,如果我写
model = Word2Vec(sentences, min_count=1)
我获得了大约 400,000 个单词的词汇量。
我还有一个单词列表(属于同一主题,在本例中为:经济学),名为 terms
。我发现 7% 的文本至少包含其中一个词(所以我们可以说 7% 的推文都在谈论经济学)。
我的目标是扩展列表 terms
以检索更多属于经济主题的文本。
那我用
results = model.most_similar(terms, topn=5000)
在标记列表 sentences
中查找与 terms
中包含的词最相似的词。
最后,如果我创建数据框
df = pd.DataFrame(results, columns=['key', 'similarity'])
我得到了类似的东西:
key similarity
word1 0.795432
word2 0.787954
word3 0.778942
... ...
现在我想我有两种可能来定义扩展词汇表:
- 我取前N个字(N的值应该是多少?);
- 我一个一个地看建议词,根据我的知识决定把哪个词收进扩展词汇表(这个词真的属于经济词汇表吗?)
遇到这种情况我该如何处理?
对于截止值应该是多少,或者您应该使用自己的手动判断与更粗糙的(但 fast/automatic)流程相比,没有一般的答案。这些本质上是决策,将在很大程度上受到您的数据、模型质量和目标的影响——因此您必须尝试不同的方法,看看哪些方法有效。
如果你有一个目标是你想要占原始语料库的多少百分比——比如,14% 而不是 7%——你可以根据需要尽可能深入地进入 'similar words' 的排名候选列表,以达到 14% 的目标。
请注意,当您检索 model.most_similar(terms)
时,您要求模型首先对 terms
中的所有单词进行平均,然后 return 个单词接近那个平均点。在某种程度上,您的种子术语集紧紧围绕 economics
的想法,这可能会找到接近该通用平均想法的单词 – 但可能找不到其他有趣的单词,例如您刚刚使用的种子单词的紧密同义词没想到为此,您可能不想为一个通用平均点获得 5000 个邻居,而是(比如说)为每个单独的项获得 3 个邻居。在某种程度上,该主题的 'shape' 并不是围绕 word-vector-space 中某处的完美球体,而是一些块状的复杂体积,这可能更好地反映您的意图。
与其单独判断一个词是否与economics
相关,不如看一个词唯一引入的文本。即对于新词X,查看包含该词的 N 篇文章。在对他们的全文进行全面判断时,有多少应该属于您的 'economics' 子集?只有当它高于某个阈值 T 时,您才会将 X 移到您的词汇表中。
但是这样的练习可能只是强调:使用一个简单的词汇表——“对于这些 hand-picked N 个词中的任何一个,每个提到至少一个词的文本都在”——是一种相当粗略的评估文本的主题。还有其他方法可以自动实现“选择相关子集”的目标。
例如,您可以将任务视为训练文本二元分类器以将文本分类为 'economics' 或 'not-economics'。
在这种情况下,您将从一些训练数据开始 - 一组已经标记为 'economics' 或 'not-economics' 的示例文档,可能通过个人人工审查,或者可能通过一些粗略的引导(比如用一组词汇表单词标记所有文本为 'economics',以及所有其他的 'not-economics')。然后,您将从所有潜在的 text-preprocessing、text-feature-extracton 和分类选项中汲取灵感,以训练和评估为您做出判断的分类器。然后你会 evaluate/tune 那些 - 一个过程也可能会改善你的训练数据,因为你添加新的明确 'economics' 或 'not-economics' 文本 - 并最终确定一个运作良好的。
或者,您可以使用其他一些更丰富的 topic-modeling 方法(LDA、word2vec 派生 Doc2Vec
、更深层的神经模型等)对整个数据集进行建模,然后从一些 seed-set确定的 'economics' 文本,从它们向外扩展 – 找到 nearest-examples 到 known-good 文档,auto-including 它们或 hand-reviewing 它们。
单独:min_count=1
几乎总是 word2vec 和相关算法中的错误,如果你 丢弃 单词会更好,它们缺乏多种用法示例该算法需要生成良好的 word-vectors.