Выделение текста в Java - PullRequest
3 голосов
/ 30 июня 2011

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

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

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

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

Есть ли в любом случае, я могу выделить предварительно обработанный токен в оригинальном документе ????

Thanx

Ответы [ 3 ]

3 голосов
/ 30 июня 2011

Вам лучше использовать 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 .

1 голос
/ 30 июня 2011

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

1 голос
/ 30 июня 2011

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

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

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

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

...