2014-02-21 2 views
0

У меня есть большой (+/- 300 000 строк) набор фрагментов текста, содержащий некоторые шумные элементы. С шумным я имею в виду слова сленга, ошибки типа и т. Д. Я хочу отфильтровать эти шумные элементы, чтобы иметь более чистый набор данных.Алгоритм для удаления слов в корпусе с небольшим появлением

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

Возможно, есть некоторые библиотеки или алгоритмы, которые делают это быстрым и эффективным способом. Конечно, я пробовал это сам сначала, но это ЧРЕЗВЫЧАНО медленно!

Таким образом, я хотел бы найти алгоритм, который может отфильтровывать слова быстрым и эффективным способом, которые происходят меньше, чем конкретное требование. Может быть, я добавить небольшой пример:

This is just an example of whaat I wish to acccomplish. 

Слова «whaat» и «acccomplish» написаны с ошибками, и, таким образом, вероятно, произойдет реже (если мы предполагаем жить в идеальном мире и опечаток редко ...). Я хочу закончить

This is just an example of I wish to. 

Спасибо!

PS: Если это возможно, я хотел бы иметь алгоритм в Java (или псевдо-код, так что я могу написать это сам)

+2

Мне не очень нравится ваш подход. Существует множество редких, но вполне достоверных слов, которые будут потеряны. Если вы хотите удалить слова с ошибкой, тогда проверка орфографии. – tom

+0

Что вы пытаетесь? – aglassman

+0

1) построить 2D-массив с количеством строк, равным количеству строк в наборе данных. 2) прочитайте строки за строкой, добавьте каждое слово в HashMap , где String - это слово, Object содержит количество вхождений и список индексов (col, row), чтобы найти, где это слово происходит в целом набор данных. 3) Я конвертирую строку в StringArray и добавляю ее в 2D-массив в виде строки. 4) Я сортирую HashMap на основе вхождений 5) Для каждого слова, имеющего вхождения <= treshold, я беру значения (col, row) и удаляю их 6) Считывает 2D-массив – RazorAlliance192

ответ

4

Я думаю, что вы более усложняя его подхода, предложенного в комментариях.

Вы можете сделать это с 2-х проходов по данным:

  1. Построить гистограмму: Map<String,Integer>, который подсчитывает количество появлений
  2. Для каждого слова, напечатать его в новый файл «чистой», если и только если map.get(word) > THRESHOLD

Как примечание стороны, если таковые имеются, - я думаю, что фиксированный порог подход не является лучшим выбором, лично я бы фильтровать слова, которые меньше, чем больше появляться MEAN-3*STD где MEAN средняя Num и STD - standard deviation. (3 стандартных отклонения означают, что вы ловите слова, которые примерно равны ожидаемому нормальному распределению с вероятностью ~ 99%). Вы можете «играть» с постоянным коэффициентом и находить то, что наилучшим образом соответствует вашим потребностям.

+0

спасибо! это подход, с которым я могу жить. – RazorAlliance192

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