Для Java есть токенизатор, который точно соответствует тому, что я хочу? - PullRequest
1 голос
/ 28 июля 2011

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

Есть такие вещи, как собственные имена, которые я хочу установить только для одного токена (например: «Renato Dinhani Conceição»). Другой случай: процентный («60%»), а не разделенный на два токена.

Что я хочу знать, если есть какой-нибудь Tokenizator из некоторого libray, который может обеспечить высокую настройку? Если нет, я постараюсь написать свой собственный, если есть какой-то интерфейс или методы, которым нужно следовать.

Не все должно быть всеобщим признанием. Пример: мне не нужно перенастраивать китайский алфавит.

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

Ответы [ 4 ]

2 голосов
/ 28 июля 2011

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

  • Определите в человеческом выражении, какие единицы не следует разделять на основе пробелов.Пример имени один.
  • Для каждого из этих исключений для разделения пробелов создайте набор правил для его идентификации.Для примера имени: 2 или более последовательных заглавных слова с или без заглавных букв в названии языка между языками (например, "de").
  • Реализуйте каждое правило как свой собственный класс, который можно вызывать во время цикла.
  • Разбейте всю строку на основе пробелов, а затем зациклите ее, отслеживая, какой токен был раньше, а какой - текущим, применяя ваши классы правил для каждого токена.

Пример для правила isName:

  • Цикл 1: (eg.: isName = false
  • Цикл 2: "Renato isName = true
  • Цикл 3: DinhaniisName = true
  • Цикл 4: Conceição"). isName = true
  • Цикл 5: Another isName = false

Оставив вас с: (eg.:,"Renato Dinhani Conceição")., Another

1 голос
/ 03 августа 2011

Вы должны попробовать Apache OpenNLP .Он включает в себя готовые модели Sentence Detector и Tokenizer для португальского языка.

Загрузите Apache OpenNLP и распакуйте его.Скопируйте португальскую модель в папку OpenNLP.Загрузите модель из http://opennlp.sourceforge.net/models-1.5/

Используя ее из командной строки:

bin/opennlp TokenizerME pt-ten.bin 
Loading Tokenizer model ... done (0,156s)
O José da Silva chegou, está na sua sala.
O José da Silva chegou , está na sua sala .

Используя API:

// load the model
InputStream modelIn = new FileInputStream("pt-token.bin");

try {
  TokenizerModel model = new TokenizerModel(modelIn);
}
catch (IOException e) {
  e.printStackTrace();
}
finally {
  if (modelIn != null) {
    try {
      modelIn.close();
    }
    catch (IOException e) {
    }
  }
}

// load the tokenizer
Tokenizer tokenizer = new TokenizerME(model);

// tokenize your sentence
String tokens[] = tokenizer.tokenize("O José da Silva chegou, está na sua sala.");
1 голос
/ 28 июля 2011

Я думаю, что токенизатор будет слишком упрощенным для того, что вы хотите.На шаг впереди токенизатора был бы лексер, подобный JFlex.Они разделят поток символов на отдельные токены, такие как токенизатор, но с гораздо более гибкими правилами.

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

0 голосов
/ 28 июля 2011

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

Вы должны использовать функцию String.split (). Функция split принимает в качестве аргумента регулярное выражение. Кроме того, вы можете улучшить его с помощью классов Pattern и Matcher. Вы можете скомпилировать объекты шаблона и затем использовать его для соответствия различным сценариям.

...