def startswith(full_text: tuple, subphrase: tuple) -> int:
    """ Check that the specified text starts with the specified subphrase without considering of punctuation.

    Text and subphrase are tokenized, i.e. they are tuples of strings. Matching is realized recursively.

    :param full_text: a tokenized text (tuple of strings).
    :param subphrase: a tokenized subphrase (tuple of strings).
    :return: a number of text's words, which coincide with all subphrase's words.
    """
    n_full = len(full_text)
    n_sub = len(subphrase)
    if (n_sub == 0) or (n_full == 0):
        return 0
    if n_sub > n_full:
        return 0
    if ' '.join(full_text) == ' '.join(subphrase):
        return n_full
    if ' '.join(full_text[0:n_sub]) == ' '.join(subphrase):
        return n_sub
    if full_text[0].isalnum() and subphrase[0].isalnum():
        if full_text[0] != subphrase[0]:
            return 0
        res = startswith(full_text[1:], subphrase[1:])
        if res == 0:
            return 0
        return res + 1
    if (not full_text[0].isalnum()) and (not subphrase[0].isalnum()):
        if (n_full < 2) or (n_sub < 2):
            return 0
        res = startswith(full_text[1:], subphrase[1:])
        if res == 0:
            return 0
        return res + 1
    if full_text[0].isalnum():
        return startswith(full_text, subphrase[1:])
    res = startswith(full_text[1:], subphrase)
    if res == 0:
        return 0
    return res + 1