Разделите слова в предложении для задачи классификации текста - PullRequest
0 голосов
/ 22 апреля 2020

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

Один из примеров, который я нашел при аннотировании моей точки данных:

Через многочисленные приобретения и переходы, Anacompstillexiststodaywithagreaterfocusondocumentmanagement

Желаемый результат:

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

Я изучил различные фреймворки, такие как Keras, PyTorch, чтобы выяснить, предоставляют ли они какую-либо функциональность для решения этой проблемы, но я не смог ничего найти.

1 Ответ

2 голосов
/ 22 апреля 2020

Проблема, которую вы пытаетесь решить, - это сегментирование текста / слова. Можно приблизиться к этому на основе ML, используя модель последовательности (такую ​​как LSTM) и вложение слова (такое как BERT).

Эта ссылка подробно описывает такой подход для китайского языка. В китайском языке не используются пробелы, поэтому такой подход необходим в качестве компонента предварительной обработки в задачах обработки китайского НЛП.

Я хотел бы описать автоматный подход с использованием Aho-Corasick Algorithm .

Сначала выполните pip install pyahocorasick

Я использую только слова во входной строке для демонстрации. В сценарии реального мира вы можете просто использовать словарь слов, например, Wor dnet.

import ahocorasick

automaton = ahocorasick.Automaton()

input = 'Throughnumerousacquisitionsandtransitions, Anacompstillexiststodaywithagreaterfocusondocumentmanagement'

# Replace this with a large dictionary of words
word_dictionary = ['Through', 'numerous', 'acquisition', 'acquisitions', 'and', 'transitions', 'Anacomp', 'still',
                   'exists', 'today', 'with', 'a', 'greater', 'focus', 'on', 'document', 'management']

# add dictionary words to automaton
for idx, key in enumerate(word_dictionary):
    automaton.add_word(key, (idx, key))

# Build aho-corasick automaton for search
automaton.make_automaton()

# to check for ambiguity, if there is a longer match then prefer that
previous_rng = range(0, 0)
previous_rs = set(previous_rng)

# Holds the end result dictionary
result = {}

# search the inputs using automaton
for end_index, (insert_order, original_value) in automaton.iter(input):
    start_index = end_index - len(original_value) + 1
    current_rng = range(start_index, end_index)
    current_rs = set(current_rng)
    # ignore previous as there is a longer match available
    if previous_rs.issubset(current_rs):
        # remove ambiguous short entry in favour of the longer entry
        if previous_rng in result:
            del result[previous_rng]
        result[current_rng] = (insert_order, original_value)
        previous_rng = current_rng
        previous_rs = current_rs
    # if there is no overlap of indices, then its a new token, add to result
    elif previous_rs.isdisjoint(current_rs):
        previous_rng = current_rng
        previous_rs = current_rs
        result[current_rng] = (insert_order, original_value)
    # ignore current as it is a subset of previous
    else:
        continue
    assert input[start_index:start_index + len(original_value)] == original_value

for x in result:
    print(x, result[x])

Производит результаты:

range(0, 6) (0, 'Through')
range(7, 14) (1, 'numerous')
range(15, 26) (3, 'acquisitions')
range(27, 29) (4, 'and')
range(30, 40) (5, 'transitions')
range(43, 49) (6, 'Anacomp')
range(50, 54) (7, 'still')
range(55, 60) (8, 'exists')
range(61, 65) (9, 'today')
range(66, 69) (10, 'with')
range(71, 77) (12, 'greater')
range(78, 82) (13, 'focus')
range(83, 84) (14, 'on')
range(85, 92) (15, 'document')
range(93, 102) (16, 'management')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...