Я бы начал с некоторой реляционной базы данных (SQLite легко настроить) и использовал бы следующую структуру таблицы:
Word
-----
Number INT -- The word number in your data
Word TEXT -- The word itself
Entry
-----
ID INT -- Some number to make it unique
Spam INT -- -1 or 1 as you described
Entry_Word
----------
EntryID INT -- The entry this row corresponds to
WordNo INT -- The number of the word
Frequency INT -- The number of occurences of the word
Для получения записей вы можете использовать
SELECT ID, Spam
FROM Entry
Чтобы получить частоты слов для некоторой записи, вы можете использовать:
SELECT WordNo, Frequency
FROM Entry_Word
WHERE EntryID = ?
Чтобы получить частоту слова, вы можете использовать:
SELECT
WordNo,
SUM(MIN(0,Spam*Frequency)) AS NotSpamFrequency,
SUM(MAX(0,Spam*Frequency)) AS SpamFrequency
FROM Entry
INNER JOIN Entry_Word ON EntryID = ID
GROUP BY WordNo
Вы также можете включить само слово, если хотите:
SELECT
Word,
WordNo,
SUM(MIN(0,Spam*Frequency)) AS NotSpamFrequency,
SUM(MAX(0,Spam*Frequency)) AS SpamFrequency
FROM Entry
INNER JOIN Entry_Word ON EntryID = ID
LEFT JOIN Word ON Number = WordNo
GROUP BY Word, WordNo