Глядя на код, сначала запускается функция 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']