Как найти все слова, которые имеют одинаковый вид на двух разных языках? - PullRequest
0 голосов
/ 27 октября 2010

В русском алфавите много букв, одинаковых в английском алфавите.Вот список общих букв: L='acekopuxy'

Теперь, учитывая два огромных списка R и E , каждый в форме [word_A, word_B, ...], где каждое слово_N является строчным словом, я хочу создать список C , который должен содержать только те слова, которые имеют одинаковое написание в E и R.Например, слово «полицейский» должно быть в C , поскольку оно находится в списке R , а также в E .

Есть ли полиномиальный способ сделать это?

PS: Важное замечание: из-за различий в кодировке символов существует два списка L , LE для английских букв и LR для русского, новнешний вид их букв одинаков:

LE='acekopuxy'
LR='асекориху'

Ответы [ 4 ]

2 голосов
/ 27 октября 2010

Вы можете использовать наборы для этого:

english_set = set(E)
russian_set = set(R)
common_words = english_set.intersection(russian_set)

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

1 голос
/ 27 октября 2010
Eset = set(E)
C = [w for w in R if w.replace(LR,LE) in Eset]

Не уверен, правильно ли я понял проблему, но при условии хорошего хеширования это работает в O ( n ).

1 голос
/ 27 октября 2010

Вы должны сами сообщить программе, какие символы похожи.Поскольку все они являются различными кодовыми точками Unicode, вам нужно будет иметь такое отображение:

var RE_map = (
  (u'c', u'\u0441'),
  # ...and so on
)

Затем переведите все слова из R в их представление E:

for ec, rc in RE_map:
    string = string.replace(rc, ec)

и, наконец,проверьте, находится ли строка в E:

if string in E:
    print "The word exists of characters similar in Latin and Cyrillic."
1 голос
/ 27 октября 2010

Вы можете использовать регулярные выражения для этого:

^[acekopuxy]+$

будет соответствовать словам, которые содержат только эти символы.

import re
regex = re.compile(r"^[acekopuxy]+$", re.I)
output = []
for word in mylist:
    if regex.match(word):
        output.append(word)

Вам нужно будет сделать это для обоих списков, используя правильные кодировки. Это означает, что для русского списка вам нужно использовать эквивалентные символы, такие как ^[\u0441\u1234...]$.

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

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