Сегментация текста с использованием пакета слов Python - PullRequest
0 голосов
/ 30 ноября 2018

Народ,

Я использую библиотеку Python wordsegment от Гранта Дженкса в течение последних нескольких часов.Библиотека прекрасно работает для любых неполных слов или для разделения комбинированных слов, таких как e nd ==> end и thisisacat ==> this is a cat.

Я работаю над текстовыми данными, которые также включают числа, и использование этой библиотеки для этих текстовых данных имеет обратный эффект.Прекрасный текст increased $55 million or 23.8% for преобразуется во что-то очень странное increased 55millionor238 for (после выполнения операции соединения в списке с перенастройкой).Обратите внимание, что это происходит случайным образом (может произойти или не произойти) для любой части текста, которая включает числа.

  • Кто-нибудь работал с этой библиотекой раньше?
  • Если да, сталкивались ли вы с подобной ситуацией и нашли ли вы обходной путь?
  • Если нет, знаете ли вы какие-либо другие библиотеки Python, которые делают этот трюк для нас?

Спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Глядя на код, сначала запускается функция segment clean, которая удаляет все не алфавитно-цифровые символы, затем ищет известные надписи и биграммы в скоплении текста и оценивает найденные слова на основе частоты их появления.появление на английском.

'increased $55 million or 23.8% for'

становится

'increased55millionor238for'

При поиске подслов он находит 'increased' и 'for', но оценка для неизвестной фразы '55millionor238' лучше, чемоценка по какой-то причине.

Кажется, что лучше с неизвестным текстом, особенно с меньшими неизвестными текстовыми элементами.Вы можете заменить не алфавитные последовательности символов, пропустить через segment, а затем вернуть обратно.

import re
from random import choices

CONS = 'bdghjklmpqvwxz'

def sub_map(s, mapping):
    out = s
    for k,v in mapping.items():
        out = out.replace(k,v)
    return out

mapping = {m.group():''.join(choices(cons, k=3)) for m 
           in re.finditer(r'[0-9\.,$%]+', s)}
revmap = {v:k for k,v in mapping.items()}
word_list = wordsegment.segment(sub_map(s, mapping))
word_list = [revmap.get(w,w) for w in word_list]
word_list
# returns:
['increased', '$55', 'million', 'or', '23.8%', 'for']    
...