Dice Tech Jobs - Dice.com 用于构建“概念搜索引擎”的存储库,作者:Simon Hughes(Dice 数据科学家).该存储库包含用于在一组文档上训练 Thomas Mikolov 的 Word2Vec 模型的 Python 代码。然后,可以使用同义词文件与一些 solr 插件结合将此过程的输出嵌入到 solr(或其他一些搜索引擎)中,以在搜索引擎内提供概念搜索功能。输出也可以在其他搜索引擎中使用,只要它们支持同义词文件。概念搜索也称为语义搜索,它学习匹配域中的概念而不是关键字来提高召回率。
另请查看我的“搜索中的矢量”存储库,它扩展了这项工作。它还包含该演讲中的幻灯片和视频的链接。
这些脚本包括用于预处理和标记文档、根据文档频率提取常用术语和短语、使用 gensim 实现训练 word2vec 模型以及使用 sci-kit learn 的聚类库对生成的词向量进行聚类的代码。 python 脚本输出许多 solr 同义词文件,当与一些自定义的 dice solr 插件结合使用时,这些文件可用于在 solr 中启用概念搜索功能。
请参阅 https://github.com/DiceTechJobs/SolrPlugins 了解 solr 插件,以在 Apache Solr 搜索引擎中利用学习到的向量和同义词文件
请参阅 https://github.com/DiceTechJobs/SolrConfigExamples 以获取示例 solr 配置条目,用于在 solr 中配置概念搜索,包括设置插件。
这些脚本采用 Jupyter python 笔记本的形式,按顺序运行(1、2、3 和 4 中的任何一个),如果您不想使用 Jupyter,则可以作为单独的命令行脚本(见下文)运行。 python 脚本更干净,并与所有必需的设置共享通用配置文件,并且设计为从 shell 运行,因此这些脚本可能更容易启动。这些笔记本和脚本将预处理文档,并训练 Word2Vec 模型。 ./Settings 文件夹包含每个脚本的示例配置文件,并在注释中提供了每个设置的描述。要调用命令行脚本,请传入相关的配置文件作为唯一的参数,例如
python pre_process_documents.py ./Settings/pre_process_documents.cfg
命令行脚本应按顺序运行:
pre_process_documents.py - 需要删除一些标点符号(逗号、连字符等),如果需要的话解析 html,并分离出文档中的句子。如果您希望跳过此步骤并转到步骤 2 或 3,请向步骤 2 和 3 提供一组文件,其中包含要删除的所有标点符号,并且每个新句子都位于单独的行中。
extract_keywords.py -(可选)如果您的域中没有一组良好且广泛的关键字短语(例如您的前 5,000 个搜索关键字和短语,短语是重要部分),或者您希望增加此列表之外的覆盖范围,请运行该脚本提取高于指定文档频率阈值的所有关键字和短语。
train_word2vec_model.py - 在 1 中的预处理文档上训练并保存 Word2Vec 模型。使用一组关键字和短语,例如 2 中的输出。请注意- 该模型非常快,但需要 C 编译器可用并预安装以在幕后使用 C 版本,否则将使用慢得多的 python 实现。如果此功能不可用,您将在首次训练模型时收到运行时警告。
此步骤包含多个文件,具体取决于所需的解决方案(请参阅我的演讲):
矢量输出 - 即将推出!请参阅 Jupyter Notebook 4.a
generate_topn_synonyms_file.py - 为每个目标关键字或短语生成前 n 个同义词。这会生成 2 个文件,一个包含有效负载的文件,一个不包含有效负载的文件。最简单的用例是使用没有负载的文件。使用有效负载文件通过相似性对同义词进行加权可以获得更好的性能。这可以在查询时使用 queryboost 解析器来完成。请注意,要执行此操作,您需要在查询时对逗号和空格进行标记,因为我们用逗号替换空格来解决多词同义词问题。或者(推荐)在索引时使用同义词扩展,以及 PayloadEdismax 查询解析器、PayloadAwareDefaultSimilarity 类(用作默认相似性或使用模式相似性来配置每个字段),并确保这些字段的 fieldType 包含术语“有效负载”或“矢量”。
generate_cluster_synonyms_file.py - 从前面步骤中生成的词向量生成 k 个簇。这些可以通过同义词文件直接嵌入到 solr 中 - 不需要特殊的插件。我建议生成许多不同大小的不同同义词簇,并将它们配置为单独的字段,并将较高的字段权重应用于小簇(即使用较大的 k 值生成)。
使用 python 2.7.10 构建。未经 python 3 测试
Word2Vec 的实现是优秀的 gensim 包的实现。包含 LSA、LDA、Word2Vec 和其他一些机器学习算法的快速实现。
https://radimrehurek.com/gensim/models/word2vec.html
这是一个很棒的包,用于主题建模以及学习文档和单词的语义表示。
谷歌发布了一组预训练的词向量,在谷歌新闻语料库的 1000 亿个单词上进行训练。对于那些不专注于特定领域而是关注非常广泛的文档的人,例如构建新闻搜索引擎的公司(如路透社、彭博社、政府机构等),您可以使用这个预先训练的模型反而。然后,您可以跳过前 3 个步骤,直接使用上面的第 4 步脚本之一,该脚本采用预先训练的模型并计算输出同义词文件,这就是您所需要的。这篇文章介绍了在哪里获取预训练向量:https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg。然后您可以使用 gensim 的 Word2Vec 的 model.load 功能:
model = Word2Vec . load ( MODEL_FILE )
如果您使用 Solr 云,Zookeeper 不喜欢任何配置文件大小超过 1M。因此,如果生成的同义词文件大于此值,您将必须 1) 更改默认的 Zookeeper 设置,2) 将同义词文件拆分为多个文件并按顺序应用同义词过滤器,或者 3) 使用以下命令从数据库加载同义词一个插件(例如https://github.com/shopping24/solr-jdbc-synonyms)
斯坦福大学的 NLP 研究者开发了一种与 Word2Vec 竞争的词向量学习算法,具有相似的精度。如果你想尝试一下,这个 python 包将允许你这样做:https://github.com/hans/glove.py 但我还没有尝试过,所以我现在不能保证它。
初始脚本需要一个包含原始 *.txt 或 html 文件的文件夹。如果您有 html 内容,则脚本内部有解析 html 的逻辑,但 beautiful soup 可能有点不稳定,因此您最好在将它们推入管道之前先对其进行预解析。请注意,没有特殊的文件格式,这似乎是大多数人在尝试运行此脚本时遇到的问题。如果加载文件时出错,我建议使用 python 脚本而不是笔记本,然后打开调试器看看发生了什么。另外,请确保在 https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg 中设置 config.file_mask 以匹配要加载的文件。默认为 .*.txt (它是正则表达式,而不是文件 blob),因此如果您的文件不是 .txt 文件,则需要更改它。
请将任何问题、错误或功能请求发布到问题列表,并添加 @mention - @simonhughes22,以便我会及时收到包含您问题的电子邮件。有几个人直接给我发电子邮件询问有关此存储库的问题。虽然我不介意回复电子邮件,但请提交 GitHub 问题并@提及我。这样,其他人就可以看到问题和我的回答以供将来参考。
我最近做了一个关于矢量搜索的演讲,代码如下。这是我所做的概念搜索工作的自然延伸
请查看我们的 Solr 插件: