Система контент-анализа естественно-языковых текстов

Морфологические анализаторы (морфологизаторы) на различных языках программирования. Анализ методов и технологий автоматической обработки ЕЯ-текстов. Разработка модуля графематического анализа и создания таблицы лексем. Программная реализация классов.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 06.03.2012
Размер файла 3,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

word = "";

count = 1;

count_forms = 1;

in_dict = true;

flagdeleted = false;

}

public String word;

public int count;

public int count_forms;

public boolean in_dict;

public boolean flagdeleted;

}

public class Load_Text extends Thread {

private File f2;

private interfaces.frameLoad x;

private MainWindow w;

public Load_Text(File FileName,interfaces.frameLoad f,MainWindow _w)

{

x =f;

f2 = FileName;

w = _w;

}

public void run(){

String t,y = "";

int u;

t = "";

u = 0;

x.setVisible(true);

try {

BufferedReader out = new BufferedReader(new FileReader(f2));

while ((y=out.readLine()) != null )

{t += y+"\n";

u++;

x.jLabel3.setText(u+"");

}

out.close();

w.jTextArea1.setText(t);

w.jTextArea1.setCaretPosition(1);

w.setEnabled(true);

x.dispose();

}

catch (Exception ex) {System.out.println("Error"+ex.getMessage());}

}

}

package analysis;

import dictionaries.Hash;

import javax.swing.DefaultListModel;

/**

*

* @author Администратор

*/

public class Parser {

public int hash(String str) {

int sum = 0;

for (int i = 0; i<str.length(); i++)

{sum += code(str.charAt(i));}

return (100*sum + 454) % 500;}

public int code(char c) {

return "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".indexOf(Character.toLowerCase(c))+1;}

public int Parse(String x,DefaultListModel T[], Hash qw)

{

boolean flag_currnet_dividers = false;

String cur_lexem;

int count;

count=0;

ForListElem dd;

DefaultListModel d;

boolean f;

String deviders = "\n?!--{}[] ,./+-:;=-)(*№%«»$#";

cur_lexem = "";

int i,adr,collision;

collision = 0;

i = 0;

x = x.trim();

if (x.length() != 0 || x == null)

while (i < x.length())

{

if (flag_currnet_dividers)

{

if (deviders.indexOf(x.charAt(i)) == -1)

{

adr = hash(cur_lexem);

System.out.println(cur_lexem+" "+adr);

if (!qw.hasWord(cur_lexem.toLowerCase()))

if (T[adr] == null)

{

T[adr] = new DefaultListModel();

dd = new ForListElem();

dd.word = cur_lexem;

T[adr].addElement(dd);

}else{

d = T[adr];

f = false;

for (int p = 0;p<d.getSize();p++)

{

dd = (ForListElem) d.getElementAt(p);

if (dd.word.equals(cur_lexem))

{

dd.count++;

f = true;

break;

}

}

if (!f)

{

dd = new ForListElem();

dd.word = cur_lexem;

d.addElement(dd);

}

}

cur_lexem = "";

count++;

flag_currnet_dividers = false;

i--;

}

}

else {

if (deviders.indexOf(x.charAt(i)) != -1)

flag_currnet_dividers = true;

else

cur_lexem+=x.charAt(i);

}

i++;

}

// System.out.println(cur_lexem);

adr = hash(cur_lexem);

if (!qw.hasWord(cur_lexem.toLowerCase()))

if (T[adr] == null)

{

T[adr] = new DefaultListModel();

dd = new ForListElem();

dd.word = cur_lexem;

T[adr].addElement(dd);

}else{

d = T[adr];

f = false;

for (int p = 0;p<d.getSize();p++)

{

dd = (ForListElem) d.getElementAt(p);

if (dd.word.equals(cur_lexem))

{

dd.count++;

f = true;

break;

}

}

if (!f)

{

dd = new ForListElem();

dd.word = cur_lexem;

d.addElement(dd);

}

}

return count;

}

}

import javax.swing.DefaultListModel;

import javax.swing.JTextArea;

import java.util.Vector;

public class SortTree {

private int count_word;

private DefaultListModel group_words;

private SortTree left;

private SortTree right;

public SortTree(int x,ForListElem x1){

left = null;

right = null;

count_word = x;

group_words = new DefaultListModel();

group_words.addElement(x1);

}

public void add(int count,ForListElem word)

{

if (count == count_word)

{

group_words.addElement(word);

}

else

if (count < count_word)

{

if (left == null) left = new SortTree(count,word);

else

{

left.add(count, word);

}

}

else

{

if (right == null) right = new SortTree(count,word);

else

{

right.add(count, word);

}

}

}

public void CrawlTable(Vector<Vector<Object>> x,DefaultListModel termins,int limit)

{ if (right != null) right.CrawlTable(x,termins,limit);

int i;

ForListElem el;

for (i = 0;i<group_words.size();i++)

{

el = (ForListElem) group_words.getElementAt(i);

if (!el.word.equalsIgnoreCase("")){

if (count_word >= limit ) termins.addElement("«"+el.word+"» - "+el.count);

Vector<Object> curRow = new Vector<Object>();

curRow.add(el.word);

curRow.add(count_word);

curRow.add(el.count_forms);

curRow.add(el.in_dict);

x.add(curRow);

}

}

if (left != null) left.CrawlTable(x,termins,limit);

}

}

package analysis;

public class Start_options {

private String PForms;

private String PStop;

private int Limit;

public Start_options()

{

PForms = "c:\\text\\stems.txt";

PStop = "c:\\text\\Stop_Slovo.txt";

Limit = 33;

}

public String getPForms()

{

return PForms;

}

public String getPStop()

{

return PStop;

}

public int getLimit()

{

return Limit;

}

public void setParam(String x )

{

String k[];

k = x.split("=");

if (k[0].equalsIgnoreCase("PathForms"))

PForms = k[1].trim();

else if (k[0].equalsIgnoreCase("PathStop"))

PStop = k[1].trim();

else if (k[0].equalsIgnoreCase("DefaultLimit"))

Limit = Integer.parseInt(k[1].trim());

}

}

package analysis;

import dictionaries.StopMain;

import dictionaries.MorphMain;

import interfaces.MainWindow;

import java.io.File;

import java.util.Vector;

import javax.swing.DefaultListModel;

import javax.swing.ListSelectionModel;

import javax.swing.table.DefaultTableModel;

public class Union extends Thread{

private MainWindow frame;

private int limit;

public Union (MainWindow x)

{

frame = x;

}

public void setLimit(int p)

{

limit = p;

}

public void run()

{

Execute();

}

public void Execute()

{

DefaultListModel Hash[];

Hash = new DefaultListModel[500];

Parser x;

MorphMain MM;

try {

MM = frame.getMorphDict();

SortTree p;

p = new SortTree(0,new ForListElem());

x = new Parser();

StopMain cls;

cls = new StopMain();

File f;

long time;

time = System.currentTimeMillis();

int codeee,count;

f = new File(MM.so.getPStop());

cls.LoadStop(f);

//System.out.println(cls.getHashTable());

frame.jProgressBar1.setStringPainted(true);

frame.jProgressBar1.setString("Выделение лексем...");

count=x.Parse(frame.getTextArea().getText(),Hash,cls.getHashTable());

DefaultListModel e,q;

q = new DefaultListModel();

ForListElem fo;

frame.jProgressBar1.setString("Объеденение словоформ...");

frame.jProgressBar1.setMinimum(0);

frame.jProgressBar1.setMaximum(Hash.length);

for (int i =0;i<Hash.length;i++)

{

frame.jProgressBar1.setValue(i);

if (Hash[i] != null)

{

e =(DefaultListModel) Hash[i];

// e - список по в хеш-таблице

int size_of_list;

size_of_list = e.getSize();

for (int o = 0 ;o<size_of_list;o++)

{

q.clear();

fo = (ForListElem) e.getElementAt(o);

if (fo.flagdeleted) continue;

boolean flag;

// q - список родственных слов для текущего элемента fo

flag = MM.getRelativeWords(q, fo.word.toLowerCase().trim(),true);

fo.in_dict=flag;

int size_of_list_MR;

size_of_list_MR = q.size();

for (int o1=0;o1<size_of_list_MR;o1++)

{

String wordwatch;// текущее слово из списка словоформ

wordwatch = q.getElementAt(o1).toString().toLowerCase().trim();

codeee = x.hash(wordwatch);

if (!wordwatch.equalsIgnoreCase(fo.word))

if (Hash[codeee] != null) //если словоформа имеется в тексте

{ // Hash[codeee] - список по хеш-коду словоформы

for (int o2 = 0;o2<Hash[codeee].getSize();o2++)

{

ForListElem pop; //текущий элемент списка Hash[codeee]

pop = (ForListElem)Hash[codeee].getElementAt(o2);

if (!pop.flagdeleted)

if (pop.word.equalsIgnoreCase(wordwatch))

{

fo.count+=((ForListElem)Hash[codeee].getElementAt(o2)).count;

fo.count_forms++;

((ForListElem)Hash[codeee].getElementAt(o2)).flagdeleted=true; //Hash[codeee].removeElementAt(o2);

}

}

}

}

//надо заменить на главное слово

String MainWord;

if (!q.isEmpty()){

MainWord = q.firstElement().toString().trim();

int HashCode;

HashCode = x.hash(MainWord);

if (Hash[HashCode] == null)

{

DefaultListModel nx;

nx = new DefaultListModel();

ForListElem ne;

ne = new ForListElem();

ne.count = fo.count;

ne.count_forms = fo.count_forms;

ne.flagdeleted = fo.flagdeleted;

ne.in_dict = fo.in_dict;

ne.word = MainWord;

nx.addElement(ne);

// e.removeElementAt(o);

((ForListElem)e.getElementAt(o)).flagdeleted=true;//!!!!!!!!

Hash[HashCode] = nx;

}

else

{

ForListElem ne;

ne = new ForListElem();

ne.count = fo.count;

ne.count_forms = fo.count_forms;

ne.flagdeleted = fo.flagdeleted;

ne.word = MainWord;

ne.in_dict = fo.in_dict;

Hash[HashCode].addElement(ne);

// e.removeElementAt(o);

((ForListElem)e.getElementAt(o)).flagdeleted=true;//!!!!!!!!

}

}

}

}

frame.jProgressBar1.setString("Сортировка...");

frame.jProgressBar1.setMinimum(0);

frame.jProgressBar1.setMaximum(Hash.length);

for (int i =0;i<Hash.length;i++)

if (Hash[i] != null)

{

ForListElem t;

for (int l= 0;l<Hash[i].getSize();l++)

{

t = (ForListElem) Hash[i].getElementAt(l);

if (!t.flagdeleted)

p.add(t.count,t);

}

}

DefaultListModel ter;

ter = new DefaultListModel();

Vector<Vector<Object>> tableData = new Vector<Vector<Object>>();

p.CrawlTable(tableData,ter,limit);

for (int i = 0; i < ter.getSize();i++)

frame.jTextArea2.append(ter.getElementAt(i).toString()+", ");

Vector<String> columnName = new Vector<String>();

columnName.add("Слово");

columnName.add("Частота");

columnName.add("Количество словоформ");

columnName.add("Наличие в словаре");

DefaultTableModel model = new DefaultTableModel(tableData, columnName){

/**

* @author Subbotin B.P.

* @see http://sbp-program.narod.ru

*/

private static final long serialVersionUID = 1L;

@SuppressWarnings("unchecked")

public Class<?> getColumnClass(int col)

{

Vector row = (Vector<Vector<?>>)dataVector.get(0);

return row.get(col).getClass();

}

};

frame.getTable().setModel(model);

frame.getTable().getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

frame.getTable().getTableHeader().setReorderingAllowed(false);

frame.setEnabled(true);

frame.jProgressBar1.setString("Выполнено...");

frame.jProgressBar1.setValue(0);

double t2;

t2 = System.currentTimeMillis()-time;

t2 /= 1000;

javax.swing.JOptionPane.showMessageDialog(frame, "Текст, состоящий из "+count+" слов, обработан за "+formatDouble(t2,2)+" сек.");

MM.setInfo("Текст, состоящий из "+count+" слов, обработан за "+formatDouble(t2,2)+" сек.");

}catch (Exception E) {

frame.setEnabled(true);

System.out.println("----"+E.getMessage());}

}

double formatDouble(double d, int dz){

double dd = Math.pow(10,dz);

return Math.round(d*dd)/dd;

}

}

package dictionaries;

public class Hash {

String[] dict = new String[500];

public int code(char c) {

return "абвгдеёжзийклмнопрстуфхцчшщъыьэюя".indexOf(Character.toLowerCase(c))+1;}

public int hash(String str) {

int sum = 0;

for (int i = 0; i<str.length(); i++)

{sum += code(str.charAt(i));}

return (100*sum + 454) % 500;

}

private int findPos(String word){

int counter = 0;

int i = hash(word);

for (;counter<dict.length; counter ++) {

if (dict[i] == null || dict[i].equals(word)) {return i;}

if (++i == dict.length) {i = 0;}

}

return -1;

}

public void add(String word) {

int i = findPos(word);

if (i == -1) return;

dict[i] = word;

}

public boolean hasWord(String word) {

int i = findPos(word);

return i != -1 && dict[i] != null;}

}

package dictionaries;

import analysis.Start_options;

import interfaces.MainWindow;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import javax.swing.DefaultListModel;

import interfaces.startwindow;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

public class MorphMain extends Thread{

private btree MD;

private startwindow tf;

public Start_options so;

private int tops_count;

private int words_count;

private leaf listosnov;

private String postosnov;

boolean flagosnov;

boolean flagpostosnov;

String info;

MainWindow f;

public void setInfo(String x)

{

info = x;

}

public String getInfo()

{

return info;

}

public MorphMain(startwindow j1, Start_options s) {

MD = new btree();

tf = j1;

tops_count = 0;

words_count = 0;

flagosnov = false;

flagpostosnov = false;

info = "";

so = s;

}

public void setCurrentBase(String h)

{

if (!flagpostosnov)

{

postosnov = h;

flagpostosnov = true;

}

}

public void setListOsnov(leaf y)

{

if (!flagosnov)

{

listosnov = y;

flagosnov = true;

}

}

public void Reset()

{

flagosnov = false;

flagpostosnov = false;

postosnov = "";

listosnov = null;

}

private String innerjoin(String a,String b)

{

int k;

String l;

l = "";

k = a.length();

if (b.length() < k ) k = b.length();

for (int i = 0;i<k;i++)

{

if (a.charAt(i)==b.charAt(i)) l+=a.charAt(i);

else break;

}

return l;

}

public String selectOsn(String words[])

{

String h;

int j;

h = words[0];

for (int i = 1;i<words.length;i++)

{

h = innerjoin(h,words[i]);

}

return h;

}

public boolean getRelativeWords(DefaultListModel d,String word,boolean show)

{

try {

String base = null;

if (MD.simpleSearch(word, false, this) == null)

{

if (show) f.jTextArea3.append(word+"\n");

Reset();

return false;

}

MD.backSearch(word, this);

if (this.listosnov != null){

leaf l;

base = word.substring(0,word.length()-this.postosnov.length()+1);

if (listosnov.getNextLevel() != null)

this.listosnov.getNextLevel().CrawlforMM(d,base,listosnov.getUin());

if (listosnov.getFlagIn_MainWord())

d.insertElementAt(base, 0);

}

else {

if (show) f.jTextArea3.append(word+"\n"); f.jTextArea3.append(word+"\n");

Reset();

return false;

}

Reset();

}

catch (Exception ex) {

return false;

}

return true;

}

public void LoadInOM()

{

String h1[] = null;

String h = null;

try {

BufferedReader in = new BufferedReader(new FileReader(so.getPForms()));

String j = "ёйцукенгшщзхъэждлорпавыфячсмитьбю";

j += j.toUpperCase();

int k,ik;

Graphics d;

d = tf.getGraphics();

d.setFont(new Font("Courier New", Font.BOLD, 12));

d.setColor(Color.BLACK);

d.drawString("Инициализация интерфейса и загрузка словаря...", 8, tf.getHeight()-45);

k=0;

while (in.readLine() != null) k++;

tf.jProgressBar1.setMaximum(k);

k = 1;

ik = 0;

in.close();

in = new BufferedReader(new FileReader(so.getPForms()));

while ((h = in.readLine()) != null )

{

if (h.length() == 0)

{

k++;

continue;

}

h1 = h.split(" ");

for (int i = 0;i<h1.length;i++)

h1[i]=h1[i].toLowerCase().trim().replace('ё', 'е');

MD.addNewWord(h1[0],false, true,k);

for (int i = 1;i<h1.length;i++ )

{

if (!h1[i].equals("-"))

MD.addNewWord(h1[i],false, false,k);

}

String y;

y = selectOsn(h1);

if (!y.isEmpty())

MD.addNewWord(y,true, false,k);

tf.jProgressBar1.setValue(k);

ik+=h1.length;

k++;

}

DefaultListModel lis;

lis = new DefaultListModel();

MD.Crawl1(lis, "",this);

f = new MainWindow();

f.jSlider1.setValue(so.getLimit());

f.LoadDictionary(this);

tf.setVisible(false);

f.setVisible(true);

} catch (Exception ex) {

javax.swing.JOptionPane.showMessageDialog(null, "Файл словаря не найден. Проверьте настройки.");

System.exit(0);

ex.printStackTrace();

}

}

}

package dictionaries;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.StringTokenizer;

public class StopMain {

public Hash CH = new Hash();

public Hash getHashTable()

{

return CH;

}

public void LoadStop(File f){

String y;

String All_t = "";

String Slovo = "";

int j;

try {

BufferedReader out = new BufferedReader(new FileReader(f));

while ((y=out.readLine()) != null )

{

All_t = All_t + " "+y.replaceAll(" ","");

}

out.close();

StringTokenizer st = new StringTokenizer(All_t," \t,.");

while (st.hasMoreTokens())

{Slovo = st.nextToken().toLowerCase();

CH.add(Slovo);

// System.out.println(Slovo);

}

// for (j=0;j<CH.dict.length;j++) {System.out.println("номер "+j+"слово "+CH.dict[j]);}

}

catch (Exception ex) {System.out.println("Error"+ex.getMessage());}

}

package dictionaries;

import javax.swing.DefaultListModel;

public class btree {

//массив символов алфавита и их параметров

private leaf alpha[];

public leaf[] getAlphabit()

{

return alpha;

}

public btree() {

// level = 0;

fillAlphabit();

}

//заполняет массив буквами русского алфавита...

private void fillAlphabit()

{

alpha = new leaf[32];

int i;

i = 0;

for (char l = 'а';l<='я';l++)

{

alpha[i] = new leaf();

alpha[i++].setLetter(l);

}

}

public static int getIndexbyLetter(char x)

{

int s;

s = -1;

if (x == 'ё') return getIndexbyLetter('е');

else

for (char h = 'а';h<=x;h++)

s++;

return s;

}

public static char getLetterByIndex(int i)

{

char s;

s = 'а'-1;

if (i < 0 || i > 32) return s = ' ';

else

for (int j = 0;j<=i;j++)

s++;

return s;

}

//возвращет объект класса, который содержит последнюю букву искомого слова

//соответственно, если такое слово есть в словаре

//второй параметр - указание остановиться поиску, на очередном этапе

//если встретится признак основы

public leaf simpleSearch(String sw,boolean stop_on_base,MorphMain mm) throws Exception

{

char curr_add_let; //добавляемая в данный момент буква

leaf watching_elem;//объект класса, содержащий эту букву

int index;//номер объекта в алфавите

String h;//остаток строки, без первой буквы

btree down;//ниже следующий уровень дерева

curr_add_let = sw.charAt(0);

if (curr_add_let== 'ё') curr_add_let = 'е';

index = getIndexbyLetter(curr_add_let);

if (index < 0 || index > 32) throw new Exception("Такие буквы недопустимы -"+sw);

else {

watching_elem = alpha[index];

if (!watching_elem.getFlagIn_Use()) return null;

if (stop_on_base)

if (watching_elem.getFlagBase())

{

mm.setCurrentBase(sw);

return watching_elem;

}

if (sw.length() == 1 )

{

if (watching_elem.getFlagEndWord()) return watching_elem;

else return null;

}

//иначе продолжим спуск

else

{

//отбросим первую букву

h = sw.substring(1);

down = watching_elem.getNextLevel();

if (down == null) return null;

else return

watching_elem.getNextLevel().simpleSearch(h,stop_on_base,mm);

}

}

}

public void backSearch(String sw,MorphMain d) throws Exception

{

char curr_add_let; //добавляемая в данный момент буква

leaf watching_elem;//объект класса, содержащий эту букву

int index;//номер объекта в алфавите

String h;//остаток строки, без первой буквы

btree down;//ниже следующий уровень дерева

if (sw.isEmpty()) return;

curr_add_let = sw.charAt(0);

if (curr_add_let== 'ё') curr_add_let = 'е';

index = getIndexbyLetter(curr_add_let);

if (index < 0 || index > 32) throw new Exception("Такие буквы недопустимы -"+sw);

else {

watching_elem = alpha[index];

if (watching_elem.getFlagIn_Use())

{

// if (sw.length() != 1 )

// {

h = sw.substring(1);

down = watching_elem.getNextLevel();

if (down != null)

watching_elem.getNextLevel().backSearch(h,d);

if (watching_elem.getFlagBase())

{

d.setListOsnov(watching_elem);

d.setCurrentBase(sw);

System.out.println("Обновил тут");

}

// }

}

}

}

//добавляет новое слово, возможно помечает его как основу

//или как главное слово в группе морфологически родственных слов

public void addNewWord(String sw, boolean poss_osn, boolean poss_main,int ui ) throws Exception

{

char curr_add_let; //добавляемая в данный момент буква

leaf watching_elem;//объект класса, содержащий эту букву

int index;//номер объекта в алфавите

String h;//остаток строки, без первой буквы

btree down;//ниже следующий уровень дерева

curr_add_let = sw.charAt(0);

if (curr_add_let== 'ё') curr_add_let = 'е';

index = getIndexbyLetter(curr_add_let);

if (index < 0 || index > 32) throw new Exception("Такие буквы недопустимы");

else {

watching_elem = alpha[index];

watching_elem.setFlagIn_Use(true);

//если текущая буква последняя в добавляемом слове

if (sw.length() == 1 )

{

if (poss_osn) watching_elem.setFlagOsnova(true);

else watching_elem.setFlagEndWord(true);

if (poss_main) watching_elem.setFlagMainWord(true);

watching_elem.setUin(ui);

}

//иначе продолжим спуск

else

{

//отбросим первую букву

h = sw.substring(1);

down = watching_elem.getNextLevel();

//если текущая вершина была листом, создадим новый уровень

if (down == null)

{

down = new btree();

//down.level = (byte) (level +1);

watching_elem.setNextLevel(down);

}

//переходим на следующий уровень

watching_elem.getNextLevel().addNewWord(h,poss_osn,poss_main,ui);

}

}

}

public void Crawl(DefaultListModel lis,String word)

{

//tree s;//просматриваемый на данном этапе алфавит

leaf d;//просматриваемый елемент

for (int i = 0;i<32;i++)

{

d = this.alpha[i];

if (d.getFlagIn_Use())

{

if (d.getFlagEndWord())

{

if (d.getFlagIn_MainWord())

lis.insertElementAt(word+getLetterByIndex(i), 0);

else

lis.addElement(word+getLetterByIndex(i));

}

if (d.getNextLevel() != null)

d.getNextLevel().Crawl(lis,word+getLetterByIndex(i));

}

}

}

public void CrawlforMM(DefaultListModel lis,String word,int ui)

{

//tree s;//просматриваемый на данном этапе алфавит

leaf d;//просматриваемый елемент

for (int i = 0;i<32;i++)

{

d = this.alpha[i];

if (d.getFlagIn_Use())

{

if (d.getFlagEndWord())

{

if (d.getUin() == ui){

if (d.getFlagIn_MainWord())

lis.insertElementAt(word+getLetterByIndex(i), 0);

else

lis.addElement(word+getLetterByIndex(i));

}

}

if (d.getNextLevel() != null)

d.getNextLevel().CrawlforMM(lis,word+getLetterByIndex(i),ui);

}

}

}

}

package dictionaries;

public class leaf {

private byte flags;// 0000 0 0 0 0

// u o e m

private int uin;

private btree down;

public leaf() {

flags = 0x00;

down = null;

uin = 0;

}

//методы типа set

public void setUin(int i)

{

uin = i;

}

public void setFlagEndWord(boolean x)

{

if (x)

// 0000 0 0 1 0 = 0x02

flags = (byte) (flags | 0x02);

else

// 0000 1 1 0 1 = 0x0D

flags = (byte) (flags & 0x0D);

}

public void setFlagIn_Use(boolean x)

{

if (x)

// 0000 1 0 0 0 = 0x08

flags = (byte) (flags | 0x08);

else

// 0000 0 1 1 1 = 0x0D

flags = (byte) (flags & 0x07);

}

public void setFlagOsnova(boolean x)

{

if (x)

// 0000 0 1 0 0 = 0x04

flags = (byte) (flags | 0x04);

else

// 0000 1 0 1 1 = 0x0B

flags = (byte) (flags & 0x0B);

}

public void setFlagMainWord(boolean x)

{

if (x)

// 0000 0 0 0 1 = 0x01

flags = (byte) (flags | 0x01);

else

// 0000 1 1 1 0 = 0x0E

flags = (byte) (flags & 0x0E);

}

public void setLetter(char c)

{

//letter = c;

}

public void setNextLevel(btree x)

{

down = x;

}

//методы типа get

public int getUin()

{

return uin;

}

public btree getNextLevel()

{

return down;

}

public boolean getFlagIn_Use()

{

if ( ((byte) (flags & 0x08)) != 0x00 )

return true;

else

return false;

}

public boolean getFlagEndWord()

{

if ( ((byte) (flags & 0x02)) != 0x00 )

return true;

else

return false;

}

public boolean getFlagBase()

{

if ( ((byte) (flags & 0x04)) != 0x00 )

return true;

else

return false;

}

public boolean getFlagIn_MainWord()

{

if ( ((byte) (flags & 0x01)) != 0x00 )

return true;

else

return false;

}

}

package interfaces;

import analysis.Load_Text;

import dictionaries.MorphMain;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

public class AppendFormsDict extends javax.swing.JDialog {

String path;

BufferedWriter out;

/** Creates new form AppendFormsDict */

public AppendFormsDict(java.awt.Frame parent, boolean modal,MorphMain mm) {

super(parent, modal);

initComponents();

path = mm.so.getPForms();

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

try {

if (jTextField1.getText().isEmpty())

{

javax.swing.JOptionPane.showMessageDialog(this, "Нельзя добавить пустую группу словоформ!");

return;

}

out = new BufferedWriter(new FileWriter(path,true));

out.append(jTextField1.getText());

out.newLine();

out.flush();

out.close();

javax.swing.JOptionPane.showMessageDialog(this, "Группа успешно добавлена! Изменения вступят в силу после перезапуска системы.");

jTextField1.setText("");

} catch (IOException ex) {

Logger.getLogger(AppendFormsDict.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

dispose(); // TODO add your handling code here:

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

AppendFormsDict dialog = new AppendFormsDict(new javax.swing.JFrame(), true,null);

dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {

System.exit(0);

}

});

dialog.setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JLabel jLabel2;

private javax.swing.JPanel jPanel1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

package interfaces;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

public class Config extends javax.swing.JFrame {

/** Creates new form Config */

public Config() {

initComponents();

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

this.dispose();

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

BufferedWriter out = null;

try {

File f;

f = new File("Config.ini");

String par1;

String par2;

String par3;

par1 = "PathForms=" + jTextField1.getText();

par2 = "PathStop=" + jTextField2.getText();

par3 = "DefaultLimit=" + jSpinner1.getValue();

out = new BufferedWriter(new FileWriter(f));

out.write(par1, 0,par1.length());

out.newLine();

out.write(par2, 0,par2.length());

out.newLine();

out.write(par3, 0,par3.length());

out.newLine();

out.close();

javax.swing.JOptionPane.showMessageDialog(this, "Настройки успешно сохранены!");

this.dispose();

} catch (IOException ex) {

Logger.getLogger(Config.class.getName()).log(Level.SEVERE, null, ex);

} finally {

try {

out.close();

} catch (IOException ex) {

Logger.getLogger(Config.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new Config().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JPanel jPanel1;

private javax.swing.JSpinner jSpinner1;

private javax.swing.JTextField jTextField1;

private javax.swing.JTextField jTextField2;

// End of variables declaration

}

package interfaces;

import analysis.Load_Text;

import dictionaries.MorphMain;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.DefaultListModel;

public class EditStopDict extends javax.swing.JDialog {

String path;

/** Creates new form EditStopDict */

public EditStopDict(java.awt.Frame parent, boolean modal, MorphMain mm) {

super(parent, modal);

BufferedReader out = null;

try {

initComponents();

path = mm.so.getPStop();

String y;

DefaultListModel dlm;

dlm = new DefaultListModel();

out = new BufferedReader(new FileReader(path));

while ((y = out.readLine()) != null) {

dlm.addElement(y);

}

jList1.setModel(dlm);

} catch (IOException ex) {

Logger.getLogger(EditStopDict.class.getName()).log(Level.SEVERE, null, ex);

} finally {

try {

out.close();

} catch (IOException ex) {

Logger.getLogger(EditStopDict.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

dispose();

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

if (jTextField1.getText().isEmpty())

javax.swing.JOptionPane.showMessageDialog(this, "Нельзя добавить пустое слово!");

else

{

DefaultListModel dlm;

dlm = (DefaultListModel) jList1.getModel();

dlm.addElement(jTextField1.getText());

jList1.setModel(dlm);

jTextField1.setText("");

javax.swing.JOptionPane.showMessageDialog(this,"Слово добавлено");

}

}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList1.getSelectedIndex() != -1)

{

int l;

l = jList1.getSelectedIndex();

DefaultListModel dlm;

dlm = (DefaultListModel) jList1.getModel();

dlm.removeElementAt(l);

jList1.setModel(dlm);

}

else javax.swing.JOptionPane.showMessageDialog(this, "Сначала выберите стоп-слово");

}

private void jList1MouseClicked(java.awt.event.MouseEvent evt) {

if (!jList1.isSelectionEmpty()) jTextField1.setText(jList1.getSelectedValue().toString());

}

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {

try {

DefaultListModel dlm;

dlm = (DefaultListModel) jList1.getModel();

BufferedWriter out = new BufferedWriter(new FileWriter(path));

for (int i = 0; i < dlm.getSize(); i++)

{

out.write(dlm.getElementAt(i).toString());

out.newLine();

}

out.flush();

out.close();

javax.swing.JOptionPane.showMessageDialog(this,"Изменения вступят в силу после перезапуска системы.");

dispose();

} catch (IOException ex) {

Logger.getLogger(EditStopDict.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList1.getSelectedIndex() != -1)

{

int l;

l = jList1.getSelectedIndex();

DefaultListModel dlm;

dlm = (DefaultListModel) jList1.getModel();

if (jTextField1.getText().isEmpty())

{

javax.swing.JOptionPane.showMessageDialog(this, "Нельзя добавить пустое слово!!!");

}

else

{

dlm.removeElementAt(l);

dlm.insertElementAt(jTextField1.getText(), l);

jList1.setModel(dlm);

}

}

else javax.swing.JOptionPane.showMessageDialog(this, "Сначала выберите стоп-слово");

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

EditStopDict dialog = new EditStopDict(new javax.swing.JFrame(), true,null);

dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {

System.exit(0);

}

});

dialog.setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JButton jButton4;

private javax.swing.JButton jButton5;

private javax.swing.JList jList1;

private javax.swing.JPanel jPanel1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

package interfaces;

import dictionaries.MorphMain;

import javax.swing.DefaultListModel;

public class FormsFind extends javax.swing.JDialog {

MorphMain m;

/** Creates new form FormsFind */

public FormsFind(java.awt.Frame parent, boolean modal,MorphMain mm) {

super(parent, modal);

initComponents();

m = mm;

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

dispose(); }

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

boolean f;

String answer;

answer = "";

if (jTextField1.getText().isEmpty())

javax.swing.JOptionPane.showMessageDialog(this,"Нельзя найти словоформы для пустого слова!");

else

{

DefaultListModel dlm = new DefaultListModel();

f = m.getRelativeWords(dlm,jTextField1.getText(),false );

if (f)

{

answer="Словоформы: ";

for (int i = 0;i<dlm.getSize();i++)

{

answer+=dlm.getElementAt(i)+" ";

System.out.println(dlm.getElementAt(i));

}

}

else

{answer = "Данное слово отсутствует в словаре. Извините.";

}

javax.swing.JOptionPane.showMessageDialog(this, answer);

}

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

FormsFind dialog = new FormsFind(new javax.swing.JFrame(), true,null);

dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {

System.exit(0);

}

});

dialog.setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JLabel jLabel1;

private javax.swing.JPanel jPanel1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

package interfaces;

import dictionaries.StopMain;

import analysis.*;

import java.io.File;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.DefaultListModel;

import javax.swing.JFileChooser;

import dictionaries.MorphMain;

import java.io.BufferedWriter;

import java.io.EOFException;

import java.io.FileWriter;

import java.io.PrintWriter;

import java.util.Vector;

import javax.swing.JTable;

import javax.swing.JTextArea;

import javax.swing.ListSelectionModel;

import javax.swing.table.DefaultTableModel;

public class MainWindow extends javax.swing.JFrame {

/** Creates new form NewJFrame */

public MainWindow() {

initComponents();

}

private MorphMain MM;

private String pathText;

private File FileName;

DefaultListModel For = new DefaultListModel();

public JTable getTable()

{

return jTable1;

}

public JTextArea getTextArea()

{

return jTextArea1;

}

public MorphMain getMorphDict()

{

return MM;

}

public void LoadDictionary(MorphMain x)

{

MM = x;

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

jTextArea2.setText("");

jTextArea3.setText("");

Union x;

x = new Union(this);

setEnabled(false);

x.setLimit(jSlider1.getValue());

x.start();

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

System.exit(0); // TODO add your handling code here:

}

private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {

System.exit(0); // TODO add your handling code here:

}

private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {

JFileChooser fc = new JFileChooser();

fc.setFileHidingEnabled(true);

fc.setCurrentDirectory(new File("C:\\Text\\"));

javax.swing.filechooser.FileFilter[] ff = fc.getChoosableFileFilters(); // Удаление фильтра для всех файлов

fc.removeChoosableFileFilter(ff[0]); //

fc.addChoosableFileFilter(new TXTFilter());

int res = fc.showOpenDialog(this);

if (res == JFileChooser.APPROVE_OPTION) {

FileName = fc.getSelectedFile();

System.out.println(fc.getSelectedFile().getAbsolutePath());

pathText = FileName.getAbsolutePath();

frameLoad x;

x = new frameLoad(this, false);

Load_Text lt = new Load_Text(FileName, x,this);

this.setEnabled(false);

lt.start();

}

}

private void jMenuItem10ActionPerformed(java.awt.event.ActionEvent evt) {

Config k;

k = new Config();

k.setVisible(true);

}

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {

Union x;

x = new Union(this);

setEnabled(false);

x.setLimit(jSlider1.getValue());

x.start(); }

private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {

EditStopDict t;

t = new EditStopDict(this,true,MM);

t.setVisible(true);

}

private void jMenuItem6ActionPerformed(java.awt.event.ActionEvent evt) {

AppendFormsDict apf;

apf = new AppendFormsDict(this,true,MM);

apf.setVisible(true);

}

private void jMenuItem7ActionPerformed(java.awt.event.ActionEvent evt) {

FormsFind ff;

ff = new FormsFind(this,true,MM);

ff.setVisible(true);

}

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {

jTextArea1.setText("");

jTextArea2.setText("");

jTextArea3.setText("");

jProgressBar1.setValue(0);

jProgressBar1.setString("");

Vector<Vector<Object>> tableData = new Vector<Vector<Object>>();

Vector<String> columnName = new Vector<String>();

DefaultTableModel model = new DefaultTableModel(tableData, columnName);

jTable1.setModel(model);

}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

String res;

int re;

if (jTextArea2.getText().isEmpty()) {

javax.swing.JOptionPane.showMessageDialog(this,"Недостаточно данных для сохранения результата. Возможно, анализ не был проведен.");

return;

}

JFileChooser fc = new JFileChooser();

fc.setDialogTitle("Сохранение файла");

fc.setFileSelectionMode(JFileChooser.FILES_ONLY);

fc.updateUI();

re = fc.showSaveDialog(this);

if (re == JFileChooser.APPROVE_OPTION) {

{

PrintWriter out1 = null;

try {

out1 = new PrintWriter(new BufferedWriter(new FileWriter(fc.getSelectedFile().getAbsolutePath()+".txt")));

out1.println("Файл - "+FileName.getAbsolutePath());

out1.println("Возможные ключевые слова: ");

out1.println(jTextArea2.getText());

out1.close();

} catch (IOException ex) {

Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);

}

finally {

try {

out1.close();

} catch (Exception ex) {

Logger.getLogger(MainWindow.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

javax.swing.JOptionPane.showMessageDialog(this,"Результаты успешно сохранены в файл");

}

}

private void jMenu3ActionPerformed(java.awt.event.ActionEvent evt) {

About a;

a = new About(this, true);

a.setVisible(true);

}

class TXTFilter extends javax.swing.filechooser.FileFilter {

public boolean accept(java.io.File file) {

if (file.isDirectory()) return true;

return file.getName().endsWith("txt");

}

public String getDescription() {return "TXT файлы (*.txt)";};

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

try { javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

}

catch (Exception e) {System.out.println("Ошибка иницилиазации:"+e.getMessage());}

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new MainWindow().setVisible(true);

}

});

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton4;

private javax.swing.JButton jButton6;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JMenu jMenu1;

private javax.swing.JMenu jMenu2;

private javax.swing.JMenu jMenu3;

private javax.swing.JMenu jMenu4;

private javax.swing.JMenuBar jMenuBar1;

private javax.swing.JMenuItem jMenuItem1;

private javax.swing.JMenuItem jMenuItem10;

private javax.swing.JMenuItem jMenuItem2;

private javax.swing.JMenuItem jMenuItem3;

private javax.swing.JMenuItem jMenuItem4;

private javax.swing.JMenuItem jMenuItem5;

private javax.swing.JMenuItem jMenuItem6;

private javax.swing.JMenuItem jMenuItem7;

private javax.swing.JPanel jPanel1;

private javax.swing.JPanel jPanel2;

private javax.swing.JPanel jPanel3;

public javax.swing.JProgressBar jProgressBar1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JScrollPane jScrollPane2;

private javax.swing.JScrollPane jScrollPane4;

private javax.swing.JScrollPane jScrollPane5;

private javax.swing.JSeparator jSeparator1;

private javax.swing.JSeparator jSeparator2;

public javax.swing.JSlider jSlider1;

private javax.swing.JTable jTable1;

public javax.swing.JTextArea jTextArea1;

public javax.swing.JTextArea jTextArea2;

public javax.swing.JTextArea jTextArea3;

private javax.swing.JTextField jTextField1;

private org.jdesktop.beansbinding.BindingGroup bindingGroup;

// End of variables declaration

}

package interfaces;

import analysis.Start_options;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.image.BufferedImage;

import java.awt.image.ImageObserver;

import java.awt.image.ImageProducer;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.imageio.ImageIO;

import dictionaries.MorphMain;

import java.io.BufferedReader;

import java.io.FileReader;

public class startwindow extends javax.swing.JFrame {

private Image i;

/** Creates new form startwindow */

public startwindow() {

initComponents();

}

private void activate(java.awt.event.WindowEvent evt) {

BufferedReader in = null;

try {

Graphics d;

d = this.getGraphics();

BufferedImage bufImg = null;

try {

bufImg = ImageIO.read(new File("golubie tona.png"));

} catch (IOException e) {

e.printStackTrace();

}

if (bufImg != null) {

d.drawImage(bufImg, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);

}

d.setFont(new Font("Courier New", Font.BOLD, 32));

d.setColor(Color.BLACK);

d.drawString("{СКАТ}", 410, 215);

d.setFont(new Font("Courier New", Font.BOLD, 16));

d.setColor(Color.BLACK);

d.drawString("Система контент анализа естественно-языковых текстов", 8, this.getHeight() - 100);

jProgressBar1.updateUI();

in = new BufferedReader(new FileReader("Config.ini"));

Start_options so;

so = new Start_options();

String y;

while ((y=in.readLine()) != null )

{

so.setParam(y); }

MorphMain MM = new MorphMain(this,so);

MM.start();

} catch (IOException ex) {

Logger.getLogger(startwindow.class.getName()).log(Level.SEVERE, null, ex);

} finally {

try {

in.close();

} catch (IOException ex) {

Logger.getLogger(startwindow.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

/**

* @param args the command line arguments

*/

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new startwindow().setVisible(true);

}

});

}

// Variables declaration - do not modify

public javax.swing.JProgressBar jProgressBar1;

// End of variables declaration

}

Приложение 2

ГРАФИЧЕСКИЙ МАТЕРИАЛ

Графический материал включает:

? Лист 1: постановка задачи,

? Лист 2: модель предметной области,

? Лист 3: функция поиска ключевых слов,

? Лист 4: структура таблицы лексем,

? Лист 5: структура элемента списка таблицы,

? Лист 6: структура вершины дерева морфологического словаря,

? Лист 7: структура поля признаков,

? Лист 8: структура морфологического словаря,

? Лист 9: схема алгоритма поиска,

? Лист 10: схема алгоритма склеивания,

? Лист 11: модель вариантов использования,

? Лист 12: интерфейс программы,

? Лист 13: тестовый пример анализа.

Графический материал выполнен в программе Компас-3D, и представлен ниже.

Приложение 3

Текст для тестового примера анализа

ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ

Генетические алгоритмы (ГА) - это стохастические, эвристические оптимизационные методы, впервые предложенные Холландом (1975). Они основываются на идее эволюции с помощью естественного отбора, выдвинутой Дарвином (1857).

1. Введение в генетические алгоритмы

ГА работают с совокупностью "особей" - популяцией, каждая из которых представляет возможное решение данной проблемы. Каждая особь оценивается мерой ее "приспособленности" согласно тому, насколько "хорошо" соответствующее ей решение задачи. В природе это эквивалентно оценке того, насколько эффективен организм при конкуренции за ресурсы. Наиболее приспособленные особи получают возможность "воспроизводить" потомство с помощью "перекрестного скрещивания " с другими особями популяции. Это приводит к появлению новых особей, которые сочетают в себе некоторые характеристики, наследуемые ими от родителей. Наименее приспособленные особи с меньшей вероятностью смогут воспроизвести потомков, так что те свойства, которыми они обладали, будут постепенно исчезать из популяции в процессе эволюции. Иногда происходят мутации, или спонтанные изменения в генах.

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

ГА состоит из следующих компонент:

- Хромосома. Решение рассматриваемой проблемы. Состоит из генов.

- Начальная популяция хромосом.

- Набор операторов для генерации новых решений из предыдущей популяции.

- Целевая функция для оценки приспособленности (fitness) решений.

Чтобы применять ГА к задаче, сначала выбирается метод кодирование решений в виде строки. Фиксированная длина (l-бит) двоичной кодировки означает, что любая из 2l возможных бинарных строк представляет возможное решение задачи.

По существу, такая кодировка соответствует разбиению пространства параметров на гиперкубы, которым соответствуют уникальные комбинации битов в строке - хромосоме. Для установления соответствия между гиперкубами разбиения области и бинарными строками, описывающими номера таких гиперкубов, кроме обычной двоичной кодировки использовался рефлексивный код Грея. Код Грея предпочтительнее обычного двоичного тем, что обладает свойством непрерывности бинарной комбинации: изменение кодируемого числа на единицу соответствует изменению кодовой комбинации только в одном разряде.

2. Операторы ГА

Стандартные операторы для всех типов генетических алгоритмов это: селекция, скрещивание и мутация.

2.1 Селекция

Оператор селекции (reproduction, selection) осуществляет отбор хромосом в соответствии со значениями их функции приспособленности. Существуют как минимум два популярных типа оператора селекции: рулетка и турнир.

- Метод рулетки (roulette-wheel selection) - отбирает особей с помощью n "запусков" рулетки. Колесо рулетки содержит по одному сектору для каждого члена популяции. Размер i-ого сектора пропорционален соответствующей величине Psel(i) вычисляемой по формуле:

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

Оператор селекции типа колеса рулетки

с пропорциональными функции приспособленности секторами

- Турнирный отбор (tournament selection) реализует n турниров, чтобы выбрать n особей. Каждый турнир построен на выборке k элементов из популяции, и выбора лучшей особи среди них. Наиболее распространен турнирный отбор с k=2.

2.2. Скрещивание

Оператор скрещивание (crossover) осуществляет обмен частями хромосом между двумя (может быть и больше) хромосомами в популяции. Может быть одноточечным или многоточечным. Одноточечный кроссовер работает следующим образом. Сначала, случайным образом выбирается одна из l-1 точек разрыва. Точка разрыва - участок между соседними битами в строке. Обе родительские структуры разрываются на два сегмента по этой точке. Затем, соответствующие сегменты различных родителей склеиваются и получаются два генотипа потомков.

Рис. 2. Одноточечный оператор точка разрыва равна трем)

2.3. Мутация

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

Оператор мутации (четвертый ген мутировал)

3. Алгоритм работы ГА

Работа ГА представляет собой итерационный процесс, который продолжается до тех пор, пока не выполнятся заданное число поколений или какой-либо иной критерий останова. На каждом поколении ГА реализуется отбор пропорционально приспособленности, кроссовер и мутация.

Алгоритм работы простого ГА выглядит следующим образом:

Результаты обработки текста программой представлены на рисунке 33.

Рисунок 33. Результаты обработки текста

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.