2009-12-31 3 views
4

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

У меня есть папка, в которой содержится много текстовых файлов. Я прочитал их и сохранил весь текст в STRING. Теперь я хочу рассчитать, если какое-либо слово появилось в других файлах или нет. (Я знаю, что его не ясно, позвольте мне привести пример)

Например у меня есть два документа: Doc A => «коричневая лиса прыжок» Doc B => «собака не прыгать» Doc C => «лис прыгать собака "

Скажем, моя программа прочитала первый документ, и теперь первое слово« коричневое »теперь моя программа проверит, появилось ли это слово в любом другом документе? Таким образом, ответ будет равен 0. Теперь он снова проверит второе слово «лиса», оно даст результат, который да, он появился в (Doc C) и так далее ... Теперь он будет читать Doc B, и он будет проверить, появилась ли собака в другом документе? Ответ был бы (Doc C) так далее ....

Любые советы или псевдокоды?

Подсказка: это также называется частотой обратного документа (Idf). Я знаю, что такое idf.

+6

Это проблема домашней работы? Если это так, неплохо быть прозрачным, используя тег «домашняя работа» и позволяя читателям соответствующим образом корректировать свои ответы. –

+0

Используйте объединение бит-множеств. Работает каждый раз. –

ответ

6

Как и GregS, используйте HashMap. Я не размещение кода, потому что я думаю, что это домашнее задание, и я хочу, чтобы дать вам возможность создать ее самостоятельно, но план является:

  1. Открыть новый документ
  2. Для каждого слово, посмотрите на ваш хэш, если он уже есть. Если это не так, создайте новый ключ в HashMap с этим словом и в этой позиции добавьте новый документ (имя файла). Если это так, просто добавьте имя файла.

Например, если у вас есть: ДОКА: Коричневый лисица прыгать DocB: Fox прыгать собаку

Вы бы открыть Дока и пройти его содержимое. «коричневый» не находится в вашем хэшмапе, поэтому вы бы добавили новый элемент с ключом «коричневый» и значением «DocA». То же самое с «лисой» и «прыжком». Тогда вы откроете DocB. «fox» уже находится в вашем хэшмапе, поэтому вы добавите его значение DocB (значение будет «DocA DocB»). Возможно, использование ArrayList (на Java) поможет.

+0

Спасибо alex. Это хороший совет. Я постараюсь это сделать. Я смеюсь, чтобы прочитать, что вы все великие люди думаете о своем назначении. Это напомнило мне мои школьные дни. Я профессиональный программист. Недавно я перешел на Java с php. Поэтому вы можете сказать, что это небольшая часть моего текущего проекта. Основной проект - онлайн-магазин книг с некоторыми новыми идеями. – user238384

5

Подсказка: Отображение HashMap Строки для списков файлов.

2

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

1

HashMap mapping Строки для целых чисел. Целые являются неизменными, поэтому есть немного суеты, чтобы «увеличить», но не слишком много. Вы можете переопределить метод put().

+0

Я предполагаю, что вы имеете в виду отображение строк в * Списки * целых чисел? Это служит той же цели, что и решение GregS и Alex, но менее понятно. Список документов на Java - это просто список указателей, поэтому список документов определенно более читабельным и более простым в работе. – MatrixFrog

2

Просто другая идея, отличная от всех ценных ответов, я признаю, что хэш выглядит лучше, я просто хотел увидеть его под другим углом.

Я бы отсортировал все слова в каждом документе и сравнил каждый документ друг с другом.

Например docA> brown, fox, jump; docB-> док, прыгать, не docC-> собака, лисица, прыгать

сравнивая их приходит как этот

 
until there is a single document with words 
    get first element of documents 
    compare the most descending first element if that element exists more than once reserve it 
    throw the one that is the most descending (in my case) 

так в первом сравнении

ДОКА -> лиса, прыгать docB -> док, прыгать, не DOCC -> собака, лисица, прыгать

во втором сравнении

ДОКА -> лиса, прыгать docB -> прыжок, не DOCC -> собака, лисица

в третьем сравнении

ДОКА -> лиса, прыгать docB -> прыжок, не DOCC -> лиса, прыгать

резерв лисицу в 4-м сравнении, резервный прыжок в 5-м сравнении.

1

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

public Map<String,Integer> getWordsWithCount(String sentances) 
{ 
    Map<String,Integer> wordsWithCount = new HashMap<String, Integer>(); 

    String[] words = sentances.split(" "); 
    for (String word : words) 
    { 
     if(wordsWithCount.containsKey(word)) 
     { 
      wordsWithCount.put(word, wordsWithCount.get(word)+1); 
     } 
     else 
     { 
      wordsWithCount.put(word, 1); 
     } 

    } 

    return wordsWithCount; 

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