快捷搜索:  汽车  科技

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)事实证明,如果要搜索和替换的关键字数量在100内,正则表达式的速度很快。但我的语料库有超过20K的关键字和300万个文档。stack- exchange问题地址:https://softwareengineering.stackexchange.com/questions/223634/what-is-meant-by-now-you-have-two-problems为了解决这个问题,我编写了一个正则表达式来替换所有已知的标准化名称的同义词。正则表达式用“JavaScript”取代了“Javascripting”,这解决了一个问题,但又产生了另一个问题。有些人,当遇到问题时,会想“我知道,我将使用正则表达式。”现在他们有两个问题。上面的引用来自于这个stack- exchange问题,这对我来说是正确的。

当开发人员使用文本时,他们通常需要先清理它。有时是通过替换关键字,比如用“Javascript”替换“JavaScript”。有些时候,我们只是想知道文档中是否提到了“JavaScript”。

像这样的数据清理任务是大多数处理文本的数据科学项目的标准。

数据科学从数据清理开始

我从事数据科学家的工作。自然语言处理是我工作的一部分。

当我在我们的文档语料库上训练一个Word2Vec模型时,它开始给出类似的同义词。“Javascripting”与“JavaScript”类似。

为了解决这个问题,我编写了一个正则表达式来替换所有已知的标准化名称的同义词。正则表达式用“JavaScript”取代了“Javascripting”,这解决了一个问题,但又产生了另一个问题。

有些人,当遇到问题时,会想“我知道,我将使用正则表达式。”现在他们有两个问题。

上面的引用来自于这个stack- exchange问题,这对我来说是正确的。

stack- exchange问题地址:https://softwareengineering.stackexchange.com/questions/223634/what-is-meant-by-now-you-have-two-problems

事实证明,如果要搜索和替换的关键字数量在100内,正则表达式的速度很快。但我的语料库有超过20K的关键字和300万个文档。

自然的解决方案是并行运行。但当我们达到数以百万计的文档和数以万计的关键字时,这并没有什么帮助。必须有更好的办法!

我编写了自己的实现和FlashText。

FlashText地址:https://github.com/vi3k6i5/FlashText

在我们进入FlashText以及了解它如何工作之前,让我们来看看它是如何进行搜索的:

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(1)

最下面的红线是使用FlashText搜索需要的时间

上面所示的图表是1份文档分别进行FlashText与执行正则表达式的结果比较。随着关键字数量的增加,正则表达式的时间几乎线性增长。但用FlashText时间并没有增加很多。

FlashText将运行时间从5天减少到15分钟!

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(2)

这是FlashText替换所需的时间:

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(3)

最下面的红线是使用FlashText替换需要的时间

上面所示的基准代码链接地址:https://gist.github.com/vi3k6i5/dc3335ee46ab9f650b19885e8ade6c7a

结果链接地址:https://goo.gl/wWCyyw

FlashText是什么?

FlashText是我在GitHub上开放源代码的一个Python库。它既能有效地提取关键字,又能替代它们。

要使用FlashText,首先必须通过一个关键字列表。这个列表将用于内部构建一个Trie字典。然后传递一个字符串,告诉它是否要执行替换或搜索。

对于替换,它将创建一个替换关键字的新字符串。对于搜索,它将返回在字符串中找到的关键字列表。这将发生在一个传递给输入字符串的过程中。

为什么FlashText这么快?

让我们试着用一个例子来理解这个部分。假设我们有一个句子,它有3个单词, [I like Python] 和一个语料库,它有4个单词 {Python Java J2ee Ruby}。

如果我们从语料中提取每个单词,并检查它是否在句子中,它会尝试4次。

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(4)

如果语料库有n个单词,它就会有n个循环。每个搜索步骤都是 [is <word> in sentence?],这是在正则式表达匹配中发生的情况。

还有一种方法与第一个方法相反。对于句子中的每个单词,检查它是否存在于语料库中。

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(5)

如果这个句子有m个单词,它就会有m个循环。在这种情况下,它所花费的时间只取决于句子中单词的数量。这一步,[ is <word> in corpus?],可以使用字典查找快速进行。

FlashText算法基于第二种方法。它的灵感来自于aho – corasick算法和Trie数据结构。

它的工作方式是:

首先使用语料库创建了Trie字典。它看起来有点像下图:

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(6)

语料库的线索词典

start和EOT(术语的末尾)表示单词边界,如[ space] [period]和 [new_line.] ,只有在它的两边有单词边界时,关键字才会匹配。

接下来,我们将使用一个输入字符串, [I like Python] ,并根据字符进行搜索。

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(7)

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(8)

由于这是一个字符匹配的字符,我们可以轻松地跳过 [<start>l ]上的[<start>like<EOT>],因为[ l ]没有连接 [start]。这使得跳过缺失的单词非常快。

FlashText算法只处理输入字符串“I like Python”的每个单词。这本字典有一百万个关键字,但对运行不产生影响。这就是FlashText算法的真正威力。

什么时候应该使用FlashText呢?

简单回答:当关键字数量大于500的时候

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(9)

在~500个关键词后,搜索FlashText开始优于正则表达式

复杂的答案:正则表达式可以搜索基于特殊字符的关键字 如 ^ $ * \d FlashText中不支持这些关键字。

因此,如果你想匹配`word\dvec`. 这样的部分词,可能无法完成。但它很好地提取了像 `word2vec`.这样的完整单词。

FlashText搜索关键词

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(10)

FlashText的简单抽取示例

FlashText替换关键词

代替提取关键字,你也可以在句子中替换关键字。我们将此作为数据处理过程中的数据清理步骤。

语句关键词替换工具(创建一个工具在15分钟内完成关键字替换)(11)

FlashText的简单替换示例

如果你认识一个使用文本数据、实体识别、自然语言处理或Word2vec的人,请考虑与他们分享这篇文章。

本文为编译文章,转载请注明出处。

来源:atyun_com

来源网址:http://www.atyun.com/10711_省时又准确!创建一个工具在15分钟内完成关键字替.html

猜您喜欢: