Статьи

Рубин по медицине: подсчет частоты слов в файле

Добро пожаловать в новую статью из серии SitePoint « Рубин по медицине », где я показываю, как язык программирования Ruby может применяться к задачам, связанным с медицинской областью.

Эта серия статей может принести пользу начинающим, средним и продвинутым программистам на Ruby, а также исследователям и практикам в области здравоохранения и медицины, которые с нетерпением ждут изучения языка программирования Ruby, и применять его в своей области.

В этой статье я собираюсь показать вам, как мы можем использовать Ruby для проверки частоты появления слов в каком-либо файле. Подсчет частоты встречаемости слов может оказаться полезным в больших текстовых файлах, таких как файл OMIM ^ ® ^ — онлайн-наследование Менделяна в Man ^ ® ^ , с которым мы работали в предыдущей статье. , Причина, по которой подсчет частоты слов может быть полезен, состоит в том, что просмотр списка слов и их частоты даст нам больше понимания того, о чем документ. Он также может определять любые ошибки и орфографические ошибки, особенно когда у нас есть словарь для сравнения. Например, если слово из словаря не указано в выходных данных, вы можете просто сделать вывод, что с этим словом произошло неправильное написание, или вместо самих слов были использованы сокращения.

В этой статье мы будем работать с файлом OMIM® — онлайн-наследование Менделя в Man®. Давайте начнем.

Получить файл OMIM®

Я говорил о том, как получить файл OMIM® в моей последней статье: Ruby on Medicine: подсчет реальных слов с помощью Ruby , но я повторю это здесь, на тот случай, если вы не хотите переходить от одной статьи к другой.

OMIM ^ ® ^ можно получить, выполнив следующие действия:

Перейдите по этому анонимному ftp-адресу: ftp://ftp.ncbi.nih.gov . У вас должно появиться диалоговое окно, которое выглядит примерно так:

dialogueBox

Выберите « Гость» рядом с « Подключить как:» , а затем нажмите кнопку « Подключиться» , и в этом случае вы увидите следующий каталог:

каталог

Нам нужен текстовый файл omim.txt.Z (66,3 МБ), который можно найти в каталоге / repository / OMIM / ARCHIVE .

Распакуйте файл, и в этом случае вы получите omim.txt (151,2 МБ).

Хэш

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

Но что такое хэши Ruby ?

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

"word" => frequency 

Где word — это какое-то слово в файле, а frequency — это число, представляющее количество вхождений слова в этот файл.

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

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

 Hash.new 

Если вы хотите создать хеш со значением по умолчанию , вы можете сделать следующее:

 Hash.new(0) 

Приведенный выше хэш имеет значение по умолчанию 0 . Это означает, что, если вы попытались получить доступ к ключу, которого нет в хэше, созданном со значением по умолчанию, будет возвращено значение по умолчанию. Чтобы уточнить, что я имею в виду здесь, посмотрите на пример ниже, где два puts в следующем скрипте вернут 0 :

 frequency = Hash.new(0) puts "#{frequency[0]}" puts "#{frequency[653]}" 

Для получения дополнительной информации о хэше Ruby, вы можете прочитать эту статью и документы .

Подсчет количества вхождений

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

Первое, что мы хотим сделать, это создать новый хеш и присвоить ему значение по умолчанию 0 :


частота = Hash.new (0)

Мы хотим сохранить результаты в файле, поэтому скрипт Ruby write результаты в выходной файл. Мы можем использовать File.open () с режимом w (запись):

 output_file = File.open('wordfrequency.txt', 'w') 

Фронтендом операции является чтение в файле OMIM®, в нашем случае это omim.txt . Оператор для этой операции будет выглядеть следующим образом:

 input_file = File.open('omim.txt', 'r') 

Когда мы просматриваем файл на наличие слов, нам нужна функция Ruby — scan (pattern) . В документации Ruby упоминается следующее об этой функции:

scan выполняет итерацию по * str *, сопоставляя шаблон (который может быть регулярным выражением или строкой). Для каждого совпадения генерируется результат, который либо добавляется в массив результатов, либо передается в блок. Если шаблон не содержит групп, каждый отдельный результат состоит из соответствующей строки, $ &. Если шаблон содержит группы, каждый отдельный результат сам является массивом, содержащим одну запись на группу.

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

Основное регулярное выражение, которое нам нужно в этом уроке, это \b , то есть граница слова . Как вы уже догадались по его названию, это помогает нам подобрать слова.

Посмотрите следующие примеры, чтобы увидеть, как работает граница слова:

 \bhat\b 

Это регулярное выражение соответствует hat в red hat .

Если мы берем только одну границу следующим образом:

 \bhat 

Это будет соответствовать слову с hat в начале, например, в hatrat .

И, если мы хотим сопоставить hat в конце, например rathat , мы можем сделать это с помощью этого регулярного выражения:

 hat\b 

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

 frequency = Hash.new(0) input_file = File.open('omim.txt', 'r') output_file = File.open('wordfrequency.txt', 'w') input_file.read.downcase.scan(/\b[az]{3,16}\b/) {|word| frequency[word] = frequency[word] + 1} frequency.keys.sort.each{|key| output_file.print key,' => ',frequency[key], "\n"} exit 

Прежде чем я покажу вам вывод, я просто хочу быстро уточнить некоторые моменты в приведенном выше сценарии.

Функция downcase возвращает все заглавные буквы, замененные их строчными аналогами. Мы используем его здесь, чтобы совпадения слов происходили независимо от их регистра.

Регулярное выражение /\b[az]{3,16}\b/ в основном говорит нам возвращать все слова, длина которых (количество символов) составляет от 3 до 16. Например, мы можем пропустить эти слова без особого интерес, как будто, или, на . Слова длиной более 16 могут быть последовательностью генов, которую мы не будем рассматривать словом.

Наконец, sort сортирует ключи ( то есть слова), перечисленные в выходном файле, по алфавиту.

Выход

Список слов и их частота встречаемости в файле OMIM®, используя вышеприведенный скрипт Ruby, сгенерирует этот выходной файл: wordfrequency.txt (2.37 МБ)

В списке вы можете заметить некоторые слова с очень небольшой частотой. Что будет указывать в большом текстовом файле, таком как OMIM ^ ® ^? Это слова без смысла? Слова с ошибками? Как вы думаете?

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