Выделение текста в java

Мы разрабатываем систему обнаружения плагиата. Там я должен выделить возможные плагиатные фразы в документе. Документ подвергается предварительной обработке с удалением стоп-слов, корневой основы и удаления номеров. Таким образом, выделение становится трудным с предварительно обработанным токеном As и примером:

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

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

предварительно обработанный токен: парная программа Extrem

Могу ли я выделить предварительно обработанный токен в исходном документе????

спасибо


person Nuwan    schedule 30.06.2011    source источник
comment
@Nuwan Вас не устраивает stackoverflow.com/questions/6360017/ , тогда ваша принятая ставка является причиной :-)   -  person mKorbel    schedule 30.06.2011
comment
... по какой причине были добавлены теги swing и jtextarea?   -  person Andreas Dolk    schedule 30.06.2011
comment
@Andreas_D Nuwan использует JTextArea в своей программе. Хотя, он не указывает на это в этом вопросе. Смотрите другие его вопросы.   -  person MockerTim    schedule 30.06.2011
comment
Непонятно, какой конечный результат вы хотите получить. Пожалуйста, добавьте измененный исходный текст со словами, которые вы хотите выделить, выделенными полужирным шрифтом.   -  person MockerTim    schedule 30.06.2011
comment
@MackerTim: я выделил текст (выделен жирным шрифтом) .. спасибо :)   -  person Nuwan    schedule 01.07.2011
comment
Так. Вы знаете, как найти часть текста, которую нужно выделить. Единственное, что вам нужно, это как сделать его выделенным в качающемся JTextArea. Я прав?   -  person MockerTim    schedule 01.07.2011
comment
@MockerTim: Нет ... после предварительной обработки текста все стоп-слова и основы будут удалены. Поэтому в результате вместо исходного текста я получаю такие фразы, как Экстремальная программа, парная программа. Экстремальное программирование включает в себя парное программирование. Поэтому я хочу выделить эту предварительно обработанную фразу, отображающую исходный текст в исходном документе. Надеюсь, вы понимаете проблему. .. :)   -  person Nuwan    schedule 01.07.2011
comment
Извините, нет! Я не могу понять. Я просто не понимаю, для чего делается эта препроцессинг. Можете ли вы дать мне несколько ссылок на обратную теорию вашей задачи? Я действительно хочу понять это.   -  person MockerTim    schedule 01.07.2011
comment
Эта предварительная обработка выполняется как часть нашей системы обнаружения плагиата. путем предварительной обработки мы удаляем все ненужные слова, чтобы мы могли легко обнаружить перефразирующий плагиат...   -  person Nuwan    schedule 02.07.2011


Ответы (3)


Вам лучше использовать JTextPane или JEditorPane вместо JTextArea.

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

Таким образом, JTextArea не является удобным компонентом для форматирования текста.

Наоборот, с помощью JTextPane или JEditorPane довольно легко изменить стиль (подсветить) любой части загруженного текста.

Дополнительные сведения см. в разделе Как использовать панели редактора и панели текста.

Обновлять:

Следующий код выделяет нужную часть вашего текста. Это не совсем то, что вы хотите. Он просто находит точную фразу в тексте.

Но я надеюсь, что если вы примените свои алгоритмы, вы сможете легко модифицировать его под свои нужды.

import java.lang.reflect.InvocationTargetException;
import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;

public class LineHighlightPainter {

    String revisedText = "Extreme programming is one approach "
            + "of agile software development which emphasizes on frequent"
            + " releases in short development cycles which are called "
            + "time boxes. This result in reducing the costs spend for "
            + "changes, by having multiple short development cycles, "
            + "rather than one long one. Extreme programming includes "
            + "pair-wise programming (for code review, unit testing). "
            + "Also it avoids implementing features which are not included "
            + "in the current time box, so the schedule creep can be minimized. ";
    String token = "Extreme programming includes pair-wise programming";

    public static void main(String args[]) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {

                public void run() {
                    new LineHighlightPainter().createAndShowGUI();
                }
            });
        } catch (InterruptedException ex) {
            // ignore
        } catch (InvocationTargetException ex) {
            // ignore
        }
    }

    public void createAndShowGUI() {
        JFrame frame = new JFrame("LineHighlightPainter demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextArea area = new JTextArea(9, 45);
        area.setLineWrap(true);
        area.setWrapStyleWord(true);
        area.setText(revisedText);

        // Highlighting part of the text in the instance of JTextArea
        // based on token.
        highlight(area, token);

        frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER);
        frame.pack();
        frame.setVisible(true);
    }

    // Creates highlights around all occurrences of pattern in textComp
    public void highlight(JTextComponent textComp, String pattern) {
        // First remove all old highlights
        removeHighlights(textComp);

        try {
            Highlighter hilite = textComp.getHighlighter();
            Document doc = textComp.getDocument();
            String text = doc.getText(0, doc.getLength());

            int pos = 0;
            // Search for pattern
            while ((pos = text.indexOf(pattern, pos)) >= 0) {
                // Create highlighter using private painter and apply around pattern
                hilite.addHighlight(pos, pos + pattern.length(), myHighlightPainter);
                pos += pattern.length();
            }

        } catch (BadLocationException e) {
        }
    }

    // Removes only our private highlights
    public void removeHighlights(JTextComponent textComp) {
        Highlighter hilite = textComp.getHighlighter();
        Highlighter.Highlight[] hilites = hilite.getHighlights();

        for (int i = 0; i < hilites.length; i++) {
            if (hilites[i].getPainter() instanceof MyHighlightPainter) {
                hilite.removeHighlight(hilites[i]);
            }
        }
    }
    // An instance of the private subclass of the default highlight painter
    Highlighter.HighlightPainter myHighlightPainter = new MyHighlightPainter(Color.red);

    // A private subclass of the default highlight painter
    class MyHighlightPainter
            extends DefaultHighlighter.DefaultHighlightPainter {

        public MyHighlightPainter(Color color) {
            super(color);
        }
    }
}

Этот пример основан на выделении слов в JTextComponent.

person MockerTim    schedule 30.06.2011

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

С разметкой ваш текст может выглядеть так:

[...] rather than one long one. <plag ref="1234">Extreme programming 
includes pair-wise programming</plag> (for code review, unit testing). [...]

(где ref ссылается на некоторую запись метаданных, описывающую оригинал)

person Andreas Dolk    schedule 30.06.2011

Вы можете использовать java.text.AttributedString для аннотирования предварительно обработанных токенов в исходном документе. Затем примените TextAttributes к соответствующим атрибутам (которые вступят в силу в исходном документе.

person Jochen Bedersdorfer    schedule 30.06.2011