2010-02-11 2 views
3

Я хочу определить слова в тексте, то есть мне нужно знать, какие символы в данном тексте являются буквами, то есть они могут быть частью (разговорного) слова, а с другой стороны, пунктуацией и т. Д.Как я могу определить, какие символы Юникода - это буквы (слова), а не знаки пунктуации?

Например, в приведенном выше предложении слова «I», «want» и «i» и «e» являются словами в этом отношении, а пробелы «.». и запятая нет.

Сложность в том, что я хочу, чтобы читать любой скрипт, основанный на Unicode. Например, немецкое слово «schön» - это одно слово. Но как насчет греческого, арабского или японского?

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

Мне это нужно для Mac OS X, Windows и Linux. Я напишу приложение C, так что это должна быть либо библиотека ОС, либо полное решение для кода/данных, которое я мог бы перевести на C.

Я знаю, что Mac OS (Cocoa) предлагает функции для этой цели, но Я не уверен, есть ли похожие решения для Win и Linux (возможно, gtk)?

В качестве альтернативы, я мог бы написать свой собственный код, если бы у меня были полные таблицы.

Я нашел диаграммы Юникода (http://unicode.org/charts/index.html#scripts), но это не приходит в одной удобной форме, которую я мог бы использовать в программировании.

Итак, может ли кто-нибудь сказать мне, есть ли для этой цели функции для Windows и Linux или где я могу найти полную таблицу/список символов слова в юникоде?

+0

Какой язык (ы)? –

ответ

4

Вы можете попробовать использовать Unicode character category, чтобы выяснить, какие слова сепараторы могут быть, но быть в курсе, что некоторые языки (например, японский) даже не имеют разделители слов.

+0

Да, это те таблицы, которые я искал. Теперь этот размер файла не выглядит очень надежным. Например, он не указывает свои источники (например, на какой версии Unicode он основан), или он завершен или нет. Откуда я знаю, что это не просто один парень, собравший только то, что ему нужно для своих нужд, и пропустил весь уродливый отдых? –

+1

Вам нужно будет разобрать необработанные файлы данных (http://www.unicode.org/Public/5.2.0/ucd/), чтобы получить все это. Кроме того, некоторые языки, такие как Python, уже имеют его в удобном (для них) формате (http://docs.python.org/library/unicodedata.html). –

1

Если вы знакомы с Python вообще, то Natural Language Toolkit предоставляет инструменты для chunkers/lexical, которые будут делать это на разных языках. Я бы притворился умным здесь и расскажу вам больше, но все, что я знаю, не соответствует this book, что я настоятельно рекомендую. Я понимаю, что вы могли бы составить техническое решение с регулярным выражением, которое доставит вам 80% от того, где вы хотите быть, но зачем изобретать колесо?

+0

Я не думаю, что я могу ожидать, что стандартное регулярное выражение распознает греческие символы как буквы через что-то вроде «\ w». Поэтому мне пришлось бы кормить все возможные коды букв по одному. Но сначала я должен был бы иметь этот список. –

+1

Существуют механизмы регулярных выражений (включая, возможно, Python), которые реализуют базу данных символов Unicode для '\ w' и др. У некоторых также есть более богатый '\ p {...}' селектор класса символов. – bobince

+0

Да, см. Документ Python для 're' модуля. Он имеет 're.UNICODE', который, как говорится,« Make \ w, \ W, \ b, \ B, \ d, \ D, \ s и \ S зависит от базы данных свойств символов Unicode. " http://docs.python.org/library/re.html –

0

с-среда имеет

  • ispunct() является символом пунктуации
  • isctrl() является управляющим символом.
+1

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

+0

версии MSVC обрабатывают unicode –

0

В Java есть static int java.lang.Character.getType(int codePoint), который можно сравнить с константами, предусмотренных в том же классе, как это:

switch(Character.getType(codePoint)) { 
    case Character.UPPERCASE_LETTER: 
    case Character.LOWERCASE_LETTER: 
    case Character.TITLECASE_LETTER: 
    case Character.MODIFIER_LETTER: 
    case Character.OTHER_LETTER: 
     // you found a letter 
    break; 
    case Character.NON_SPACING_MARK: 
     // you found a combining diacritical mark 
     // see: https://en.wikipedia.org/wiki/Combining_character 
    break; 
    default: 
     // you found other symbols 
    break; 
} 
Смежные вопросы