перевести, заменив слова внутри существующего текста - PullRequest
1 голос
/ 09 февраля 2010

Каковы общие подходы к переводу определенных слов (или выражений) внутри данного текста, когда текст должен быть реконструирован (с пунктуацией и всем).

Перевод взят из справочной таблицы и охватывает слова, словосочетания и смайлики, такие как L33t, CUL8R, :-) и т. Д.

Недостаточно просто найти и заменить строку, так как она может заменить часть более длинных слов (cat> dog ≠> caterpillar> dogerpillar).

Допустим следующий ввод:

s = "dogbert, started a dilbert dilbertion proces cat-bert :-)"

после перевода я должен получить что-то вроде:

result = " anna , начался george dilbertion process cat-bert smiley "

Я не могу просто токенизировать, так как теряю знаки препинания и положения слов .

Регулярные выражения, работают для обычных слов, но не ловят специальные выражения, такие как смайлик :-), но это так.

re.sub(r'\bword\b','translation',s) ==> translation
re.sub(r'\b:-\)\b','smiley',s) ==> :-)

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

(p.s. Я использую Python)

Ответы [ 4 ]

1 голос
/ 09 февраля 2010

Причина, по которой ваш пример смайлика не работает с регулярным выражением, в том, что \ b относится к границе слова. Поскольку в смайлике нет символов «слово», нет границы слова, поэтому ваше выражение не совпадает. Вы можете использовать lookaheads / lookbehinds, чтобы увидеть, ограничены ли вы пробелами, но проверить на пунктуацию может быть сложно, учитывая, что ваши смайлики сделаны из знаков препинания.

0 голосов
/ 01 января 2011

У меня была похожая проблема со стандартными смайликами, которые нужно заменить значениями. Здесь - список смайликов. У меня они были в виде простого текстового файла (чтобы я мог добавлять / удалять его, как и когда это необходимо), разделенных вкладкой, как.

:[        -1
:/        -1
:(          -1
:)         1

Тогда прочитайте это в словарь

emoticons = {}          
for line in open('data/emoticons.txt').xreadlines():   
        symbol, value = line.split('\t')                                           
        emoticons[str(symbol)] = int(value)

Тогда функция поиска

def mark_emoticons(t):
    for w, v in emoticons.items():
        match = re.search(re.escape(w),t)
            if match:
                print w, "found "

Вызовите функцию с помощью

mark_emoticons('Hello ladies! How are you? Fantastic :) Look at your man ...')

Что касается L33t-речь, у меня есть отдельный файл slangs.txt, который выглядит как

u   you
ur  you are
uw  you are welcome 
wb  welcome back 
wfm works for me 
wtf what the fuck

Аналогичная функция для чтения словаря сленга {} и аналогичная функция для замены сленга.

def mark_slangs(t):        
    for w, v in slangs.items():
            s = r'\b' + w + r'\b'
            match = re.search(s,t)
            if match:
                    #print w, "found in:",t, "replacing with",readtable.slangs[w]
                    t = re.sub(w,slangs[w].rstrip(),t)
                    ...

Из Библиотека Python the re.escape ()

re.escape (строка) Вернуть строку с все не алфавитно-цифровые символы с обратной косой чертой; это полезно, если вы хотите соответствовать произвольная буквенная строка, которая может иметь метасимволы регулярных выражений в это.

В зависимости от ваших потребностей вы можете использовать re.findall ()

0 голосов
/ 09 февраля 2010

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

Приготовление:

  • Создать словарь, связывающий слова подлежит замене на их замену.
  • Создайте троичное дерево слов для подлежит замене.

Поиск и замена:

  1. Разделить слова на пробелы, используя split (). Я использую термин слово для обозначения группы букв, которая не содержит пробела.
  2. Перебрать все слова
    1. Поиск слова в троичном дереве - если найдено частичное совпадение, проверьте, что остальная часть слова является пунктуацией (или, по крайней мере, не тем, что делает его не совпадающим).
    2. Заменить слово, используя словарь поиска, если оно было найдено в троичном дереве

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

0 голосов
/ 09 февраля 2010

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

Граница слова \b описывается в документации по питону следующим образом:

Соответствует пустой строке, но только в начале или конце слова. Слово определяется как последовательность буквенно-цифровых символов Unicode или символов подчеркивания, поэтому конец слова обозначается пробелом или не алфавитно-цифровым символом Unicode. Обратите внимание, что формально, \ b определяется как граница между символами \ w и \ W (или наоборот).

Проблема теперь в том, что такие символы, как :, - и ) сами по себе являются границами слов, поэтому они, в частности, не слова и поэтому не будут совпадать с \w. Таким образом, пространство перед смайликом не распознается как граница слова (просто потому, что ни одно слово не следует).

Так что, если вы хотите сопоставить смайлики, вы не можете использовать \b, но вместо этого вам нужно проверить наличие пробелов или чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...