Nano Hash - криптовалюты, майнинг, программирование

Как узнать китайский или японский иероглиф в строке в Python?

Такие как:

str = 'sdf344asfasf天地方益3権sdfsdf'

Добавить () к китайским и японским иероглифам:

strAfterConvert = 'sdfasfasf(天地方益)3(権)sdfsdf'

  • Это Python 2 или 3? 06.05.2015
  • Версия python - Python2 06.05.2015
  • Поскольку это довольно широкий диапазон, и я не хочу искать диапазоны: вы бы декодировали из UTF-8, чтобы получить unicode объекты, а затем использовали бы регулярное выражение для обнаружения определенных диапазонов кодовых точек Unicode. То, что эти диапазоны предназначены для китайского и японского языков, является упражнением в исследовании стандарта Unicode. 06.05.2015
  • Связанный: stackoverflow.com/questions/1366068/ 06.05.2015
  • Из ссылки, которую я опубликовал выше, вы можете перебирать символы и проверять значение ord на различных диапазонах CJK для китайских символов. 06.05.2015
  • @EdChum Извините, это дико не по теме, но вы должны изменить текст своего профиля (я проверил ваш проф на лулз) с народного на народный. Иначе вы говорите, что ад - это кодекс других этносов / наций (людей). 06.05.2015
  • @EvenLisle Хм, может, я действительно так думаю ... 06.05.2015
  • Ха, да, полагаю :-P 06.05.2015
  • Избегайте использования зарезервированных слов в качестве имен переменных. например ул. 26.05.2015

Ответы:


1

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


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

# -*- coding:utf-8 -*-
ranges = [
  {"from": ord(u"\u3300"), "to": ord(u"\u33ff")},         # compatibility ideographs
  {"from": ord(u"\ufe30"), "to": ord(u"\ufe4f")},         # compatibility ideographs
  {"from": ord(u"\uf900"), "to": ord(u"\ufaff")},         # compatibility ideographs
  {"from": ord(u"\U0002F800"), "to": ord(u"\U0002fa1f")}, # compatibility ideographs
  {'from': ord(u'\u3040'), 'to': ord(u'\u309f')},         # Japanese Hiragana
  {"from": ord(u"\u30a0"), "to": ord(u"\u30ff")},         # Japanese Katakana
  {"from": ord(u"\u2e80"), "to": ord(u"\u2eff")},         # cjk radicals supplement
  {"from": ord(u"\u4e00"), "to": ord(u"\u9fff")},
  {"from": ord(u"\u3400"), "to": ord(u"\u4dbf")},
  {"from": ord(u"\U00020000"), "to": ord(u"\U0002a6df")},
  {"from": ord(u"\U0002a700"), "to": ord(u"\U0002b73f")},
  {"from": ord(u"\U0002b740"), "to": ord(u"\U0002b81f")},
  {"from": ord(u"\U0002b820"), "to": ord(u"\U0002ceaf")}  # included as of Unicode 8.0
]

def is_cjk(char):
  return any([range["from"] <= ord(char) <= range["to"] for range in ranges])

def cjk_substrings(string):
  i = 0
  while i<len(string):
    if is_cjk(string[i]):
      start = i
      while is_cjk(string[i]): i += 1
      yield string[start:i]
    i += 1

string = "sdf344asfasf天地方益3権sdfsdf".decode("utf-8")
for sub in cjk_substrings(string):
  string = string.replace(sub, "(" + sub + ")")
print string

Приведенные выше отпечатки

sdf344asfasf(天地方益)3(権)sdfsdf

Чтобы быть уверенным в завтрашнем дне, вы можете следить за расширением E унифицированных идеографов CJK. Оно будет поставляться с Unicode 8.0, который планируется выпустить в июне 2015 г.. Я добавил его в диапазоны, но вы не должны включать его, пока не будет выпущен Unicode 8.0.

[РЕДАКТИРОВАТЬ]

Добавлены идеографы совместимости CJK, Японская Кана и радикалы CJK < / а>.

06.05.2015
  • Это не охватывает все различные диапазоны: stackoverflow.com/questions/1366068/ 06.05.2015
  • @EdChum Я обновил свой ответ, включив в него доступные диапазоны Unicode. 06.05.2015
  • В этих диапазонах будут отсутствовать японские символы Кана и множество символов CJK, штрихов, радикалов, символов совместимости и фонетических расширений. Было бы проще и надежнее проверить свойство Unicode Script. 06.05.2015
  • @ 一 二三 Обновлен ответ, чтобы включить идеографы совместимости CJK и японскую Кана. 06.05.2015
  • @ 一 二三 Спасибо за ваши предложения, добавлено приложение радикалов CJK. Что-то еще не хватает? 06.05.2015
  • Думаю, это довольно полный список: unicode.org/cldr/utility/ 06.05.2015
  • Я не вижу там ничего, чего бы не было в моем ответе (хотя я еще не просмотрел его как следует). Мне не удалось найти надежную, готовую к использованию библиотеку для этого, поэтому, если у вас есть какое-то конкретное подмножество Unicode, я был бы признателен, если бы вы упомянули об этом. 06.05.2015
  • Вам не хватает самого первого персонажа. Как я упоминал в моем первом комментарии, вы должны проверять свойство Script каждого символа, а не проверять блоки. В опубликованном мною списке показано подмножество сценариев, которое я считаю подходящим. 07.05.2015
  • Я получил "TypeError: ord () ожидал символ, но найдена строка длины 2" для {from: ord (u \ U0002a700), to: ord (u \ U0002b73f)} и всех других строк, содержащих \ U. Не могли бы вы взглянуть? Спасибо. 19.08.2015
  • @JFreebird Я тоже понял. Различные компиляции Python имеют разные диапазоны символов. Вместо использования ord для построения диапазонов используйте следующие шестнадцатеричные строки: stackoverflow.com/a/9169489/306503 25.04.2017
  • Диапазон для хираганы отсутствует. Пожалуйста, добавьте {'from': ord (u '\ u3040'), 'to': ord (u '\ u309f')}. 17.07.2017
  • хорошая работа, но использование встроенных имен типа range для локальных переменных - плохая практика 06.05.2019
  • также вам не нужно создавать список для оценки по any() (достаточно выражения генератора) 06.05.2019

  • 2

    Вы можете редактировать, используя regex пакет, который поддерживает проверку Unicode "Script" каждого символа и заменяет пакет re:

    import regex as re
    
    pattern = re.compile(r'([\p{IsHan}\p{IsBopo}\p{IsHira}\p{IsKatakana}]+)', re.UNICODE)
    
    input = u'sdf344asfasf天地方益3権sdfsdf'
    output = pattern.sub(r'(\1)', input)
    print output  # Prints: sdf344asfasf(天地方益)3(権)sdfsdf
    

    Вы должны скорректировать \p{Is...} последовательности с помощью скриптов / блоков символов, которые вы считаете «китайскими или японскими».

    07.05.2015
  • Может regex сказать, к какому типу он принадлежит? 19.05.2017

  • 3

    Из одной из самых передовых ветвей NLTK, вдохновленных Набор инструментов машинного перевода Moses:

    def is_cjk(character):
        """"
        Checks whether character is CJK.
    
            >>> is_cjk(u'\u33fe')
            True
            >>> is_cjk(u'\uFE5F')
            False
    
        :param character: The character that needs to be checked.
        :type character: char
        :return: bool
        """
        return any([start <= ord(character) <= end for start, end in 
                    [(4352, 4607), (11904, 42191), (43072, 43135), (44032, 55215), 
                     (63744, 64255), (65072, 65103), (65381, 65500), 
                     (131072, 196607)]
                    ])
    

    Для уточнения деталей ord() номеров:

    class CJKChars(object):
        """
        An object that enumerates the code points of the CJK characters as listed on
        http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Basic_Multilingual_Plane
    
        This is a Python port of the CJK code point enumerations of Moses tokenizer:
        https://github.com/moses-smt/mosesdecoder/blob/master/scripts/tokenizer/detokenizer.perl#L309
        """
        # Hangul Jamo (1100–11FF)
        Hangul_Jamo = (4352, 4607) # (ord(u"\u1100"), ord(u"\u11ff"))
    
        # CJK Radicals Supplement (2E80–2EFF)
        # Kangxi Radicals (2F00–2FDF)
        # Ideographic Description Characters (2FF0–2FFF)
        # CJK Symbols and Punctuation (3000–303F)
        # Hiragana (3040–309F)
        # Katakana (30A0–30FF)
        # Bopomofo (3100–312F)
        # Hangul Compatibility Jamo (3130–318F)
        # Kanbun (3190–319F)
        # Bopomofo Extended (31A0–31BF)
        # CJK Strokes (31C0–31EF)
        # Katakana Phonetic Extensions (31F0–31FF)
        # Enclosed CJK Letters and Months (3200–32FF)
        # CJK Compatibility (3300–33FF)
        # CJK Unified Ideographs Extension A (3400–4DBF)
        # Yijing Hexagram Symbols (4DC0–4DFF)
        # CJK Unified Ideographs (4E00–9FFF)
        # Yi Syllables (A000–A48F)
        # Yi Radicals (A490–A4CF)
        CJK_Radicals = (11904, 42191) # (ord(u"\u2e80"), ord(u"\ua4cf"))
    
        # Phags-pa (A840–A87F)
        Phags_Pa = (43072, 43135) # (ord(u"\ua840"), ord(u"\ua87f"))
    
        # Hangul Syllables (AC00–D7AF)
        Hangul_Syllables = (44032, 55215) # (ord(u"\uAC00"), ord(u"\uD7AF"))
    
        # CJK Compatibility Ideographs (F900–FAFF)
        CJK_Compatibility_Ideographs = (63744, 64255) # (ord(u"\uF900"), ord(u"\uFAFF"))
    
        # CJK Compatibility Forms (FE30–FE4F)
        CJK_Compatibility_Forms = (65072, 65103) # (ord(u"\uFE30"), ord(u"\uFE4F"))
    
        # Range U+FF65–FFDC encodes halfwidth forms, of Katakana and Hangul characters
        Katakana_Hangul_Halfwidth = (65381, 65500) # (ord(u"\uFF65"), ord(u"\uFFDC"))
    
        # Supplementary Ideographic Plane 20000–2FFFF
        Supplementary_Ideographic_Plane = (131072, 196607) # (ord(u"\U00020000"), ord(u"\U0002FFFF"))
    
        ranges = [Hangul_Jamo, CJK_Radicals, Phags_Pa, Hangul_Syllables, 
                  CJK_Compatibility_Ideographs, CJK_Compatibility_Forms, 
                  Katakana_Hangul_Halfwidth, Supplementary_Ideographic_Plane]
    

    Объединение is_cjk() в этом ответе и ответа подстроки @EvenLisle

    >>> from nltk.tokenize.util import is_cjk
    >>> text = u'sdf344asfasf天地方益3権sdfsdf'
    >>> [1 if is_cjk(ch) else 0 for ch in text]
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
    >>> def cjk_substrings(string):
    ...     i = 0
    ...     while i<len(string):
    ...         if is_cjk(string[i]):
    ...             start = i
    ...             while is_cjk(string[i]): i += 1
    ...             yield string[start:i]
    ...         i += 1
    ... 
    >>> string = "sdf344asfasf天地方益3権sdfsdf".decode("utf-8")
    >>> for sub in cjk_substrings(string):
    ...     string = string.replace(sub, "(" + sub + ")")
    ... 
    >>> string
    u'sdf344asfasf(\u5929\u5730\u65b9\u76ca)3(\u6a29)sdfsdf'
    >>> print string
    sdf344asfasf(天地方益)3(権)sdfsdf
    
    18.05.2016
  • Спасибо! Это работает, когда ответ @ EvenLisle не удался: テンポラリ. Незначительная придирка: type character: char в строке документации - на самом деле это str (в Python нет типа char) 07.05.2019

  • 4

    Если вы не можете использовать модуль regex, который предоставляет доступ к свойствам IsKatakana, IsHan, как показано в ответе @ 一 二三; вы можете использовать диапазоны символов из ответа @ EvenLisle с модулем re stdlib:

    >>> import re
    >>> print(re.sub(u"([\u3300-\u33ff\ufe30-\ufe4f\uf900-\ufaff\U0002f800-\U0002fa1f\u30a0-\u30ff\u2e80-\u2eff\u4e00-\u9fff\u3400-\u4dbf\U00020000-\U0002a6df\U0002a700-\U0002b73f\U0002b740-\U0002b81f\U0002b820-\U0002ceaf]+)", r"(\1)", u'sdf344asfasf天地方益3権sdfsdf'))
    sdf344asfasf(天地方益)3(権)sdfsdf
    

    Остерегайтесь известных проблем.

    Вы также можете проверить категорию Unicode:

    >>> import unicodedata
    >>> unicodedata.category(u'天')
    'Lo'
    >>> unicodedata.category(u's')
    'Ll'
    
    08.05.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..