如何从句子中提取字符ngrampython
以下如何从句子中提取字符ngrampython,python,regex,string,nlp,n-gram,Python,Regex,String,Nlp,N Gram,以下word2grams函数从单词中提取字符3grams: >>> x = 'foobar' >>> n = 3 >>> [x[i:i+n] for i in range(len(x)-n+1)] ['foo', 'oob', 'oba', 'bar'] 这篇文章展示了单个单词的字符提取 但是如果我有句子,并且我想提取字符ngrams,除了迭代调用word2ngram(),还有更快的方法吗 实现相同的word2ngram和sent2ngra
word2grams
函数从单词中提取字符3grams:
>>> x = 'foobar'
>>> n = 3
>>> [x[i:i+n] for i in range(len(x)-n+1)]
['foo', 'oob', 'oba', 'bar']
这篇文章展示了单个单词的字符提取
但是如果我有句子,并且我想提取字符ngrams,除了迭代调用word2ngram()
,还有更快的方法吗
实现相同的word2ngram
和sent2ngram
输出的正则表达式版本是什么?会更快吗?
我试过:
import string, random, time
from itertools import chain
def word2ngrams(text, n=3):
""" Convert word into character ngrams. """
return [text[i:i+n] for i in range(len(text)-n+1)]
def sent2ngrams(text, n=3):
return list(chain(*[word2ngrams(i,n) for i in text.lower().split()]))
def sent2ngrams_simple(text, n=3):
text = text.lower()
return [text[i:i+n] for i in range(len(text)-n+1) if not " " in text[i:i+n]]
# Generate 10000 random strings of length 100.
sents = [" ".join([''.join(random.choice(string.ascii_uppercase) for j in range(10)) for i in range(100)]) for k in range(100)]
start = time.time()
x = [sent2ngrams(i) for i in sents]
print time.time() - start
start = time.time()
y = [sent2ngrams_simple(i) for i in sents]
print time.time() - start
print x==y
[out]:
0.0205280780792
0.0271739959717
True
0.0211708545685
0.0284190177917
0.0303599834442
True
已编辑
regex方法看起来很优雅,但其执行速度比迭代调用word2ngram()
慢:
[out]:
0.0205280780792
0.0271739959717
True
0.0211708545685
0.0284190177917
0.0303599834442
True
为什么不干脆(?=(…)
编辑相同的内容,但不能编辑空白(?=(\S\S\S))
edit2您也可以随心所欲地使用。例如,仅使用alphanum
(?=([^\W_337;]{3}))
使用前瞻来捕获3个字符。然后发动机每次向上颠簸一次位置匹配。然后捕获下一个3
foobar
的结果是foo
oob
oba
酒吧
对不起,什么是
(?=(…)
?你能举个有效的例子吗?我尝试过:(?=('foobar'))
但出现语法错误。添加了一些注释,(?=(…)
是正则表达式。我不知道Python,但它应该在match all(获取数组输出)上下文中用作正则表达式。。。这就是你想要的吗?是的,同样的事情,没有空格(?=(\S\S\S))
@alvas-减速可能是rgx=
应该只编译一次,而不是每个句子。它应该在迭代之前预编译。如果你主动移动比赛位置,你也可以将正则表达式的速度提高10-15%。i、 e、/(?=(\S\S\S))。/
添加点所有修饰符(与/(?=(\S\S\S))[\S\S]/
或/(?=(\S\S))。/
)。