Skip to content

Latest commit

 

History

History
192 lines (116 loc) · 7.54 KB

search-millions-documents-thousands-keywords.md

File metadata and controls

192 lines (116 loc) · 7.54 KB

迅速搜索数百万文档中的数千个关键词

原文:www.kdnuggets.com/2017/09/search-millions-documents-thousands-keywords.html

c评论

Vikash Singh, Belong.co


我们的前三个课程推荐

1. 谷歌网络安全证书 - 快速进入网络安全职业的快车道。

2. 谷歌数据分析专业证书 - 提升你的数据分析水平

3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT


假设你有一个文档,你想知道它是否提到 python(一个你关心的术语)

-------------------------------------------------------------------------
Document: I am a python developer.
Term: python
-------------------------------------------------------------------------

你想检查文档中是否包含 python 这个词。因此你打开文档,按 ctrl+f 并搜索 'python'。然后你找到了它 :)

现在假设你有 100 个这样的术语:[python, java, github, medium, 等等]

你将用一段简单的 python 代码打开文档。循环检查每个术语,看看术语是否存在。

-------------------------------------------------------------------------
Open (document) 
for each term in terms: 
    if term is present in document: print(term)
-------------------------------------------------------------------------

现在假设你有 100 个文档。你可以在循环中打开每个文档。每个文档中你搜索每个术语。

-------------------------------------------------------------------------
for document in documents: 
    Open (document)
    for each term in terms:
        if term is present in document: print(term)
-------------------------------------------------------------------------

现在假设 java 应该与 Java 匹配,但不包括 javascript

更好的是,java 应该与 j2eeJava 都匹配,但不包括 java script

(j2ee 和 java 是同义词,你注意到 java script 中的空格了吗?)

现在变得有趣了。你怎么做呢?

我们去年遇到了这个问题 @Belong.co。我们注意到人们用多种方式谈论相同的术语。Big apple 可以指 big appleNew York。幸运的是,我们有一些上下文。当我们的文档提到 Python 时,它 99.99% 的情况下指的是编程语言,而不是动物。

但这并没有简化我们的问题。Javaj2ee 对我们来说是一样的,但不包括 java script。那么如何从数百万个文档中提取这些信息呢?

正如你所想的,我们编写了一段 正则表达式 基础的代码。对于 100 万个文档和 2K 个关键词,这段代码运行了 24 小时。生活变得美好了 :)

但很快我们扩展到几百万个文档和 10K+ 个关键词。于是相同的代码现在需要 10 多天才能运行。因此我们开始寻找更好的方法。

我在办公室问了问,Vinay 建议我查看基于 Trie 字典的方法。Suresh 建议使用Aho Corasick 算法。在Stack overflow上得到了类似的建议。

事实证明,Aho Corasick 算法可以在对文档的一次扫描中同时搜索所有关键词。这真是太棒了。

youtu.be/NQ8GeVCEgBs

在示例输入上的 flashtext 演示。

我编写了基于 Trie 数据结构的自定义实现以适应我们的用例。它运行得相当不错。使用这种算法的关键词提取过程需要 15 分钟。比起基于正则表达式的方法减少了 10 多天的时间。

-------------------------------------------------------------------------
Input: I love j2ee. Keyword: j2ee=>Java 
# *Which is basically saying j2ee means Java* Output: ['Java']
-------------------------------------------------------------------------

现在关键词提取效果很好。因此,我还添加了在文档中用同义词替换关键词的功能。

Say you want to replaceNew DelhiwithNCR regionin a document.
Input: I live in New Delhi.
Output: I live in NCR region.

我们能够在多个项目中利用这个库。这也是我们决定将其开源的原因。这里是代码的链接 :) github.com/vi3k6i5/flashtext

使用起来非常简单:[Python 代码即将发布]

-------------------------------------------------------------------------
$ pip install flashtext
>>> from flashtext.keyword import KeywordProcessor
>>> keyword_processor = KeywordProcessor()
>>> keyword_processor.add_keyword('j2ee', 'Java')
>>> keyword_processor.add_keyword('Python')
>>> keyword_processor.extract_keywords('I work on python and j2ee')
# output: ['Python', 'Java']

关键词替换:

>>> keyword_processor.add_keyword('New Delhi', 'NCR region')
>>> keyword_processor.replace_keywords('I live in New Delhi.')
# output: 'I live in NCR region.'
-------------------------------------------------------------------------

这非常有用,因为它有助于术语扩展。比如你想将RC car替换为Remote Control car在产品目录中。或者你想将Electrocardiogram提取为ECG。这两者都很容易做到。


如果你认识从事实体识别或 NER 或 NLP 或 Word2vec 的人,请将这篇博客分享给他们。这一库对我们在这些领域非常有用。我相信它对其他人也会有帮助。

干杯 :)

原文。转载经许可。

个人简介:Vikash Singh 是 belong.co 的数据科学家,处理大量文本以及基于词嵌入的多个项目。

相关:

  • Python 超越 R,成为数据科学和机器学习平台的领导者

  • 5 个免费的自然语言处理深度学习入门资源

  • 文本挖掘 101:从简历中挖掘信息

更多相关主题