Проблема заключается в автоматическом обертывании артефакта 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:
).
Также взгляните на протокол обтекания .
Этот 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);
}
}
}
Я брал на себя смелость предположения, что Вы хотели сохранить фактическую начальную фразу. В конце этого у Вас будет список слов во фразах, и в каждом, списке фраз, которые используют то слово со ссылками на следующие и предыдущие слова в каждой фразе.
Короткий ответ
Создайте структуру с двумя векторами предыдущих / прямых каналов. Затем сохраните структуры слова в хеш-таблице с ключом как само слово.
Длинный ответ
Это - лингвистическая проблема парсинга, которая легко не решена, если Вы не возражаете против мусора.
Ваше соединение алгоритма создаст предложения как:
Я не совсем уверен в приложениях SEO этого, но я не приветствовал бы другой сайт спама мусора, поднимающий результат поиска.
Это похоже на него, мог быть сохранен в очень простой базе данных со следующими таблицами:
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)
Затем можно запросить к содержанию основ на том, какие слова следуют или предшествуют другим словам.
Используя ассоциативный массив позволит Вам быстро разбирать предложения в Perl. Это намного быстрее, чем Вы ожидали бы, и это может быть эффективно разгружено в дереве как структура для последующего использования высокоуровневым языком.
Я предполагаю, что Вы хотели бы своего рода структуру Инвертированного индекса. У Вас был бы 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)}
};
Используя эту структуру поиски на словах могут быть сделаны в постоянное время. Определение слова, которое Вы хотите, находя предыдущее и последующее слово в данном предложении, может также быть сделано в постоянное время.
Надеюсь, это поможет.
Можно попытаться вырыть в Цепи Маркова, сформированные из слов предложений. Также Вы потребуете двусторонней цепочки (т.е. найти следующие и предыдущие слова), т.е. сохраните вероятные слова, которые появляются сразу после данного или незадолго до нее.
Конечно, Цепь Маркова является стохастическим процессом для генерации содержания, однако аналогичный подход может использоваться, чтобы хранить информацию, в которой Вы нуждаетесь.