# standard library imports from operator import attrgetter from typing import Union, Generator # third-party library imports from pandas import DataFrame from spacy.tokens import Token, Span, Doc def analyze_tokens( doclike: Union[Doc, Span], *attributes ) -> DataFrame: """ Example: `analyze_tokens(doc, 'like_num', 'lemma_', 'pos_', 'children', '_.custom')` """ columns = ('text', *attributes) data = ( ( (*attribute,) if isinstance(attribute, Generator) else attribute for attribute in attrgetter(*columns)(token) ) for token in doclike ) return DataFrame(data=data, columns=columns).T