У меня проблема с этой функцией разделения. Функция в основном берет строку, например word = 'optimization'
, определяет ее точки разделения относительно сгенерированного случайного числа и превращает это разбиение в биграммы. Маркер '0'
означает конец слова. Рассмотрите слово ниже; левая сторона является входом, и функция должна давать один из всех возможных выходов с одинаковой вероятностью для любого вывода одного и того же слова:
'optimization' = [['op', 'ti'], ['ti', 'mizati'], ['mizati', 'on'], ['on', '0']
Проблема: когда я профилировал все свои функции, эта функция разделения потребляла наибольшее время выполнения (обрабатывала 100 000 слов), но я застрял на ее оптимизации. Мне нужна помощь на данный момент. Также могут быть лучшие способы, но я ограничен своей собственной точкой зрения.
from numpy import mod
import nltk
def random_Bigramsplitter(word):
spw = []
length = len(word)
rand = random_int(word) # produce random number in respect to len(word)
if rand == length: # probability of not dividing
return [tuple([word, '0'])]
else:
div = mod(rand, (length + 1)) # defining division points by mod operation
bound = length-div
spw.append(div)
while div != 0:
rand = random_int(word)
div = mod(rand, (bound + 1))
bound = bound-div
spw.append(div)
result = spw
b = 0
points = []
for x in range(len(result) - 1): # calculating splitting points in respect to array structure
b += result[x]
points.append(b)
xy = 0
t = []
for i in points:
t.append(word[xy:i])
xy = i
if word[xy: len(word)] != '':
t.append(word[xy: len(word)])
t.extend('0')
c = [b for b in nltk.bigrams(t)]
return c
from random import choice; def random_int(word): return choice(range(len(word))) + 1
- person colidyre   schedule 02.10.2015