Лучший алгоритм для индексации предложений

Проблема заключается в автоматическом обертывании артефакта org.asynchttpclient/async-http-client.

Обтекание по умолчанию делает все предложения Import-Package необязательными, что иногда затрудняет создание надежной проводной установки, потому что, когда средство распознавания смотрит на упакованный пакет, прежде чем смотреть на те, которые экспортируют «дополнительные» пакеты, они не будут соедините вместе, и поскольку они не являются обязательными, распознаватель с радостью пропустит их, даже если они появятся через микросекунду позже.

Чтобы проверить это, вы можете bundle:refresh установить пакеты async-http-client и посмотреть bundle:tree-show , все ли еще пакеты не подключены (пометить как WARNING).

Чтобы надежно исправить это, вы можете создать свою собственную функцию на основе официальной функции Apache Camel и изменить упаковку, чтобы сделать определенные импорты обязательными (например, добавить &Import-Package=org.reactivestreams,*;resolution:=optional к выражению wrap:).

Также взгляните на протокол обтекания .

5
задан ergosys 8 February 2012 в 08:06
поделиться

7 ответов

Этот oughta получает Вас близко в C#:

class Program
{
    public class Node
    {
        private string _term;
        private Dictionary<string, KeyValuePair<Node, Node>> _related = new Dictionary<string, KeyValuePair<Node, Node>>();

        public Node(string term)
        {
            _term = term;
        }

        public void Add(string phrase, Node previous, string [] phraseRemainder, Dictionary<string,Node> existing)
        {
            Node next= null;
            if (phraseRemainder.Length > 0)
            {
                if (!existing.TryGetValue(phraseRemainder[0], out next))
                {
                    existing[phraseRemainder[0]] = next = new Node(phraseRemainder[0]);
                }
                next.Add(phrase, this, phraseRemainder.Skip(1).ToArray(), existing);
            }
            _related.Add(phrase, new KeyValuePair<Node, Node>(previous, next));

        }
    }


    static void Main(string[] args)
    {
        string [] sentences = 
            new string [] { 
                "The beautiful sky",
                "Beautiful sky dream",
                "beautiful dream"
            };

        Dictionary<string, Node> parsedSentences = new Dictionary<string,Node>();

        foreach(string sentence in sentences)
        {
            string [] words = sentence.ToLowerInvariant().Split(' ');
            Node startNode;
            if (!parsedSentences.TryGetValue(words[0],out startNode))
            {
                parsedSentences[words[0]] = startNode = new Node(words[0]);
            }
            if (words.Length > 1)
                startNode.Add(sentence,null,words.Skip(1).ToArray(),parsedSentences);
        }
    }
}

Я брал на себя смелость предположения, что Вы хотели сохранить фактическую начальную фразу. В конце этого у Вас будет список слов во фразах, и в каждом, списке фраз, которые используют то слово со ссылками на следующие и предыдущие слова в каждой фразе.

0
ответ дан 14 December 2019 в 19:25
поделиться

Короткий ответ

Создайте структуру с двумя векторами предыдущих / прямых каналов. Затем сохраните структуры слова в хеш-таблице с ключом как само слово.

Длинный ответ

Это - лингвистическая проблема парсинга, которая легко не решена, если Вы не возражаете против мусора.

  1. Я перешел к баскетбольной площадке парка.
  2. Вы парковали бы автомобиль.

Ваше соединение алгоритма создаст предложения как:

  1. Я перешел к парку автомобиль.
  2. Вы парковали бы баскетбольную площадку.

Я не совсем уверен в приложениях SEO этого, но я не приветствовал бы другой сайт спама мусора, поднимающий результат поиска.

5
ответ дан 14 December 2019 в 19:25
поделиться

Это похоже на него, мог быть сохранен в очень простой базе данных со следующими таблицами:

Words:
    Id     integer primary-key
    Word   varchar(20)
Following:
    WordId1 integer foreign-key Words(Id) indexed
    WordId2 integer foreign-key Words(Id) indexed

Затем каждый раз, когда Вы разбираете предложение, просто вводите тех, которые уже не являются там, следующим образом:

The beautiful sky.
    Words (1,'the')
    Words (2, 'beautiful')
    Words (3,, 'sky')
    Following (1, 2)
    Following (2, 3)
Beautiful sky dream.
    Words (4, 'dream')
    Following (3, 4)
Beautiful dream.
    Following (2, 4)

Затем можно запросить к содержанию основ на том, какие слова следуют или предшествуют другим словам.

1
ответ дан 14 December 2019 в 19:25
поделиться

Используя ассоциативный массив позволит Вам быстро разбирать предложения в Perl. Это намного быстрее, чем Вы ожидали бы, и это может быть эффективно разгружено в дереве как структура для последующего использования высокоуровневым языком.

0
ответ дан 14 December 2019 в 19:25
поделиться

Я предполагаю, что Вы хотели бы своего рода структуру Инвертированного индекса. У Вас был бы Hashmap со словами как ключи, указывающие на списки пар формы (sentence_id, position). Вы затем сохранили бы свои предложения как массивы или связанные списки. Ваш пример был бы похож на это:

sentence[0] = ['the','beautiful', 'sky'];
sentence[1] = ['beautiful','sky', 'dream'];
sentence[2] = ['beautiful', 'dream'];

inverted_index = 
{
 'the': {(0,0)},
 'beautiful': {(0,1), (1,0), (2,0)},
 'sky' : {(0,2),(1,1)},
 'dream':{(1,2), (2,1)}
};

Используя эту структуру поиски на словах могут быть сделаны в постоянное время. Определение слова, которое Вы хотите, находя предыдущее и последующее слово в данном предложении, может также быть сделано в постоянное время.

Надеюсь, это поможет.

2
ответ дан 14 December 2019 в 19:25
поделиться

Алгоритмы поиска по дереву (как BST, ect)

-4
ответ дан 14 December 2019 в 19:25
поделиться

Можно попытаться вырыть в Цепи Маркова, сформированные из слов предложений. Также Вы потребуете двусторонней цепочки (т.е. найти следующие и предыдущие слова), т.е. сохраните вероятные слова, которые появляются сразу после данного или незадолго до нее.

Конечно, Цепь Маркова является стохастическим процессом для генерации содержания, однако аналогичный подход может использоваться, чтобы хранить информацию, в которой Вы нуждаетесь.

1
ответ дан 14 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: