Adi*_*tya 4 python regex python-3.x pandas
版本1
import string, pandas as pd
def correct_contraction1(x, dic):
for word in dic.keys():
if word in x:
x = x.replace(word, " " + dic[word]+ " ")
return x
Run Code Online (Sandbox Code Playgroud)
版本2
import string, pandas as pd
def correct_contraction2(x, dic):
for word in dic.keys():
if " " + word + " " in x:
x = x.replace(" " + word + " ", " " + dic[word]+ " ")
return x
Run Code Online (Sandbox Code Playgroud)
我如何使用它们:
train['comment_text'] = train['comment_text'].apply(correct_contraction1,args=(contraction_mapping,))
#3 mins 40 sec without that space thing (version1)
train['comment_text'] = train['comment_text'].apply(correct_contraction2,args=(contraction_mapping,))
#5 mins 56 sec with that space thing (version2)
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么速度差异如此之大,这种情况不太可能发生,其次是更好/隐藏的熊猫技巧来进一步优化这一点?(该代码已在Kaggle Kernels上经过多次测试)
train 是在两种情况下都有200万行的数据框,也完全相同 contraction_mapping 是字典映射...(在两种情况下都一样)非常感谢 !
编辑-1-数据来自Kaggle Comp,版本1更快!
编辑-2谢谢,你们Rock!(我希望我能接受所有人!)
抱歉,无法回答区别,但是在任何情况下都可以轻松地改进当前方法。这对您来说很慢,因为您必须多次扫描所有句子(每个单词)。您甚至要检查每个单词两次,首先检查每个单词是否存在,然后替换它-您只能替换。
这是进行文本替换时(无论是使用正则表达式,简单字符串替换还是开发自己的算法时)的关键课程:尝试仅遍历文本一次。无论您要替换多少个单词。正则表达式有很长的路要走,但是根据实现的需要,当找不到匹配项时,需要返回几个字符。对于感兴趣的人:查找trie数据结构。
例如,尝试实现快速文本搜索(aho-corasick)。我正在为此开发一个库,但是在此之前,您可以使用flashtext(其功能有所不同):
import flashtext
# already considers word boundaries, so no need for " " + word " "
fl = flashtext.KeywordProcessor()
fl.add_keywords_from_dict(dic)
train['comment_text'] = train['comment_text'].apply(fl.replace_keywords)
Run Code Online (Sandbox Code Playgroud)
如果您要替换的单词过多,则速度会提高几个数量级。
对于第一个数据的比较,我可以找到:
Words to replace: 8520
Sentences to replace in: 11230
Replacements made using flashtext: 1706
Replacements made using correct_contraction1: 25
flashtext: (considers word boundaries and ignores case)
39 ms ± 355 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
correct_contraction1: (does not consider case nor words at end of line)
11.9 s ± 194 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
<unannounced>
30 ms ± 366 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Run Code Online (Sandbox Code Playgroud)
所以我们说的是300倍加速。并非每天都这样;-)
供参考,由Jon Clements添加了正则表达式:
pandas.str.replace + regex (1733 replacements)
3.02 s ± 82.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
经过测试,我的新库将再减少30%。我也看到了Flashtext的2-3倍改进,但更重要的是,可以为用户提供更多控制权。它功能齐全,只需要清理并添加更多文档即可。
到达时我会更新答案!
| 归档时间: |
|
| 查看次数: |
87 次 |
| 最近记录: |