Если у вас есть список допустимых распространенных слов (их можно найти в Интернете для разных языков), вы можете получить все префиксы, проверить, являются ли они допустимым словом, и рекурсивно повторить с остальной частью предложения. Используйте памятку для предотвращения избыточных вычислений с одинаковыми суффиксами.
Вот пример на Python. Аннотация lru_cache
добавляет памятку в функцию, так что предложение для каждого суффикса вычисляется только один раз, независимо от того, как была разбита первая часть. Обратите внимание, что words
является set
для поиска O (1). A Prefix-Tree тоже будет работать очень хорошо.
words = {"this", "his", "is", "only", "a", "at", "ate", "test",
"and", "here", "her", "is", "an", "other", "another",
"sent", "sentense", "tense", "and", "thousands", "more"}
max_len = max(map(len, words))
import functools
functools.lru_cache(None)
def find_sentences(text):
if len(text) == 0:
yield []
else:
for i in range(min(max_len, len(text)) + 1):
prefix, suffix = text[:i], text[i:]
if prefix in words:
for rest in find_sentences(suffix):
yield [prefix] + rest
mystring = 'thisisonlyatest. andhereisanothersentense'
for text in mystring.split(". "):
print(repr(text))
for sentence in find_sentences(text):
print(sentence)
Это даст вам список допустимых (но, возможно, бессмысленных) способов разбить предложение на слова. Их может быть достаточно мало, так что вы можете выбрать правильный вручную; в противном случае вам может понадобиться добавить еще один шаг постобработки, например, использование анализа части речи с надлежащей структурой НЛП.