Самые популярные подстроки - PullRequest
2 голосов
/ 14 октября 2010

Я пытаюсь разобрать большое количество коротких строк на несколько логических частей. Это кажется интересной проблемой, которую кто-то уже мог решить, но я не могу найти какие-либо документы / решения (или, возможно, я пытаюсь использовать неправильные ключевые слова).

Струны состоят из 2-5 частей. Если бы я заменил каждое слово буквой, в которой говорилось бы, к какой «части» / «части» оно принадлежит, вот их пример:

AAABB
AABBBBCC
AABBBBDD
AAACCDD
...

Большинство "разделов" имеют длину всего 2-3 слова, и ~ 100-500 вхождений точно такого же раздела в ~ 10 тыс. Строк. Это означает, что AAA == «некоторый текст здесь» в 100 строках и AAA == «некоторый другой текст» в других 100. В одной строке может быть только один раздел каждого типа (и они обычно идут по порядку). Для любого раздела не существует ограниченного набора значений, и в будущем могут появиться новые значения.

Проблема заключается в следующем: как обнаружить такие секции, если у меня достаточно образцов и я не хочу отмечать их вручную? Это может контролироваться / подтверждаться, но не полностью автоматически, поэтому список вероятностей в порядке.

Я думал о том, чтобы просто составить список из 2-5 длинных слов n-грамм и найти вероятность, но это не учитывает порядок (что может быть полезным). Он также обнаружит, что какой-то текст является общим, но если у меня есть несколько конкретных двух разделов с часто используемыми одинаковыми значениями, этот метод не будет работать хорошо. Допустим, у меня есть только строки, которые состоят из ABCD с одинаковыми значениями в каждой строке:

ABC
ABD
ACD

Выполняя только анализ ngram, я с большой вероятностью буду считать A сечением, а также AB, C и D. Я бы хотел исключить AB из результатов в этом случае, но так, чтобы это не t присваивать собственный раздел таким словам, как «the», и исключать все более крупные разделы, в которых есть «the».

Есть ли известные решения для подобных проблем?

1 Ответ

1 голос
/ 14 октября 2010

Алгоритм Lempel-Ziv-Welch очень эффективен при определении общих подстрок, но не пытается их ранжировать. Он также не обращает внимания на границы слов или строк. Тем не менее, можно использовать его в качестве отправной точки, чтобы получить то, что вам нужно.

...