nlp - 根据含义比较文本
问题描述
我们有一个文档池(单词和纯文本),其中可能包含多达 1000、2000 个甚至更多的项目。每个文档可能包含数千个单词。有一个参考文档提供给我们,我们应该从池中找到与该参考文档语义最接近的匹配项。
我们首先使用了 SQL Server 2017 的语义搜索功能,但它返回的记录不超过 10 条,这是一个限制!市场上还有哪些其他技术或工具可以实现这一目的。我们更喜欢利用 Microsoft 的认知工具和服务,但我们对任何其他选项持开放态度,包括可以提供帮助的开源。
解决方案
如果文档具有技术性质,我建议您研究 TF-IDF 方法。TF-IDF 查看文档中词条的频率 (TF) 并将其与逆文档频率 (IDF) 相乘,IDF 是衡量整个语料库中词条稀缺程度的指标。那里的想法是:一个你经常使用但在整个语料库中很少使用的词,很可能使它成为文档含义的重要术语。然后将相似性度量(例如余弦相似性)应用于 TFIDF 以查找在 TFIDF 分数方面具有相似配置文件的文档(即,类似地过度使用相对独特的术语)
如果文本本质上技术含量较低,您可以查看 Word Embedding 方法,例如 Document2Vec - 基本上它们使用具有多维向量的训练集。这些多维向量试图捕捉单词的含义,这意味着您不依赖于所使用的相同关键字(TFIDF 就是这种情况)。
现有的实现已经存在(尤其是基于 Python),但 Azure 可能也可以促进这些技术(参见 HDInsight https://docs.microsoft.com/en-us/azure/architecture/data-guide/technology-choices/natural-语言处理)。您还可以查找开箱即用的 ElasticSearch。
推荐阅读
- google-apps-script - Google Scripts On Edit 功能
- python - 在python中循环读取文件时跳过某些文件的行
- apache-kafka - 当我们在 kafka 流中的两个 KTable 之间进行外键连接时生成的主题
- machine-learning - ValueError:数据基数不明确。确保所有数组都包含相同数量的样本?
- javascript - 在嵌套对象中有多个重复值时如何仅获取第一个出现的键 - JavaScript
- rust - 使用 String.replace 替换 Rust 中字符串的多行部分
- javascript - 使用 JavaScript 重定向到新窗口,点击
- python - Web Scraping 使用 Selenium 和 Beautiful Soup 但不起作用
- c# - ASP.NET Core 2.1 - 生产机器上的 Request.Path 为空
- r - 如何在 R 中解析分组的文本数据并转换为数据帧/时间序列