Есть ли библиотека Python для пользовательского автозаполнения? - PullRequest
2 голосов
/ 27 июля 2011

Существует ли универсальная библиотека, которая позволила бы мне выполнять автозаполнение согласно пользовательской грамматике и списку предметов? Вот пример того, что я ищу.

Грамматика:

  • Вы можете жевать яблоки и манго
  • Можно пить молоко и воду
  • Вы можете переместить все
  • Структура предложения: глагол [+ прилагательное] + объект

Детали:

  • 1 зеленое яблоко
  • 1 микроскопическое яблоко
  • 1 зеленый манго
  • 1 желтое манго
  • 1 манго [цвет не указан]
  • 1 молоко
  • 1 вода

Ожидаемое поведение (ввод пользователя в первой строке, предложения во второй)

m
move, munch

mo
move

move g
move green apple, move green mango

move y
move yellow mango

move m
move milk, move mango, move microscopic apple

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

Я наконец нашел приемлемое решение, используя комбинацию SPARK (для анализа грамматики / синтаксического анализа) и моего собственного кода для автозаполнения.

О SPARK

SPARK означает набор для сканирования, анализа и перезаписи.Раньше у него не было названия, и его называли «маленькой языковой структурой».Первая версия (около 1998 г.) была описана в статье Компиляция небольших языков в Python на 7-й Международной конференции по Python.

SPARK написан на 100% чистом языке Python и доступен какс открытым исходным кодом.

Код автозаполнения

В следующем коде:

  • category - это слово, которое мыавтозаполнение.Это получается путем анализа текущей командной строки.Например: если пользователь печатает "drink m" , синтаксический анализатор будет ожидать слово в категории "жидкости", определенной в грамматике.
  • Пользовательский ввод хранится вlist (self.chars)
  • _get_list_of_existing() возвращает список существующих слов в данной категории
  • _get_common_beginning() return - если доступно - самая длинная начальная суперпоследовательность для нескольких совпадений.Например, если пользовательский ввод пишет "ma" и возможными словами автозаполнения являются [магнолия, увеличительное стекло] , _get_common_beginning() вернет "magn" .

Вот соответствующие фрагменты кода:

def autocomplete(self, category):
    '''
    If possible, autocomplete a word according to its category.
    '''
    root = ''.join(self.chars).split()[-1]  #The bit after the last space
    pool = self._get_list_of_existing(category)
    matches = [i for i in pool if i.find(root) == 0]
    if len(matches) == 1:
        match = matches[0]+' '
    elif len(matches) > 1:
        match = self._get_common_beginning(matches)
    else:
        return
    self.chars.extend(list(match[len(root):]))

def _get_common_beginning(self, strings):
    '''
    Return the strings that is common to the beginning of each string in
    the strings list.
    '''
    result = []
    limit = min([len(s) for s in strings])
    for i in range(limit):
        chs = set([s[i] for s in strings])
        if len(chs) == 1:
            result.append(chs.pop())
        else:
            break
    return ''.join(result)
2 голосов
/ 27 июля 2011

Один модуль для автозаполнения, который мне известен, это QCompleter Qt, который вы можете использовать в Python через PyQt или PySide.Я не думаю, что он понимает грамматику так, как вы имеете в виду, но он достаточно универсален, чтобы позволить вам писать код, который это делает.

...