Нахождение слов словаря

Я не думаю, что существует собственный путь.

существует этот DOS util: Shortcut.exe .

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

я думаю, что более легкий путь будет состоять в том, чтобы перезаписать и/или создать новый файл.

у Вас есть доступ к этим системам через удаленную долю?

10
задан A. Levy 18 August 2009 в 04:21
поделиться

10 ответов

Я не уверен, сколько времени или частоты у вас есть для этого (это разовая операция? Ежедневно? еженедельно?), но вам, очевидно, понадобится быстрый, взвешенный поиск в словаре.

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

Я бы посмотрел на Tries . С его помощью вы можете эффективно находить (и взвешивать) свои префиксы, а это именно то, что вы будете искать.

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

Просто мозговой штурм, но если вы знаете, что ваш набор данных состоит в основном дуплетов или троек, вам, вероятно, удастся избежать нескольких поисков Trie, например, поиск «Spic», а затем «ejet», а затем обнаружение, что оба результата имеют низкий балл, отказаться от «Spice» и «Jet», где оба Попытки дадут хороший комбинированный результат между двумя.

8
ответ дан 3 December 2019 в 17:59
поделиться

Если цель состоит в том, чтобы найти «максимально возможное разбиение входных данных», как вы ответили, то алгоритм может быть довольно простым, если вы используете некоторую теорию графов. Вы берете составное слово и строите граф с вершиной до и после каждой буквы. У вас будет вершина для каждого индекса в строке и одна за концом. Затем вы найдете в своем словаре все допустимые слова, которые являются подстроками составного слова. Затем для каждой допустимой подстроки добавьте к графу ребро с весом 1, соединяющее вершину перед первой буквой в подстроке с вершиной после последней буквы в подстроке. Наконец, используйте алгоритм кратчайшего пути, чтобы найти путь с наименьшим количеством ребер между первой и последней вершиной.

Псевдокод выглядит примерно так:

parseWords(compoundWord)
    # Make the graph
    graph = makeGraph()
    N = compoundWord.length
    for index = 0 to N
        graph.addVertex(i)

    # Add the edges for each word
    for index = 0 to N - 1
        for length = 1 to min(N - index, MAX_WORD_LENGTH)
            potentialWord = compoundWord.substr(index, length)
            if dictionary.isElement(potentialWord)
                graph.addEdge(index, index + length, 1)

    # Now find a list of edges which define the shortest path
    edges = graph.shortestPath(0, N)

    # Change these edges back into words.
    result = makeList()
    for e in edges
        result.add(compoundWord.substr(e.start, e.stop - e.start + 1))
    return result

Я, очевидно, убежал ' t протестировал этот псевдокод, и могут быть отдельные ошибки индексации, и нет никакой проверки ошибок, но основная идея есть. Я делал что-то подобное в школе, и это сработало. Циклы создания ребер - это O (M * N), где N - длина составного слова, а M - максимальная длина слова в вашем словаре или N (в зависимости от того, что меньше). Время выполнения алгоритма кратчайшего пути будет зависеть от того, какой алгоритм вы выберете. На ум сразу приходит Дейкстры. Я думаю, что его время выполнения - O (N ^ 2 * log (N)), поскольку максимальное количество возможных ребер равно N ^ 2.

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

4
ответ дан 3 December 2019 в 17:59
поделиться

А как вы решите, как делить? Посмотрите в Интернете, и вы найдете примеры URL-адресов, которые, как оказалось, имели другое значение.

Предполагая, что у вас не было заглавных букв, что бы вы сделали с ними (те, которые приходят на ум в настоящее время, Я знаю, что их гораздо больше.):

PenIsland
KidsExchange
TherapistFinder

Последнее особенно проблематично, потому что проблемная часть состоит в том, что два слова, соединенные вместе, но не составное слово, значение полностью меняется, когда вы его нарушаете.

2
ответ дан 3 December 2019 в 17:59
поделиться

Итак, учитывая слово, является ли это составным словом, состоящим из двух других английских слов? У вас может быть какая-то таблица поиска для всех таких составных слов, но если вы просто изучите кандидатов и попытаетесь сопоставить их с английскими словами, вы получите ложные срабатывания.

Изменить: похоже, мне нужно будет привести несколько примеров. Слова, которые я придумал, включают:

accustomednesses != accustomed + nesses
adulthoods != adult + hoods
agreeabilities != agree + abilities
willingest != will + ingest
windlasses != wind + lasses
withstanding != with + standing
yourselves != yours + elves
zoomorphic != zoom + orphic
ambassadorships != ambassador + ships
allotropes != allot + ropes

Вот некоторый код на Python, который можно попробовать, чтобы понять суть. Возьмите себе словарь на диск и попробуйте:

from __future__ import with_statement

def opendict(dictionary=r"g:\words\words(3).txt"):
    with open(dictionary, "r") as f:
        return set(line.strip() for line in f)

if __name__ == '__main__':
    s = opendict()
    for word in sorted(s):
        if len(word) >= 10:
            for i in range(4, len(word)-4):
                left, right = word[:i], word[i:]
                if (left in s) and (right in s):
                    if right not in ('nesses', ):
                        print word, left, right
2
ответ дан 3 December 2019 в 17:59
поделиться

Мне кажется, вы хотите сохранить свой словарь в Trie или в структуре данных DAWG.

Trie уже хранит слова как составные слова. Таким образом, «spicejet» будет храниться как «spice jet », где * обозначает конец слова. Все, что вам нужно сделать, это найти составное слово в словаре и отслеживать, сколько терминаторов в конце слова вы попали. Оттуда вам нужно будет попробовать каждую подстроку (в этом примере мы еще не знаем, является ли слово «jet» словом, поэтому нам придется искать это).

2
ответ дан 3 December 2019 в 17:59
поделиться

Недавно был задан аналогичный вопрос: Алгоритм разделения слов . Если вы хотите ограничить количество разбиений, вы должны отслеживать количество разбиений в каждом из кортежей (поэтому вместо пары, тройки).

1
ответ дан 3 December 2019 в 17:59
поделиться

Существование слова может быть выполнено с помощью дерева или, проще говоря, с помощью набора (например, хеш-таблицы). Имея подходящую функцию, вы могли бы сделать:

# python-ish pseudocode
def splitword(word):
    # word is a character array indexed from 0..n-1

    for i from 1 to n-1:
        head = word[:i]  # first i characters
        tail = word[i:]  # everything else

        if is_word(head):
            if i == n-1:
                return [head]   # this was the only valid word; return it as a 1-element list
            else:
                rest = splitword(tail)
                if rest != []:   # check whether we successfully split the tail into words
                    return [head] + rest

    return []  # No successful split found, and 'word' is not a word.

В принципе, просто попробуйте разные точки останова, чтобы увидеть, сможем ли мы составить слова. Рекурсия означает, что он будет возвращаться, пока не будет найдено успешное разбиение.

Конечно, это может не найти нужных вам разбиений. Вы можете изменить это так, чтобы возвращать все возможные разбиения (а не только первое найденное), а затем вычислять какую-то взвешенную сумму, возможно, чтобы предпочесть общие слова необычным словам.

1
ответ дан 3 December 2019 в 17:59
поделиться

Я бы используйте следующий алгоритм.

  1. Начните с отсортированного списка слов разделить и отсортированный список отклоненные слова (словарь).

  2. Создать список результатов объектов который должен хранить: оставшееся слово и список совпадающих слов.

  3. Заполните список результатов словами для разделения на оставшиеся слова.

  4. Просмотрите массив результатов и словарь одновременно - всегда увеличивая наименьшее из два, аналогично алгоритм слияния. Таким образом вы можете сравнить все возможные соответствия пар за один проход.

  5. Каждый раз, когда вы находите совпадение, т.е. разделить слова слово, которое начинается с словарное слово, замените соответствующее словарное слово и оставшаяся часть в списке результатов. Вы должны принять во внимание возможные кратные.

  6. Каждый раз, когда оставшаяся часть пуста, вы нашли окончательный результат.

  7. Каждый раз, когда вы не можете найти совпадение на «левая сторона», другими словами, каждый раз, когда вы увеличиваете результат указатель из-за отсутствия совпадения, удалить соответствующий элемент результата. Эта слово не имеет совпадений и не может быть split.

  8. Как только вы доберетесь до основания списки, у вас будет список частичные результаты. Повторить цикл пока он не станет пустым - переходите к пункту 4.

0
ответ дан 3 December 2019 в 17:59
поделиться

Мне пришло в голову, что в любом разумном составном слове есть относительно небольшое количество подстрок (минимальная длина 2). Например, для "spicejet" я получаю:

'sp', 'pi', 'ic', 'ce', 'ej', 'je', 'et',
'spi', 'pic', 'ice', 'cej', 'eje', 'jet',
'spic', 'pice', 'icej', 'ceje', 'ejet',
'spice', 'picej', 'iceje', 'cejet',
'spicej', 'piceje', 'icejet',
'spiceje' 'picejet'

... 26 подстрок.

Итак, найдите функцию для генерации всех этих строк (проведите по вашей строке, используя шаги 2, 3, 4 ... ( len (yourstring) - 1) , а затем просто проверьте каждый из них в наборе или хеш-таблице.

1
ответ дан 3 December 2019 в 17:59
поделиться

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

Мы сталкиваемся именно с этой проблемой в химии, где имена составлены путем конкатенации морфем. Пример:

ethylmethylketone

, где морфемы:

ethyl methyl and ketone

Мы решаем эту проблему с помощью автоматов и максимальной энтропии, и код доступен на Sourceforge

http://www.sf.net/projects/oscar3-chem

, но предупреждаем, что это потребует некоторой работы.

Иногда мы сталкиваемся с двусмысленностью. и до сих пор находят хороший способ сообщить об этом.

Чтобы различать penIsland и penisLand, потребуется эвристика, специфичная для предметной области. Вероятная интерпретация будет зависеть от используемого корпуса - никакая лингвистическая проблема не зависит от анализируемой области или областей.

В качестве другого примера строка

weeknight

может быть проанализирована как

wee knight

или

week night

Обе они «правильны» в том смысле, что они подчиняются форме «прил-существительное» или «существительное-существительное». Оба имеют «смысл», и выбор будет зависеть от области использования. В фэнтези-игре первое более вероятно, а в коммерции - второе. Если у вас есть проблемы такого рода, будет полезно иметь корпус согласованного использования, который был аннотирован экспертами (технически «золотой стандарт» в обработке естественного языка).

1
ответ дан 3 December 2019 в 17:59
поделиться
Другие вопросы по тегам:

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