Обнаружьте наиболее вероятные слова из текста без пробелов / объединенные слова

Существует ли хорошая библиотека, может обнаружить и разделить слова от объединенной строки?

Пример:

"cdimage" -> ["cd", "image"]
"filesaveas" -> ["file", "save", "as"]
12
задан Dan Dascalescu 17 April 2014 в 08:30
поделиться

5 ответов

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

WORD_FREQUENCIES = {
    'file': 0.00123,
    'files': 0.00124,
    'save': 0.002,
    'ave': 0.00001,
    'as': 0.00555
}

def split_text(text, word_frequencies, cache):
    if text in cache:
        return cache[text]
    if not text:
        return 1, []
    best_freq, best_split = 0, []
    for i in xrange(1, len(text) + 1):
        word, remainder = text[:i], text[i:]
        freq = word_frequencies.get(word, None)
        if freq:
            remainder_freq, remainder = split_text(
                    remainder, word_frequencies, cache)
            freq *= remainder_freq
            if freq > best_freq:
                best_freq = freq
                best_split = [word] + remainder
    cache[text] = (best_freq, best_split)
    return cache[text]

print split_text('filesaveas', WORD_FREQUENCIES, {})

--> (1.3653e-08, ['file', 'save', 'as'])
11
ответ дан 2 December 2019 в 07:02
поделиться

Существуют инструменты для преобразования сборки .NET в автономный исполняемый файл или библиотеку, чтобы клиентам не требовалась рамка .NET. Это также в некоторой степени защищает ваш код от обратного проектирования - вы не можете использовать Reflector для просмотра источника .NET в собственном двоичном файле.

См., например, Remotesoft Salamander .NET Protector .

Но, это не строго C # - > native; Salamander преобразует MSIL в собственный код.

С другой стороны, существует по крайней мере один академический проект по созданию собственного компилятора C # - > с использованием LLVM, называемого LLVM #.

-121--1858960-

Иногда мы любим использовать объекты в качестве словарных ключей

Для чего стоит, кортежи недавно (2,6 +) выросли index () и count () методы

-121--2014927-

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

  1. Получение списка слов, например, слов UNIX .
  2. Поместите содержимое списка слов в трие.
  3. Возьмите последовательность, которую хотите разделить, и следуйте по ее пути в трие. Каждый раз, когда вы достигаете допустимого слова, создайте новую ветвь, которая ищет слово, начиная с точки последовательности, к которой вы попали. Как только вы закончите текущую ветвь, вернитесь к той, которую вы создали, как в глубоком первом поиске.
  4. Разбиение полученных списков вручную с помощью эвристики или синтаксического анализатора естественного языка.

Пример:

  1. Слово: «filesaveasstring»
  2. Первое допустимое слово - «file». Попробуйте сопоставить «saveas». Первое допустимое слово - «save». Попробуйте сопоставить «asstring». Первое допустимое слово - «as». Попробуйте сопоставить «string». Первое допустимое слово - «string». Соответствует до конца; поместите [файл сохранить как последовательность] в список результатов.
  3. Обратная связь с соответствующей «последовательностью» - других возможностей нет. Назад к «asstring.» Первое незамеченное допустимое слово - «задница». Попробуйте сопоставить «tring». Никаких возможных совпадений. Назад к «asstring.» Никаких возможных совпадений. Возврат к «filesaveasstring».
  4. Первое непосещаемое совпадение - «files». Попробуйте соответствовать «aveasstring». Первый матч - «аве». Попробуйте сопоставить «asstring» (те же результаты, что и в шагах 2/3), добавив [files ave as string] в перечислять результатов и выполните обратную трассировку к началу.
  5. Попробуйте сопоставить «filesaveasstring». Без посещений. Готово.
  6. Выберите наиболее вероятный из [[file save as string] [files ave as string]] с помощью эвристического или естественного синтаксического анализатора.
8
ответ дан 2 December 2019 в 07:02
поделиться
[11318819-

Если вы не делаете это для удовольствия, но на самом деле делают что-то для работы и т. Д., Мой совет должен решать это на источнике. Почему у вас есть эти строки в сочетании? Где вы взяли эти строки? Если это возможно, вставьте пробелы в источнике, откуда эти строки.

-1
ответ дан 2 December 2019 в 07:02
поделиться

Не знаю ни одной библиотеки, которая бы это делала, но написать не так уж и сложно, если у вас есть список слов:

wordList = file('words.txt','r').read().split()
words = set( s.lower() for s in wordList )

def splitString(s):
    found = []

    def rec(stringLeft, wordsSoFar):
        if not stringLeft:
            found.append(wordsSoFar)
        for pos in xrange(1, len(stringLeft)+1):
            if stringLeft[:pos] in words:
                rec(stringLeft[pos:], wordsSoFar + [stringLeft[:pos]])

    rec(s.lower(), [])
    return found

Это вернет все возможные способы разбиения строки на заданные слова.

Example:

>>> splitString('filesaveas')
[['file', 'save', 'as'], ['files', 'ave', 'as']]
2
ответ дан 2 December 2019 в 07:02
поделиться

Заставьте людей решать их в виде капчи на вашем сайте :)

.
3
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

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