Сборник рамок для подсчета файла - PullRequest
2 голосов
/ 14 января 2010

Я использую MSDOS для передачи в файл ... Я пытаюсь написать программу, которая подсчитывает, сколько раз каждая пара слов появляется в текстовом файле. Пара слов состоит из двух последовательных слов (то есть слова и слова, которое непосредственно следует за ним). В первом предложении этого абзаца слова «считает» и «как» представляют собой пару слов.

Я хочу, чтобы программа выполняла следующие действия:

abc def abc ghi abc def ghi jkl abc xyz abc abc abc ---

Должен выдать этот вывод:

abc:
abc, 2
def, 2
ghi, 1
xyz, 1

def:
abc, 1
ghi, 1

ghi:
abc, 1
kl, 1

jkl:
abc, 1

xyz:
abc, 1

Кстати: я исключаю "a", "the" и ", которые не имеют ничего общего с парой слов ...

Каков наилучший способ сделать это? пожалуйста, будь хорошим, я новичок в Java .. это то, что у меня есть ..

import java.util.Scanner;
import java.util.ArrayList;
import java.util.TreeSet;
import java.util.Iterator;
import java.util.HashSet;

public class Project1
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in); 
        String word;
        String grab;
        int number;

        // ArrayList<String> a = new ArrayList<String>();
        // TreeSet<String> words = new TreeSet<String>();
        HashSet<String> uniqueWords = new HashSet<String>();

        System.out.println("project 1\n");

        while (sc.hasNext()) 
        {
            word = sc.next();
            word = word.toLowerCase();

            if (word.matches("a") || word.matches("and") || word.matches("the"))
            {
            }
            else
            {
                uniqueWords.add(word);
            }

            if (word.equals("---"))
            {
                break;
            }
        }

        System.out.println("size");
        System.out.println(uniqueWords.size());

        System.out.println("unique words");
        System.out.println(uniqueWords.size());

        System.out.println("\nbye...");
    }
}

Извините за форматирование. Трудно понять это прямо здесь ...

Ответы [ 5 ]

3 голосов
/ 14 января 2010

Как насчет использования карты:

Map<String, List<String>> words = new HashMap<String, List<String>>();

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

Key    |    Value
--------------------------
abc    |    def, ghi, jkl
def    |    jkl, mno
1 голос
/ 14 января 2010

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

0 голосов
/ 14 января 2010

Различные подсказки:

  • Вы можете прочитать файл напрямую, используя

    Scanner sc = новый сканер (новый файл ("file.name"));

  • Вы можете поместить свои так называемые «стоп-слова», то есть «a», «an», «the» в Set, например java.util.HashSet, а затем просто проверить его с помощью говоря что-то простое, как

    if (stopWords.contains (word)) ...

  • Для структуры данных: это довольно сложно для «проекта 1»! Учитывая пары слов в переменных, называемых first и second, я предполагаю, что я бы использовал HashMap с ключом для слов в first и содержащий в качестве значений секунду HashMap с ключом для слов в second , Значения второго хэш-карты будут счетчиками для этой пары слов, сохраненными в виде Integer значений.

  • Вам нужно остерегаться углового случая, когда вы впервые видите слово second; в этом случае вам нужно сохранить во второй хэш-карте ваше слово second и Integer.valueOf(1). В противном случае вам нужно заменить значение на целое число, которое на 1 больше предыдущего.

  • Есть способ, которым вы можете немного "обмануть" и значительно упростить структуру данных: если вы "склеите" свои first и second слова вместе, используя символ-разделитель, например,

    Строковый ключ = первый + "_" + второй;

тогда у вас есть ключ, который содержит оба слова, и вам нужна только одна хэш-карта для хранения ключей и подсчетов. Однако, это потребует небольшой работы позже, когда вам понадобится коллекция first слова (подсказка: вы можете сохранить их в Set во время обработки ввода) и снова разделить эти клавиши (подсказка: используйте String.split(key, "_")).

Если вы хотите, чтобы ваши слова автоматически сортировались в порядке возрастания, вам, вероятно, лучше использовать TreeMap вместо HashMap.

0 голосов
/ 14 января 2010

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

table[words.indexOf(currentWord)][words.indexOf(nextWord)]++;

В конце ваша таблица будет содержать частоты каждой пары слово-слово. Кроме того, для получения дополнительной помощи по вашей проблеме может быть полезен поиск bigrams , который является общим названием этой проблемы.

0 голосов
/ 14 января 2010

это должно быть Java? - это действительно намного проще в Perl

(также - это домашнее задание? :))

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