2013-04-25 1 views
1

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

article1location\article1 name1:countofname1# name2:countofname2# name3:countofname3# ... 
article2location\article2 name1:countofname1# name2:countofname2# name3:countofname3# ... 
article3location\article3 name1:countofname1# name2:countofname2# name3:countofname3# ... 

имена соответствуют людей имен, определенных в каждой статье наряду с частотой их появления в статье, есть около 90 000 статей. У меня есть другой текстовый файл (titles.lst), который содержит список из примерно 40 разных названий и их сокращений (например, г-н, г-жа, президент, сэр и т. Д.). Я хотел бы использовать этот список в файле для поиска и удалите эти заголовки из peopleNames.txt. Я не уверен, как это сделать в java, поскольку я новичок в java, и мне нужно изменить исходный код в java, который создал peopleNames.txt для размещения удаления заголовка.

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

Заранее благодарим за любую помощь.

+0

Как вы, вероятно, знаете, если статья ссылается на кого-то по своему полному имени (возможно, с заголовком) в начале, это, вероятно, начнет ссылаться на них только по фамилии для остальных. В результате ваш список может быть немного больше, чем нужно. К сожалению, обработка, требующая более существенного переписывания. – KBKarma

+0

Возможно, вы должны включить пример строки из titles.lst, так как это может помочь людям придумать лучшее решение. – KBKarma

ответ

3

Вы можете использовать регулярные выражения, чтобы удалить все экземпляры: общественного класса Test {

public static void main(String[] args) throws Exception { 
     String s = "Mr Tom and Ms Jane"; 
     s = s.replaceAll("\\bMr\\b|\\bMs\\b", ""); 
     System.out.println(s); 
    } 

Ради объяснения комментариев:

public static void main(String[] args) throws Exception { 
     String [] titles = args; 
     String regex = "\\b"+titles[0]+"\\b"; 
     for (int i=1; i<titles.length; i++) { 
      regex += "|\\b" + titles[i] + "\\b"; 
     } 

     String s = "Mr Tom and Ms Jane"; 
     s = s.replaceAll(regex, ""); 
     System.out.println(s); 
    } 

Вы можете также использовать параметр повторно, а заменить чем создание регулярного выражения. Я не знаю, что быстрее. Я бы рискнул предположить, что это зависит от реализации Java.

public static void main(String[] args) throws Exception { 
     String [] titles = args; 
     String s = "Mr Tom and Ms Jane"; 
     for (int i=1; i<titles.length; i++) { 
      s = s.replaceAll("\\b"+titles[0]+"\\b", ""); 
     } 
     System.out.println(s); 
    } 
+1

Но, как бы вы знали все возможные титулы у человека? Президент, г-н, г-жа, сэр, Дон, король ... Легче найти первое пространство и разделить его. –

+0

@AsierAranbarri так же, как вы узнали бы, что 'words [0]' is 'Mr, Mrs, Sir, Don, King', а не' Potato' – A4L

+0

Как я уже сказал, вы разделили его. Затем вы ПРОВЕРИТЕ, если он в списке. Если вы делаете это по-своему, вам нужно ЧЕЛОВЕКО изменить код каждый раз, когда появляется новый заголовок. Если вы разделите первое пространство и затем сделаете способ проверить, находится ли это слово в этом списке, вам не нужно менять код. –

1

Это то, что я хотел бы сделать:
1. Разобрать документ titles.lst и поместить каждое название в Set
2. Разбор peopleNames.txt, и для каждой проверки линии, если имя в Набор заголовков
3. Если есть, удалите его.
4. Проверьте наличие двойного входа, так как теперь г-н Джон Смит и Джон Смит будут такими же.

Смежные вопросы