2010-02-08 2 views
1

Что такое общие подходы к переводу определенных слов (или выражений) внутри заданного текста, когда текст должен быть восстановлен (с пунктуациями и каждым)?перевод, заменяя слова внутри существующего текста

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

Простая строка поиска и замены не достаточно, так как он может заменить часть более длинных слов (кошка> собака ≠> гусеница> собачонка).

Предположит следующий вход:

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

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

результата = "анны, начал джордж dilbertion процесса кошку-Bert смайлик "

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

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

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

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

(постскриптум я использую Python)

+0

ок. так вы знаете о «школьном решении» для такой проблемы? –

ответ

0

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

:[  -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 library re.escape()

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

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

+0

С тех пор я создал сложный алгоритм, который токенизирует пару раз и заменяет bot hby string-replace nad regex, и каждая категория обрабатывается на определенном этапе. и тогда я ушел с работы. 10x в любом случае –

1

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

0

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

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

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

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

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

+1

Более конкретно ':', '-' и' ('НЕ являются границами слов, а не являются символами слов. Поэтому позиция МЕЖДУ одним из этих символов и символом слова является границей. –

+0

, спасибо :) – poke

0

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

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

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

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

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

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

Смежные вопросы