"""N-Gram module.""" """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ __author__ = "Théo de la Hogue" __credits__ = [] __copyright__ = "Copyright 2023, Ecole Nationale de l'Aviation Civile (ENAC)" __license__ = "GPLv3" from argaze import GazeFeatures, DataFeatures class AOIScanPathAnalyzer(GazeFeatures.AOIScanPathAnalyzer): """Implementation of N-Gram algorithm as proposed in: **Lounis C., Peysakhovich V., Causse M. (2021).** *Visual scanning strategies in the cockpit are modulated by pilots’ expertise: A flight simulator study.* PLoS ONE (16(2), 6). [https://doi.org/10.1371/journal.pone.0247061](https://doi.org/10.1371/journal.pone.0247061) """ @DataFeatures.PipelineStepInit def __init__(self, **kwargs): # Init AOIScanPathAnalyzer class super().__init__() self.__n_min = 2 self.__n_max = 2 self.__ngrams_count = {} @property def n_min(self) -> int: """Minimal grams length to search.""" return self.__n_min @n_min.setter def n_min(self, n_min: int): self.__n_min = n_min @property def n_max(self) -> int: """Maximal grams length to search.""" return self.__n_max @n_max.setter def n_max(self, n_max: int): self.__n_max = n_max @DataFeatures.PipelineStepMethod def analyze(self, aoi_scan_path: GazeFeatures.AOIScanPath): assert(len(aoi_scan_path) > 1) sequence = aoi_scan_path.letter_sequence self.__ngrams_count = {} for n in range(self.n_min, self.n_max + 1): ngrams = zip(*[sequence[i:] for i in range(n)]) ngrams = [ngram for ngram in ngrams] self.__ngrams_count[n] = {tuple([aoi_scan_path.get_letter_aoi(l) for l in ngram]) : ngrams.count(ngram) for ngram in ngrams} @property def ngrams_count(self) -> dict: """N-Grams count.""" return self.__ngrams_count