Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从句子中提取字符ngrampython_Python_Regex_String_Nlp_N Gram - Fatal编程技术网

如何从句子中提取字符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))。/
)。