Как составить частотный словарь букв английского языка

Время на прочтение
21 мин

Количество просмотров 32K

Привет всем!
Я учу английский и всячески упрощаю этот процесс. Как-то мне потребовалось получить список слов вместе с переводом и транскрипцией для определенного текста. Задача не была сложной, и я принялась за дело. Чуть позднее был написан скрипт на python, все это умеющий, и даже умеющий чуть больше, поскольку мне захотелось получить еще и частотный словарь из всех файлов с английским текстом внутри. Так вышел маленький набор скриптов, о котором я и хотела бы рассказать.
Работа скрипта заключается в распарсивании файлов, выделении английских слов, нормализации их, подсчете и выдачи первыx countWord слов из всего получившегося списка английских слов.
В итоговом файле слово записывается в виде:
[число повторений] [само слово] [перевод слова]

О чем будет дальше:

  1. Мы начнем с получения списка английских слов из файла (используя регулярные выражения);
  2. Дальше начнем нормализовывать слова, то есть приводить их с естественной формы в тот вид, в котором они хранятся в словарях (тут мы немного изучим формат WordNet);
  3. Затем мы подсчитаем количество вхождений у всех нормализованных слов (это быстро и просто);
  4. Дальше мы углубимся в формат StarDict, потому что именно с помощью него получим переводы и транскрипцию.
  5. Ну и в самом конце мы куда-нибудь запишем результат (я выбрала файл формата Excel).

Я использовала python 3.3 и надо сказать не один раз пожалела, что не пишу на python 2.7, поскольку часто не хватало нужных модулей.

Частотный анализатор.

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

Регулярное выражение для поиска английских слов

Простое английское слово, например «over», можно найти, используя выражение «([a-zA-Z]+)» — здесь ищется одна или более букв английского алфавита.
Составное слово, к примеру «commander-in-chief», найти несколько сложнее, нам нужно искать идущие друг за другом подвыражения вида «commander-», «in-», после которых идет слово «chief». Регулярное выражение примет вид «(([a-zA-Z]+-?)*[a-zA-Z]+)».
Если в выражении присутсвует промежуточное подвыражение, оно тоже включается в результат. Так, в наш результат попадает не только слово «commander-in-chief», но также и все найденные подвыражения, Чтобы их исключить, добавим в начале подвыражеения ‘?:‘ стразу после открывающейся круглой скобки. Тогда регулярное выражение примет вид «((?:[a-zA-Z]+-?)*[a-zA-Z]+)». Нам еще осталось включить в выражения слова с апострофом вида «didn’t». Для этого заменим в первом подвыражении «-?» на «[-‘]?».
Все, на этом закончим улучшения регулярного выражения, его можно было бы улучшать и дальше, но остановимся на таком:
«((?:[a-zA-Z]+[-‘]?)*[a-zA-Z]+)»

Реализация частотного анализатора английских слов

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

# -*- coding: utf-8 -*- 

import re
import os
from collections import Counter


class FrequencyDict:
	def __init__():
		
		# Определяем регулярное выражение для поиска английских слов
		self.wordPattern = re.compile("((?:[a-zA-Z]+[-']?)*[a-zA-Z]+)")
		
		# Частотный словарь(использум класс collections.Counter для поддержки подсчёта уникальных элементов в последовательностях) 		
		self.frequencyDict = Counter()
		
	# Метод парсит файл, получает из него слова
	def ParseBook(self, file):
		if file.endswith(".txt"): 
			self.__ParseTxtFile(file, self.__FindWordsFromContent)
		else:
			print('Warning: The file format is not supported: "%s"' %file)
			
	# Метод парсит файл в формате txt
	def __ParseTxtFile(self, txtFile, contentHandler):
		try:
			with open(txtFile, 'rU') as file:		
				for line in file: # Читаем файл построчно
					contentHandler(line) # Для каждой строки вызываем обработчик контента
		except Exception as e:
			print('Error parsing "%s"' % txtFile, e)	
						
	# Метод находит в строке слова согласно своим правилам и затем добавляет в частотный словарь
	def __FindWordsFromContent(self, content):
		result = self.wordPattern.findall(content) # В строке найдем список английских слов				
		for word in result:
			word = word.lower()	# Приводим слово к нижнему регистру	
				self.frequencyDict[word] += 1 # Добавляем в счетчик частотного словаря не нормализованное слово	
	
	
	# Метод отдает первые countWord слов частотного словаря, отсортированные по ключу и значению
	def FindMostCommonElements(self, countWord):
		dict = list(self.frequencyDict.items())
		dict.sort(key=lambda t: t[0])
		dict.sort(key=lambda t: t[1], reverse = True)
		return dict[0 : int(countWord)]

На этом, в сущности, работа с частотным словарем могла бы быть и закончена, но наша работа только начинается. Все дело в том, что слова в тексте пишутся с учетом грамматических правил, а это значит, что в тексте могут встретиться слова с окончаниями ed, ing и тд. По сути, даже формы глагола to be ( am, is, are) будут засчитываться за разные слова.
Значит до того, как слово будет добавлено в счетчик слов, нужно привести его к правильной форме.
Переходим ко второй части — написанию нормализатора английских слов.

Лемматизатор английских слов

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

Про лемматизацию уже было несколько статей на хабре, например вот и вот. Они используют базы aot. Мне не хотелось повторяться, а также было интересно поискать какие-нибудь другие базы для лемматизации. Я хотела бы рассказать про WordNet, на нем лемматизатор мы и построим. Начну с того, что на официальном сайте WordNet можно скачать исходники программы и сами базы данных. WordNet умеет очень много, но нам потребуется лишь малая часть его возможностей — нормализация слов.
Нам понадобятся только базы данных. В исходниках WordNet (на си) описан сам процесс нормализации, в сущности сам алгоритм я взяла оттуда, переписав на python. Ах да, разумеется для WordNet существует библиотека для python — nltk, но во-первых, она работает только на python 2.7, а во-вторых, насколько бегло я смотрела, при нормализации всего лишь посылаются запросы на сервер WordNet.
Общая диаграмма классов для лемматизатора:

Как видно из диаграммы, нормализуются только 4 части речи (существительные, глаголы, прилагательные и наречия).
Если кратко описать процесс нормализации, то он заключается в следующем:
1. Для каждой части речи загружаются из WordNet по 2 файла — индексный словарь (имеет название index и расширение согласно части речи, например index.adv для наречий) и файл исключений ( имеет расширение exc и название согласно части речи, например adv.exc для наречий).
2. При нормализации сперва проверяется массив исключений, если слово там есть, возвращается его нормализованная форма. Если слово не является исключением, то начинается привидение слова по грамматическим правилам, то есть отсекается окончание, приклеивается новое окончание, затем слово ищется в индексном массиве, и если оно там есть, то слово считается нормализованным. Иначе применяется следующее правило и тд, пока правила не закончатся или слово не будет нормализовано раньше.
Классы для леммализатора:

Базовый класс для частей речи BaseWordNetItem.py

# -*- coding: utf-8 -*- 

import os

class BaseWordNetItem:
	# Конструктор
	def __init__(self, pathWordNetDict, excFile, indexFile):
	
		self.rule=() # Правила замены окончаний при нормализации слова по правилам.
		
		self.wordNetExcDict={}  # Словарь исключений
		self.wordNetIndexDict=[] # Индексный массив	
		
		self.excFile = os.path.join(pathWordNetDict, excFile) # Получим путь до файла исключений	
		self.indexFile = os.path.join(pathWordNetDict, indexFile) # Получим путь до индексного словаря
		
		self.__ParseFile(self.excFile, self.__AppendExcDict) # Заполним словарь исключений
		self.__ParseFile(self.indexFile, self.__AppendIndexDict) # Заполним индексный массив 

		self.cacheWords={} # Немного оптимизации. Кэш для уже нормализованных слов, ключ - ненормализованное слово, значение - нормализованное слово	
		
			
			
	# Метод добавляет в словарь исключений одно значение. 
	# Файл исключений представлен в формате: [слово-исключение][пробел][лемма]	
	def __AppendExcDict(self, line):			
		# При разборе строки из файла, каждую строку разделяем на 2 слова и заносим слова в словарь(первое слово - ключ, второе - значение). При этом не забываем убрать с концов пробелы
		group = [item.strip() for item in line.replace("n","").split(" ")]
		self.wordNetExcDict[group[0]] = group[1]

			
			
	# Метод добавляет в индексный массив одно значение.
	def __AppendIndexDict(self, line):			
		# На каждой строке берем только первое слово
		group = [item.strip() for item in line.split(" ")]
		self.wordNetIndexDict.append(group[0]) 
		

	# Метод открывает файл на чтение, читает по одной строке и вызывает для каждой строки функцию, переданную в аргументе
	def __ParseFile(self, file, contentHandler):	
		try:
			with open(file, 'r') as openFile: 
				for line in openFile:
					contentHandler(line)	# Для каждой строки вызываем обработчик контента
		except Exception as e:
			raise Exception('File does not load: "%s"' %file)	
			
			
	# Метод возвращает значение ключа в словаре. Если такого ключа в словаре нет, возвращается пустое значение. 
	# Под словарем здесь подразумевается просто структура данных 
	def _GetDictValue(self, dict, key):
		try:
			return dict[key]		
		except KeyError:
			return None
		
		
		
	# Метод проверяет слово на существование, и возвращает либо True, либо False.
	# Для того, чтобы понять, существует ли слово, проверяется индексный массив(там хранится весь список слов данной части речи).	
	def _IsDefined(self, word):
		if word in self.wordNetIndexDict:
			return True
		return False		
	
	
	
	# Метод возвращает лемму(нормализованную форму слова)			
	def GetLemma(self, word):
	
		word = word.strip().lower() 
	
		# Пустое слово возвращаем обратно
		if word == None:
			return None	

		# Пройдемся по кэшу, возможно слово уже нормализовывалось раньше и результат сохранился в кэше
		lemma = self._GetDictValue(self.cacheWords, word)
		if lemma != None:
			return lemma
			
		# Проверим, если слово уже в нормализованном виде, вернем его же
		if self._IsDefined(word):
			return word
			
			
		# Пройдемся по исключениям, если слово из исключений, вернем его нормализованную форму
		lemma = self._GetDictValue(self.wordNetExcDict, word)
		if lemma != None:
			return lemma
	
			
		# На этом шаге понимаем, что слово не является исключением и оно не нормализовано, значит начинаем нормализовывать его по правилам. 
		lemma = self._RuleNormalization(word)
		if lemma != None:
			self.cacheWords[word] = lemma # Предварительно добавим нормализованное слово в кэш
			return lemma		

		return None	
		
		
		
	# Нормализация слова по правилам (согласно грамматическим правилам, слово приводится к нормальной форме)
	def _RuleNormalization(self, word):
		# Бежим по всем правилам, смотрим совпадает ли окончание слова с каким либо правилом, если совпадает, то заменяем окончние.	
		for replGroup in self.rule:
			endWord = replGroup[0]			
			if word.endswith(endWord): 	
				lemma = word # Копируем во временную переменную
				lemma = lemma.rstrip(endWord) # Отрезаем старое окончание
				lemma += replGroup[1] # Приклеиваем новое окончание
				if self._IsDefined(lemma): # Проверим, что получившееся новое слово имеет право на существование, и если это так, то вернем его
					return lemma	
		return None

Класс для нормализации глаголов WordNetVerb.py

# -*- coding: utf-8 -*- 


from WordNet.BaseWordNetItem import BaseWordNetItem

# Класс для нормализации глаголов
# Класс наследуется от BaseWordNetItem

class WordNetVerb(BaseWordNetItem):
	def __init__(self, pathToWordNetDict):
	
		# Конструктор родителя (BaseWordNetItem)
		BaseWordNetItem.__init__(self, pathToWordNetDict, 'verb.exc', 'index.verb')


		# Правила замены окончаний при нормализации слова по правилам. К примеру, окончание "s" заменяется на "" , "ies" на и "y" тд.
		self.rule = (	
						["s"   , ""  ],
						["ies" , "y" ],
						["es"  , "e" ], 			
						["es"  , ""  ],	
						["ed"  , "e" ], 			
						["ed"  , ""  ],	
						["ing" , "e" ], 			
						["ing" , ""  ]	
					)

		# Метод получения нормализованной формы слова GetLemma(word) определен в базовом классе BaseWordNetItem

Класс для нормализации существительных WordNetNoun.py

# -*- coding: utf-8 -*- 


from WordNet.BaseWordNetItem import BaseWordNetItem

# Класс для работы с нормализацией существительных
# Класс наследуется от BaseWordNetItem

class WordNetNoun(BaseWordNetItem):
	def __init__(self, pathToWordNetDict):
	
		# Конструктор родителя (BaseWordNetItem)
		BaseWordNetItem.__init__(self, pathToWordNetDict, 'noun.exc', 'index.noun')
		
		# Правила замены окончаний при нормализации слова по правилам. К примеру, окончание "s" заменяется на "", "ses" заменяется на "s" и тд.
		self.rule = (	
						["s"    , ""    ],
						["’s"   , ""    ],
						["’"    , ""    ],							
						["ses"  , "s"   ],
						["xes"  , "x"   ], 			
						["zes"  , "z"   ],	
						["ches" , "ch"  ], 			
						["shes" , "sh"  ],
						["men"  , "man" ], 			
						["ies"  , "y"   ]					
					)	 
					
					
	# Метод возвращает лемму сушествительного(нормализованную форму слова)
	# Этот метод есть в базовом классе BaseWordNetItem, но нормализация существительных несколько отличается от нормализации других частей речи, 
	# поэтому метод в наследнике переопределен
	def GetLemma(self, word):	
		
		word = word.strip().lower() 
		
		# Если существительное слишком короткое, то к нормализованному виду мы его не приводим	
		if len(word) <= 2:
			return None	

		# Если существительное заканчивается на "ss", то к нормализованному виду мы его не приводим	
		if word.endswith("ss"):
			return None	
			
		# Пройдемся по кэшу, возможно слово уже нормализовывалось раньше и результат сохранился в кэше
		lemma = self._GetDictValue(self.cacheWords, word)
		if lemma != None:
			return lemma
			
		# Проверим, если слово уже в нормализованном виде, вернем его же
		if self._IsDefined(word):
			return word
		
		# Пройдемся по исключениям, если слово из исключений, вернем его нормализованную форму
		lemma = self._GetDictValue(self.wordNetExcDict, word)
		if (lemma != None):
			return lemma

			
		# Если существительное заканчивается на "ful", значит отбрасываем "ful", нормализуем оставшееся слово, а потом суффикс приклеиваем назад.
		# Таким образом, к примеру, из слова "spoonsful" после нормализации получится "spoonful"
		suff = ""
		if word.endswith("ful"): 
				word = word[:-3] # Отрезаем суффикс "ful"
				suff = "ful" # Отрезаем суффикс "ful", чтобы потом приклеить назад
		
		
		# На этом шаге понимаем, что слово не является исключением и оно не нормализовано, значит начинаем нормализовывать его по правилам. 
		lemma = self._RuleNormalization(word)
		if (lemma != None):
			lemma += suff # Не забываем добавить суффикс "ful", если он был
			self.cacheWords[word] = lemma # Предварительно добавим нормализованное слово в кэш
			return lemma		

		return None	
	

Класс для нормализации наречий WordNetAdverb.py

# -*- coding: utf-8 -*- 


from WordNet.BaseWordNetItem import BaseWordNetItem

# Класс для нормалзации наречий
# Класс наследуется от BaseWordNetItem

class WordNetAdverb(BaseWordNetItem):
	def __init__(self, pathToWordNetDict):
	
		# Конструктор родителя (BaseWordNetItem)
		BaseWordNetItem.__init__(self, pathToWordNetDict, 'adv.exc', 'index.adv')
		
		# У наречий есть только списки исключений(adv.exc) и итоговый список слов(index.adv).	
		# Правила замены окончаний при нормализации слова по правилам у наречий нет. 

Класс для нормализации прилагательных WordNetAdjective.py

# -*- coding: utf-8 -*- 

from WordNet.BaseWordNetItem import BaseWordNetItem

# Класс для работы с нормализацией прилагательных
# Класс наследуется от BaseWordNetItem

class WordNetAdjective(BaseWordNetItem):
	def __init__(self, pathToWordNetDict):
	
		# Конструктор родителя (BaseWordNetItem)
		BaseWordNetItem.__init__(self, pathToWordNetDict, 'adj.exc', 'index.adj')


		# Правила замены окончаний при нормализации слова по правилам. К примеру, окончание "er" заменяется на "" или  "e" и тд.
		self.rule = (	
						["er"  , "" ],
						["er"  , "e"],
						["est" , "" ], 			
						["est" , "e"]	
					)

						
		# Метод получения нормализованной формы слова GetLemma(word) определен в базовом классе BaseWordNetItem

Класс для лемматизатора Lemmatizer.py

# -*- coding: utf-8 -*- 


from WordNet.WordNetAdjective import WordNetAdjective
from WordNet.WordNetAdverb import WordNetAdverb
from WordNet.WordNetNoun import WordNetNoun
from WordNet.WordNetVerb import WordNetVerb

class Lemmatizer:
	def __init__(self, pathToWordNetDict):
	
		# Разделитель составных слов	
		self.splitter = "-" 						
		
		# Инициализируем объекты с частям речи
		adj = WordNetAdjective(pathToWordNetDict)	# Прилагательные
		noun = WordNetNoun(pathToWordNetDict)		# Существительные
		adverb = WordNetAdverb(pathToWordNetDict)	# Наречия
		verb = WordNetVerb(pathToWordNetDict)		# Глаголы
		
		self.wordNet = [verb, noun, adj, adverb]
		

	# Метод возвращает лемму слова (возможно, составного)		
	def GetLemma(self, word):
		# Если в слове есть тире, разделим слово на части, нормализуем каждую часть(каждое слово) по отдельности, а потом соединим
		wordArr = word.split(self.splitter)
		resultWord = []
		for word in wordArr:
			lemma = self.__GetLemmaWord(word)
			if (lemma != None):
				resultWord.append(lemma)
		if (resultWord != None):
			return self.splitter.join(resultWord)
		return None		
		
		
		
	# Метод возвращает лемму(нормализованную форму слова)			
	def __GetLemmaWord(self, word):
		for item in self.wordNet:
			lemma = item.GetLemma(word)
			if (lemma != None):
				return lemma
		return None		
				

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

Переводчик иностранных слов, использующий словари StarDict

Про StarDict можно писать долго, но основное преимущество этого формата то, что для него есть очень много словарных баз, практически на всех языках. На хабре еще не было статей на тему StarDict и пора восполнить это пробел. Файл, описывающий формат StarDict, обычно расположен рядом с самими исходниками.
Если отбросить все дополнения, то самый минимальный набор знаний по этому формату будет следующим:
Каждый словарь должен содержать в себе 3 обязательных файла:

1. Файл с расширением ifo — содержит непротиворечивое описание самого словаря;
2. Файл с расширением idx . Каждая запись внутри idx файла состоит из 3-х полей, идущих друг за другом:

  • word_str — Строка в формате utf-8, заканчивающаяся »;
  • word_data_offset -Смещение до записи в файле .dict (размер числа 32 или 64 бита);
  • word_data_size — Размер всей записи в файле .dict.

3. Файл с расширением dict — содержит сами переводы, добраться до которых можно зная смещение до перевода (смещение записано в файле idx ).

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

Классы для перводчика StarDict:

Базовый класс для элементов словаря BaseStarDictItem.py

# -*- coding: utf-8 -*- 


import os

class BaseStarDictItem:
	def __init__(self, pathToDict, exp):
	
		# Определяем переменную с кодировкой
		self.encoding = "utf-8"
		
		# Получаем полный путь до файла
		self.dictionaryFile = self.__PathToFileInDirByExp(pathToDict, exp)
		
		# Получаем размер файла
		self.realFileSize = os.path.getsize(self.dictionaryFile)	

	
	
	# Метод ищет в папке path первый попапвшийся файл с расширением exp 
	def __PathToFileInDirByExp(self, path, exp):
		if not os.path.exists(path):
			raise Exception('Path "%s" does not exists' % path)	
		
		end = '.%s'%(exp)
		list = [f for f in os.listdir(path) if f.endswith(end)]
		if list: 
			return os.path.join(path, list[0]) # Возвращаем первый попавшийся
		else:
			raise Exception('File does not exist: "*.%s"' % exp)	
			

Класс Ifo.py

# -*- coding: utf-8 -*- 


from StarDict.BaseStarDictItem import BaseStarDictItem
from Frequency.IniParser import IniParser

class Ifo(BaseStarDictItem):
	def __init__(self, pathToDict):
		
		# Конструктор родителя (BaseStarDictItem)
		BaseStarDictItem.__init__(self, pathToDict, 'ifo')	

		# Создаем и инициализируем парсер
		self.iniParser = IniParser(self.dictionaryFile)
		
		# Считаем из ifo файла параметры
		# Если хотя бы одно из обязательных полей отсутствует, вызовется исключение и словарь не будет загружен
		self.bookName = self.__getParameterValue("bookname", None) # Название словаря [Обязательное поле]
		self.wordCount = self.__getParameterValue("wordcount", None)  # Количество слов в ".idx" файле [Обязательное поле]
		self.synWordCount = self.__getParameterValue("synwordcount", "")  # Количество слов в ".syn" файле синонимов [Обязательное поле, если есть файл ".syn"]
		self.idxFileSize = self.__getParameterValue("idxfilesize", None) # Размер (в байтах) ".idx" файла. Если файл сжат архиватором, то здесь указывается размер исходного несжатого файла [Обязательное поле]
		self.idxOffsetBits = self.__getParameterValue("idxoffsetbits", 32)  # Размер числа в битах(32 или 64), содержащего внутри себя смещение до записи в файле .dict. Поле пояилось начиная с версии 3.0.0, до этого оно всегда было 32 [Необязательное поле]
		self.author = self.__getParameterValue("author", "") # Автор словаря [Необязательное поле]
		self.email = self.__getParameterValue("email", "") # Почта [Необязательное поле]
		self.description = self.__getParameterValue("description", "") # Описание словаря [Необязательное поле]
		self.date = self.__getParameterValue("date", "") # Дата создания словаря [Необязательное поле]
		self.sameTypeSequence = self.__getParameterValue("sametypesequence", None) # Маркер, определяющий форматирование словарной статьи[Обязательное поле]
		self.dictType = self.__getParameterValue("dicttype", "") # Параметр используется некоторыми словарными плагинами, например WordNet[Необязательное поле]			
	

	def __getParameterValue(self, key, defaultValue):
		try:
			return self.iniParser.GetValue(key) 
		except:
			if defaultValue != None:
				return defaultValue
			raise Exception('n"%s" has invalid format (missing parameter: "%s")' % (self.dictionaryFile, key))	

Класс Idx.py

# -*- coding: utf-8 -*- 


from struct import unpack
from StarDict.BaseStarDictItem import BaseStarDictItem


class Idx(BaseStarDictItem):

	# Конструктор
	def __init__(self, pathToDict, wordCount, idxFileSize, idxOffsetBits):

		# Конструктор родителя (BaseStarDictItem)
		BaseStarDictItem.__init__(self, pathToDict, 'idx')
		
		self.idxDict ={} # Словарь, self.idxDict = {'иностр.слово': [Смещение_до_записи_в_файле_dict, Размер_всей_записи_в_файле_dict], ...}	
		self.idxFileSize = int(idxFileSize) # Размер файла .idx, записанный в .ifo файле
		self.idxOffsetBytes = int(idxOffsetBits/8) # Размер числа, содержащего внутри себя смещение до записи в файле .dict. Переводим в байты и приводим к числу
		self.wordCount = int(wordCount) # Количество слов в ".idx" файле
		
		# Проверяем целостность словаря (информация в .ifo файле о размере .idx файла [idxfilesize] должна совпадать с его реальным размером)
		self.__CheckRealFileSize()
		
		# Заполняем словарь self.idxDict данными из файла .idx
		self.__FillIdxDict()
	
		# Проверяем целостность словаря (информация в .ifo файле о количестве слов [wordcount] должна совпадать с реальным количеством записей в .idx файле)
		self.__CheckRealWordCount()
	
	
	# Функция сверяет размер файла, записанный в .ifo файле, с ее реальным размером и в случае расхождений генерирует исключение	
	def __CheckRealFileSize(self):
		if self.realFileSize != self.idxFileSize:
			raise Exception('size of the "%s" is incorrect' %self.dictionaryFile)

			
	# Функция сверяет количестве слов, записанное в .ifo файле, с реальным количеством записей в файле .idx и в случае расхождений генерирует исключение			
	def __CheckRealWordCount(self):
		realWordCount = len(self.idxDict)
		if realWordCount != self.wordCount:
			raise Exception('word count of the "%s" is incorrect' %self.dictionaryFile)
	

	# Функция считывает из потока данных массив байтов заданной длины, затем преобазует байткод в число	
	def __getIntFromByteArray(self, sizeInt, stream):
		byteArray = stream.read(sizeInt) # Получили массив байтов, отведенных под число
		
		# Определим формат пробразования в числовой формат 
		formatCharacter = 'L'   # Формат означает "unsigned long" (для sizeInt = 4)
		if sizeInt == 8:
			formatCharacter = 'Q' # Формат означает "unsigned long long" (для sizeInt = 8)
		format = '>' + formatCharacter # Общий формат будет состоять из: "направление порядка байтов" + "формат числа"
		# Строка '>' - означает, что мы распаковываем байткод в число int(размера formatCharacter) от старшего бита к младшему.
		
		integer = (unpack(format, byteArray))[0] # Распаковываем массив байтов в заданном формате	
		return int(integer) 
		
		

	# Функция разделяет файл .idx на отдельные записи (запись состоит из 3-х полей) и каждую запись добавляет в словарь self.idxDict
	def __FillIdxDict(self):
		languageWord = ""
		with open(self.dictionaryFile, 'rb') as stream:
			while True:
				byte = stream.read(1)  # Читаем один байт
				if not byte: break # Если байтов больше нет, то выходим из цикла
				if byte != b'':	 # Если байт не является символом окончания строки '', то прибавляем его к слову
					languageWord += byte.decode("utf-8")
				else: 
					# Если дошли до '', то считаем, что слово закончилось и дальше идут два числа ("Смещение до записи в файле dict" и "Размер всей записи в файле dict")
					wordDataOffset = self.__getIntFromByteArray(self.idxOffsetBytes, stream)  # Получили первое число "Смещение до записи в файле dict"
					wordDataSize = self.__getIntFromByteArray(4, stream) # Получили второе число "Размер всей записи в файле dict"

					self.idxDict[languageWord] = [wordDataOffset, wordDataSize] # Добавим в словарь self.idxDict запись: иностранное слово + смещение + размер данных
					languageWord = "" # Обнуляем переменную, поскольку начинается следующая струтура
			

			
	# Функция возвращает расположение слова в файле .dict ("Смещение до записи в файле dict" и "Размер всей записи в файле dict").
	# Если такого слова в словаре нет, функция возвращает None
	def GetLocationWord(self, word):			
		try:
			return self.idxDict[word]		
		except KeyError:
			return [None, None]	

Класс Dict.py

# -*- coding: utf-8 -*- 


from StarDict.BaseStarDictItem import BaseStarDictItem

# Маркер может быть составным (к примеру, sametypesequence = tm).
# Виды одно-символьныx идентификаторов  словарных статей (для всех строчных идентификаторов текст в формате utf-8, заканчивается ''):
# 'm' - просто текст в кодировке utf-8, заканчивается '' 
# 'l' - просто текст в НЕ в кодировке utf-8, заканчивается '' 
# 'g' - текст размечен с помощью языка разметки текста Pango
# 't' - транскрипция в кодировке utf-8, заканчивается '' 
# 'x' - текст в кодировке utf-8, размечен с помощью xdxf
# 'y' - текст в кодировке utf-8, содержит китайские(YinBiao) или японские (KANA) символы 
# 'k' - текст в кодировке utf-8, размечен с помощью  KingSoft PowerWord XML 
# 'w' - текст размечен с помощью  MediaWiki
# 'h' - текст размечен с помощью  Html
# 'n' - текст размечен формате для WordNet
# 'r' - текст содержит список ресурсов. Ресурсами могут быть файлы картинки (jpg), звуковые (wav), видео (avi), вложенные(bin) файлы и др.
# 'W' - wav файл
# 'P' - картинка
# 'X' - этот тип зарезервирован для экспериментальных расширений



class Dict(BaseStarDictItem):
	def __init__(self, pathToDict, sameTypeSequence):

		# Конструктор родителя (BaseStarDictItem)
		BaseStarDictItem.__init__(self, pathToDict, 'dict')
	
		# Маркер, определяющий форматирование словарной статьи
		self.sameTypeSequence = sameTypeSequence 
		

			
	def	GetTranslation(self, wordDataOffset, wordDataSize):
		try:
			# Убеждаемся что смещение и размер данных неотрицательны и находятся в пределах размера файла .dict
			self.__CheckValidArguments(wordDataOffset, wordDataSize)

			# Открываем файл .dict как бинарный
			with open(self.dictionaryFile, 'rb') as file:  # менеджер контекста
				file.seek(wordDataOffset) # Смешаемся внутри файла до начала текста, относящегося к переводу слова
				byteArray = file.read(wordDataSize) # Читаем часть файла, относящегося к переводу слова
				return byteArray.decode(self.encoding) # Вернем раскодированный в юникодную строку набор байтoв (self.encoding определен в базовом классе BaseDictionaryItem)
	
		except Exception:
			return None	

	
	

	def	__CheckValidArguments(self, wordDataOffset, wordDataSize):	
		if wordDataOffset is None:
			pass
		if wordDataOffset < 0:
			pass
		endDataSize = wordDataOffset + wordDataSize
		if wordDataOffset < 0 or wordDataSize < 0 or endDataSize > self.realFileSize:
			raise Exception

Ну вот, переводчик готов. Теперь нам осталось только объединить вместе частотный анализатор, нормализатор слов и переводчик. Создадим главный файл main.py и файл настроек Settings.ini.

Главный файл main.py

# -*- coding: utf-8 -*- 

import os
import xlwt3 as xlwt

from Frequency.IniParser import IniParser
from Frequency.FrequencyDict import FrequencyDict
from StarDict.StarDict import StarDict

ConfigFileName="Settings.ini"

class Main:
	def __init__(self):
	
		self.listLanguageDict = [] # В этом массиве сохраним словари StarDict
		self.result = [] # В этом массиве сохраним результат (само слово, частота, его перевод)

		try:
			# Создаем и инициализируем конфиг-парсер
			config = IniParser(ConfigFileName)	

			self.pathToBooks = config.GetValue("PathToBooks") # Считываем из ini файла переменную PathToBooks, которая содержит  путь до файлов(книг, документов и тд), из которых будут браться слова		
			self.pathResult = config.GetValue("PathToResult") # Считываем из ini файла переменную PathToResult, которая содержит путь для сохранения результата
			self.countWord = config.GetValue("CountWord") # Считываем из ini файла переменную CountWord, которая содержит количество первых слов частотного словаря, которые нужно получить
			self.pathToWordNetDict = config.GetValue("PathToWordNetDict") # Считываем из ini файла переменную PathToWordNetDict, которая содержит путь до словаря WordNet
			self.pathToStarDict = config.GetValue("PathToStarDict") # Считываем из ini файла переменную PathToStarDict, которая содержит путь до словарей в формате StarDict	
			
			# Отделяем пути словарей StarDict друг от друга и удаляем пробелы с начала и конца пути. Все пути заносим в список listPathToStarDict
			listPathToStarDict = [item.strip() for item in self.pathToStarDict.split(";")]

			# Для каждого из путей до словарей StarDict создаем свой языковый словарь
			for path in listPathToStarDict:
				languageDict = StarDict(path)
				self.listLanguageDict.append(languageDict) 
			
			# Получаем список книг, из которых будем получать слова
			self.listBooks = self.__GetAllFiles(self.pathToBooks)

			# Создаем частотный словарь		
			self.frequencyDict = FrequencyDict(self.pathToWordNetDict)			
	
			# Подготовка закончена, загружены словари StarDict и WordNet. Запускаем задачу на выполнение, то есть начинаем парсить текстовые файл, нормализовывать и считать слова			
			self.__Run()
		
		except Exception as e:
			print('Error: "%s"' %e)


	# Метод создает список файлов, расположенных в папке path	
	def __GetAllFiles(self, path):
		try:
			return [os.path.join(path, file) for file in os.listdir(path)]
		except Exception:
			raise Exception('Path "%s" does not exists' % path)		

		
	# Метод бежит по всем словарям, и возвращает перевод из ближайшего словаря. Если перевода нет ни в одном из словарей, возвращается пустая строка	
	def __GetTranslate(self, word):
		valueWord = ""
		for dict in self.listLanguageDict:
			valueWord = dict.Translate(word)
			if valueWord != "":
				return valueWord
		return valueWord
		
		
		
	# Метод сохраняет результат(само слово, частота, его перевод) по первым countWord словам в файл формата Excel  	
	def __SaveResultToExcel(self):	
		try:
			if not os.path.exists(self.pathResult):
				raise Exception('No such directory: "%s"' %self.pathResult)	
			
			if self.result:	
				description = 'Frequency Dictionary'
				style = xlwt.easyxf('font: name Times New Roman')			
				wb = xlwt.Workbook()
				ws = wb.add_sheet(description + ' ' + self.countWord)	
				nRow = 0
				for item in self.result:
					ws.write(nRow, 0, item[0], style)
					ws.write(nRow, 1, item[1], style)
					ws.write(nRow, 2, item[2], style)
					nRow +=1			
				wb.save(os.path.join(self.pathResult, description +'.xls'))
		except Exception as e:
			print(e)			
	
	
	
	# Метод запускает задачу на выполнение
	def __Run(self):					
		# Отдаем частотному словарю по одной книге	
		for book in self.listBooks:
			self.frequencyDict.ParseBook(book)		
			
		# Получаем первые countWord слов из всего получившегося списка английских слов			
		mostCommonElements = self.frequencyDict.FindMostCommonElements(self.countWord)
		
		# Получаем переводы для всех слов
		for item in mostCommonElements:
			word = item[0]
			counterWord = item[1]
			valueWord = self.__GetTranslate(word)
			self.result.append([counterWord, word, valueWord])	

		# Запишем результат в файл формата Excel 
		self.__SaveResultToExcel()		


if __name__ == "__main__":
	main = Main()

Файл настроек Settings.ini

; Путь до файлов(книг, документов и тд), из которых будут браться слова
PathToBooks = e:BienneFrequencyBooks

; Путь до словаря WordNet(он нужен для нормализации слов)
PathToWordNetDict = e:BienneFrequencyWordNetwn3.1.dict

; Путь до словарей в формате StarDict(нужны для перевода слов)
PathToStarDict = e:BienneFrequencyDictstardict-comn_dictd04_korolew

; Количество первых слов частотного словаря, которые будут записаны в файл в формате Excel
CountWord = 100

; Путь, куда сохранить результат (файл в формате Excel с тремя заполненными колонками - само слово, частота, его перевод)
PathToResult = e:BienneFrequencyBooks

Единственной сторонней библиотекой, которую нужно скачать и поставить дополнительно, является xlwt, она потребуется для создания файла в формате Excel (туда записывается результат).
В файле настроек Settings.ini для переменной PathToStarDict можно писать несколько словарей через «;». В этом случае слова будут искаться в порядке очередности словарей — если слово найдено в первом словаре, поиск заканчивается, иначе перебираются все остальные словари StarDict.

Послесловие

Все исходники, описанные в этой статье, можно скачать на github.
Напоминание:

  1. Скрипты писались под windows;
  2. Использовался python 3.3;
  3. Дополнительно нужно будет поставить библиотеку xlwt для работы с Excel;
  4. Отдельно нужно скачать словарные базы для WordNet и StarDict (у словарей StarDict нужно будет дополнительно распаковать запакованные в архив файлы с расширением dict);
  5. В файле Settings.ini нужно прописать пути для словарей и куда сохранить результат.
  6. Отдельно хотелось бы сказать про транскрипцию, она есть не во всех словарных базах StarDict, но найти словарь с транскрипцией по поиску в гугле не составит труда (во всяком случае я их легко находила).
  • Главная
  • Английский алфавит

Частота встречаемости букв

Частота встречаемости букв в английском языке


Как известно, самая часто встречаемая буква — E, редко встречаемая — Z.

Вот наглядная таблица английского алфавита

Буква Частота встречаемости
Aa 8,17 %
Bb 1,49 %
Cc 2,78 %
Dd 4,25 %
Ee 12,70 %
Ff 2,23 %
Gg 2,02 %
Hh 6,09 %
Ii 6,97 %
Jj 0,15 %
Kk 0,77 %
Ll 4,03 %
Mm 2,41 %
Nn 6,75 %
Oo 7,51 %
Pp 1,93 %
Qq 0,10 %
Rr 5,99 %
Ss 6,33 %
Tt 9,06 %
Uu 2,76 %
Vv 0,98 %
Ww 2,36 %
Xx 0,15 %
Yy 1,97 %
Zz 0,07 %
Всего 100,02 %*

* Сумма показана с погрешностью округления

Частотный
словарь (1001 — 2000)  ·
 Частотный словарь (2001 — 3000) 
·  Озвученный
словарь

Английские слова, расположенные в порядке встречаемости в
речи. Первая тысяча слов.

1

a —
неопределенный артикль

2

the —
определенный артикль

3

be —
быть

4

of —
предлог родительного падежа

5

and —
и

6

in —
в; через (о времени)

7

to —
к; в

8

have —
иметь

9

it —
это; он, она, оно (для неодуш.сущ.)

10

for —
для; ибо

11

I —
я

12

that —
тот; что

13

you —
ты, вы

14

he —
он

15

on —
на

16

with —
с

17

do —
делать

18

at —
у

19

by —
к; предлог творительного падежа

20

not —
не

21

this —
это

22

but —
но, кроме

23

from —
от

24

they —
они

25

his —
его

26

she —
она

27

or —
или

28

which —
который

29

as —
как; так как

30

we —
мы

31

say —
сказать

32

will —
вспом.глагол буд.вр.; воля

33

would —
бы

34

can —
уметь, мочь

35

if —
если

36

their —
их

37

go —
ходить, идти

38

what —
что

39

there —
там

40

all —
все

41

get —
получать

42

her —
ее

43

make —
делать

44

who —
кто

45

out —
вне

46

up —
вверх

47

see —
видеть

48

know —
знать

49

time —
время; раз

50

take —
брать

51

them —
им

52

some —
несколько, какой-то

53

could —
мог

54

so —
такой, поэтому

55

him —
ему

56

year —
год

57

into —
в

58

its —
его

59

then —
затем

60

think —
думать

61

my —
мой

62

come —
приходить

63

than —
чем

64

more —
больше

65

about —
о; около

66

now —
сейчас

67

last —
прошлый, продолжаться

68

your —
твой, ваш

69

me —
мне

70

no —
нет

71

other —
другой

72

give —
дать

73

just —
только что; справедливый

74

should —
следует

75

these —
эти

76

people —
люди

77

also —
также

78

well —
хорошо

79

any —
любой

80

only —
только; единственный

81

new —
новый

82

very —
очень; тот самый

83

when —
когда (вопросительное слово)

84

may —
мочь

85

way —
путь, способ

86

look —
смотреть, выглядеть; взгляд

87

like —
любить, нравиться; как

88

use —
использовать; применение

89

such —
такой

90

how —
как

91

because —
потому что

92

good —
хороший

93

find —
найти

94

man —
человек, мужчина

95

our —
наш

96

want —
хотеть

97

day —
день

98

between —
между

99

even —
даже

100

many —
много (для исчисляемых)

101

those —
те

102

after —
после

103

down —
внизу

104

yeah —
да

105

thing —
вещь

106

tell —
сказать (кому-то)

107

through —
сквозь

108

back —
назад; спина

109

still —
все еще; тихий

110

must —
должен

111

child —
ребенок

112

here —
здесь

113

over —
над, выше (предлог); пере-; движение через (наречие)

114

too —
тоже; слишком

115

put —
положить

116

own —
собственный

117

work —
работа, работать

118

become —
становиться

119

old —
старый

120

government —
правительство

121

mean —
иметь в виду

122

part —
часть

123

leave —
покинуть

124

life —
жизнь

125

great —
великий, великолепный

126

where —
где

127

case —
случай, коробка

128

woman —
женщина

129

seem —
казаться

130

same —
тот же самый

131

us —
нас

132

need —
нужда; нужно

133

feel —
чувствовать

134

each —
каждый

135

might —
(пр.вр. от may может быть)

136

much —
много (для неисчисл.), очень

137

ask —
спрашивать, задавать

138

group —
группа

139

number —
число, номер

140

yes —
да

141

however —
однако

142

another —
другой

143

again —
снова

144

world —
мир

145

area —
территория, площадь

146

show —
шоу, показывать

147

course —
курс

148

shall —
«вспом.глагол буд.вр.

149

under —
под

150

problem —
проблема

151

against —
против

152

never —
никогда

153

most —
самый

154

service —
служба

155

try —
стараться

156

call —
звонок; звать, звонить, называться

157

hand —
рука

158

party —
вечеринка; партия

159

high —
высоко, высокий

160

something —
что-то

161

school —
школа

162

small —
маленький

163

place —
место, размещать

164

before —
до

165

why —
почему

166

while —
в то время как, пока; промежуток времени

167

away —
вне

168

keep —
хранить, держать, продолжать

169

point —
точка; смысл; указывать

170

house —
дом

171

different —
различный

172

country —
страна; сельская местность

173

really —
в самом деле

174

provide —
обеспечить

175

week —
неделя

176

hold —
держать, проводить

177

large —
большой

178

member —
член

179

off —
от

180

always —
всегда

181

next —
следующий

182

follow —
следовать

183

without —
без

184

turn —
очередность; поворачивать

185

end —
конец, заканчивать

186

local —
местный

187

during —
в течение

188

bring —
нести

189

word —
слово

190

begin —
начинать

191

although —
хотя

192

example —
пример

193

family —
семья

194

rather —
скорее

195

fact —
факт

196

social —
общественный

197

write —
писать

198

state —
государство, штат; утверждать

199

percent —
процент

200

quite —
довольно

201

both —
оба

202

start —
старт; начинать

203

run —
бег, бежать

204

long —
длинный

205

right —
правый; право

206

set —
набор; установить

207

help —
помогать, помощь

208

every —
каждый

209

home —
дом, домашний

210

month —
месяц

211

side —
сторона

212

night —
ночь

213

important —
важный

214

eye —
глаз

215

head —
возглавлять; голова

216

question —
вопрос; сомневаться

217

play —
играть, пьеса

218

power —
власть, сила

219

money —
деньги

220

change —
изменение; сдача; менять

221

move —
двигаться

222

interest —
интерес; процент прибыли

223

order —
приказ; порядок; заказывать

224

book —
книга; заказать

225

often —
часто

226

young —
молодой

227

national —
национальный

228

pay —
платить

229

hear —
слышать

230

room —
комната

231

whether —
ли

232

water —
вода

233

form —
форма; бланк; формировать

234

car —
автомобиль

235

others —
другие

236

yet —
еще (не); однако

237

perhaps —
возможно

238

meet —
встретить, познакомиться

239

till —
до

240

though —
хотя

241

policy —
политика

242

include —
включать (в себя)

243

believe —
верить

244

already —
уже

245

possible —
возможный

246

nothing —
ничего

247

line —
линия

248

allow —
позволять

249

effect —
эффект

250

big —
большой

251

late —
поздний

252

lead —
руководство; вести

253

stand —
стоять; стойка

254

idea —
идея

255

study —
учеба; кабинет; учиться

256

lot —
много (в выраженииa lot)

257

live —
жить

258

job —
работа

259

since —
с (тех пор как)

260

name —
имя, называть

261

result —
результат

262

body —
тело

263

happen —
случаться

264

friend —
друг

265

least —
наименьший

266

almost —
почти

267

carry —
нести

268

authority —
власть

269

early —
рано

270

view —
взгляд; обозревать

271

himself —
(он) сам

272

public —
общественный; народ, публика

273

usually —
обычно

274

together —
вместе

275

talk —
беседа, беседовать

276

report —
доклад; сообщать

277

face —
лицо; стоять лицом к

278

sit —
сидеть

279

appear —
появляться

280

continue —
продолжать

281

able —
способный

282

political —
политический

283

hour —
час

284

rate —
пропорция; ставка

285

law —
закон

286

door —
дверь

287

company —
компания

288

court —
суд

289

fuck —
трахаться

290

little —
маленький, немного

291

because of —
из-за

292

office —
офис

293

let —
позволить

294

war —
война

295

reason —
причина

296

less —
менее

297

subject —
предмет

298

person —
лицо; человек

299

term —
термин; срок

300

full —
полный

301

sort —
сорт, вид; сортировать

302

require —
требовать

303

suggest —
предлагать, предполагать

304

far —
далеко

305

towards —
к

306

anything —
ничего

307

period —
период

308

read —
читать

309

society —
общество

310

process —
процесс

311

mother —
мать

312

offer —
предложение, предлагать

313

voice —
голос

314

once —
как только; однажды

315

police —
полиция

316

lose —
терять

317

add —
добавлять

318

probably —
вероятно

319

expect —
ожидать

320

ever —
коогда-нибудь

321

price —
цена

322

action —
действие

323

issue —
выпуск

324

remember —
помнить

325

position —
позиция

326

low —
низкий

327

matter —
дело, вопрос, факты; иметь значение

328

community —
община

329

remain —
оставаться

330

figure —
цифра

331

type —
тип

332

actually —
вообще-то

333

education —
образование

334

fall —
падать; упадок; осень (ам.)

335

speak —
говорить

336

few —
мало

337

today —
сегодня

338

enough —
достаточно

339

open —
открытый, открывать

340

bad —
плохой

341

buy —
покупать

342

minute —
минута

343

moment —
момент

344

girl —
девочка, девушка

345

age —
возраст

346

centre —
центр

347

stop —
остановка; остановить(-ся)

348

control —
контроль, контролировать

349

send —
посылать

350

health —
здоровье

351

decide —
решать

352

main —
главный

353

win —
победить; победа

354

wound —
рана; ранить

355

understand —
понимать

356

develop —
развивать

357

class —
класс

358

industry —
промышленность

359

receive —
получать

360

several —
несколько

361

return —
возвращение, возвращаться

362

build —
строить

363

spend —
проводить (время)

364

force —
сила, принуждать

365

condition —
условие

366

itself —
(он) сам

367

paper —
бумага; газета

368

themselves —
(они) сами

369

major —
главный

370

describe —
описывать

371

agree —
соглашаться

372

economic —
экономический

373

upon —
на

374

learn —
учить

375

general —
генерал; общий

376

century —
век

377

therefore —
поэтому

378

father —
отец

379

section —
раздел

380

patient —
терпеливый; пациент

381

around —
вокруг

382

activity —
мероприятие

383

road —
дорога

384

table —
стол

385

cow —
корова

386

including —
включающий

387

church —
церковь

388

reach —
достигать

389

real —
реальный

390

lie —
лгать

391

mind —
ум; возражать

392

likely —
вероятный

393

among —
среди

394

team —
команда

395

death —
смерть

396

soon —
скоро

397

act —
акт, действие; действовать

398

sense —
смысл; чувство; чувствовать

399

staff —
персонал

400

certain —
определенный

401

student —
студент

402

half —
половина

403

language —
язык

404

walk —
прогулка; ходить (пешком)

405

die —
умереть

406

special —
особый

407

difficult —
трудный

408

international —
международный

409

department —
отделение

410

management —
управление

411

morning —
утро

412

draw —
рисовать (карандашом)

413

hope —
надежда; надеяться

414

across —
через

415

plan —
план, планировать

416

product —
продукт

417

city —
город

418

committee —
комитет

419

ground —
земля

420

letter —
письмо; буква

421

create —
создавать

422

evidence —
свидетельство

423

foot —
нога

424

clear —
ясный, очищать

425

boy —
мальчик

426

game —
игра

427

food —
еда

428

role —
роль

429

practice —
практика

430

bank —
банк; берег

431

else —
еще

432

support —
поддержка, поддерживать

433

sell —
продавать

434

event —
событие

435

building —
здание

436

behind —
за, сзади

437

sure —
уверенный

438

pass —
передавать, проходить

439

black —
черный

440

stage —
стадия

441

meeting —
встреча

442

hi —
привет

443

sometimes —
иногда

444

thus —
таким образом

445

accept —
допускать

446

available —
наличный

447

town —
город

448

art —
искусство

449

further —
дальнейший

450

club —
клуб

451

arm —
рука

452

history —
история

453

parent —
родитель

454

land —
земля; приземляться

455

trade —
торговля, торговать

456

watch —
часы; наблюдать

457

white —
белый

458

situation —
ситуация

459

whose —
чей

460

ago —
назад

461

teacher —
учитель

462

record —
запись; записывать

463

manager —
управляющий, менеджер

464

relation —
связь, отношение

465

common —
общий

466

system —
система

467

strong —
сильный

468

whole —
целый

469

field —
поле

470

free —
свободный

471

break —
ломать; перерыв

472

yesterday —
вчера

473

window —
окно

474

account —
счет

475

explain —
объяснять

476

stay —
остановиться

477

wait —
ждать

478

material —
материал

479

air —
воздух

480

wife —
жена

481

cover —
крышка, покрывать

482

apply —
обращаться

483

love —
любить, любовь

484

project —
проект

485

raise —
поднимать

486

sale —
продажа

487

relationship —
отношение

488

indeed —
в самом деле

489

please —
пожалуйста

490

light —
светлый; легкий; свет

491

claim —
требование, требовать

492

base —
основа, база;базироваться

493

care —
заботиться; забота, осторожность

494

someone —
кто-то

495

everything —
всё

496

certainly —
конечно

497

rule —
правило; управлять

498

cut —
резать

499

grow —
расти, выращивать

500

similar —
подобный

501

story —
история, рассказ

502

quality —
качество

503

tax —
налог

504

worker —
рабочий

505

nature —
природа

506

structure —
структура

507

necessary —
необходимый

508

pound —
фунт

509

method —
метод

510

unit —
часть

511

central —
центральный

512

bed —
кровать

513

union —
союз

514

movement —
движение

515

board —
доска; совет

516

true —
правдивый

517

especially —
особенно

518

short —
короткий

519

personal —
личный

520

detail —
деталь

521

model —
модель

522

bear —
медведь;носить; рождать

523

single —
одинокий

524

join —
присоединяться

525

reduce —
сокращать

526

establish —
учреждать

527

herself —
(она) сама

528

wall —
стена

529

easy —
легкий

530

private —
частный

531

computer —
компьютер

532

former —
бывший

533

hospital —
больница

534

chapter —
глава

535

scheme —
схема, план

536

bye —
пока

537

consider —
полагать

538

council —
совет

539

development —
развитие

540

experience —
опыт

541

information —
информация

542

involve —
вовлекать

543

theory —
теория

544

within —
в

545

choose —
выбирать

546

wish —
желать; желание

547

property —
собственность

548

achieve —
достигать

549

financial —
финансовый

550

poor —
бедный

551

blow —
дуть

552

charge —
ответственность; загружать

553

director —
директор

554

drive —
водить (машину); катание, езда

555

approach —
подход, приближаться

556

chance —
шанс

557

application —
приложение

558

seek —
искать

559

cool —
крутой; прохладный

560

foreign —
иностранный

561

along —
вдоль

562

top —
верхний, верх

563

amount —
количество

564

son —
сын

565

operation —
операция

566

fail —
потерпеть неудачу

567

human —
человеческий,человек

568

opportunity —
возможность

569

simple —
простой

570

leader —
лидер

571

level —
уровень

572

production —
продукция

573

value —
стоимость

574

firm —
крепкий; фирма

575

picture —
картина

576

source —
источник

577

security —
безопасность

578

serve —
служить

579

according —
соответствие

580

business —
дело

581

decision —
решение

582

contract —
контакт

583

wide —
широкий

584

agreement —
соглашение

585

kill —
убивать

586

site —
место

587

either —
один из двух; тоже (не)

588

various —
разнообразный

589

screw —
закручивать

590

test —
тест; проверять

591

eat —
кушать

592

close —
близкий;закрывать

593

represent —
представлять

594

colour —
цвет

595

shop —
магазин

596

benefit —
выгода

597

animal —
животное

598

heart —
сердце

599

election —
выборы

600

purpose —
цель

601

due —
обязанный

602

secretary —
секретарь

603

rise —
восход; подниматься

604

date —
дата, датировать

605

hard —
упорно; тяжелый, упорный

606

music —
музыка

607

hair —
волосы

608

prepare —
приготовить

609

anyone —
кто-нибудь

610

pattern —
модель

611

manage —
управлять

612

piece —
кусок

613

discuss —
обсуждать

614

prove —
даказывать

615

front —
передняя часть, передний

616

evening —
вечер

617

royal —
королевский

618

tree —
дерево

619

population —
население

620

fine —
прекрасный

621

plant —
растение; завод; сажать

622

pressure —
давление

623

response —
ответ

624

catch —
хватать

625

street —
улица

626

knowledge —
знание

627

despite —
несмотря на

628

design —
дизайн, разрабатывать

629

kind —
вид; тип; добрый

630

page —
страница

631

enjoy —
наслаждаться

632

individual —
личный;частное лицо

633

rest —
остаток; отдых; отдыхать

634

instead —
вместо

635

wear —
носить

636

basis —
базис

637

size —
размер

638

fire —
огонь, пожар; поджигать

639

series —
ряд, серия

640

success —
успех

641

natural —
естественный

642

wrong —
неправильный

643

near —
около

644

round —
вокруг; круглый; круг

645

thought —
мысль

646

list —
список

647

argue —
спорить

648

final —
окончательный

649

future —
будущее

650

introduce —
знакомить

651

enter —
входить

652

space —
космос; место

653

arrive —
прибывать

654

ensure —
обеспечивать

655

statement —
утверждение

656

balcony —
балкон

657

attention —
внимание

658

principle —
принцип

659

pull —
тянуть

660

doctor —
доктор

661

choice —
выбор

662

refer —
ссылаться

663

feature —
особенность, функция

664

couple —
пара

665

step —
шаг; шагать

666

following —
следующий

667

thank —
благодарить

668

machine —
машина

669

income —
доход

670

training —
тренировка

671

present —
подарок; дарить; настоящий

672

association —
ассоциация

673

film —
фильм; пленка

674

difference —
различие

675

fucking —
проклятый

676

region —
регион

677

effort —
усилие

678

player —
игрок

679

everyone —
каждый

680

village —
деревня

681

organisation —
организация

682

whatever —
что бы ни было

683

news —
новости

684

nice —
замечательный

685

modern —
современный

686

cell —
ячейка; камера

687

current —
текущий

688

legal —
законный

689

energy —
энергия

690

finally —
окончательно

691

degree —
степень

692

mile —
миля

693

means —
средство

694

whom —
кем

695

treatment —
лечение

696

sound —
звук, звучать

697

above —
над

698

task —
задание

699

red —
красный

700

happy —
счастливый

701

behaviour —
поведение

702

identify —
распознавать

703

resource —
ресурс; источник

704

defence —
защита

705

garden —
сад

706

floor —
пол; этаж

707

technology —
технология

708

style —
стиль

709

feeling —
чувство

710

science —
наука

711

relate —
быть родственным

712

doubt —
сомнение, сомневаться

713

ok —
хорошо

714

produce —
производить

715

horse —
лошадь

716

answer —
ответ

717

compare —
сравнить

718

suffer —
страдать

719

forward —
вперед

720

announce —
объявлять

721

user —
пользователь

722

character —
герой

723

risk —
риск; рисковать

724

normal —
обычный

725

myself —
(я) сам

726

dog —
собака

727

obtain —
приобретать

728

quickly —
быстро

729

army —
армия

730

forget —
забывать

731

ill —
больной

732

station —
станция, участок

733

glass —
стекло; стакан

734

cup —
кружка

735

previous —
предыдущий

736

husband —
муж

737

recently —
недавно

738

publish —
публиковать

739

serious —
серьезный

740

anyway —
в любом случае

741

visit —
приходить в гости

742

capital —
столица

743

sock —
носок

744

note —
заметка, отмечать

745

season —
сезон; время года

746

argument —
спор

747

listen —
слушать

748

responsibility —
ответственность

749

significant —
значительный

750

deal —
некоторое количество; иметь дело

751

prime —
первичный

752

economy —
экономика

753

finish —
закончить

754

duty —
долг

755

fight —
бой, драка; сражаться

756

train —
поезд;тренировать

757

maintain —
обеспечивать

758

attempt —
попытка

759

leg —
нога

760

save —
беречь

761

suddenly —
вдруг

762

brother —
брат

763

improve —
улучшать

764

avoid —
избегать

765

teenager —
подросток

766

wonder —
хотеть знать; удивление

767

fun —
забава

768

title —
название

769

post —
почта; должность

770

hotel —
гостиница

771

aspect —
сторона, аспект

772

increase —
увеличивать

773

surname —
фамилия

774 — industrial — промышленный

775

express —
выражать

776

summer —
лето

777

determine —
определять

778

generally —
в общем

779

daughter —
дочь

780

exist —
существовать

781

used to —
бывало

782

share —
делить; акция

783

baby —
дитя

784

nearly —
около

785

smile —
улыбка, улыбаться

786

sorry —
извини

787

sea —
море

788

skill —
навык

789

treat —
лечить

790

remove —
удалить

791

concern —
забота, заботиться

792

university —
университет

793

left —
левый

794

dead —
мертвый

795

discussion —
обсуждение

796

specific —
особый

797

box —
ящик

798

outside —
вне

799

total —
всеобщий

800

bit —
немного

801

cost —
стоимость, стоить

802

girlfriend —
подружка

803

market —
рынок, купить или продать на рынке

804

occur —
иметь место

805

research —
исследование; исследовать

806

wonderful —
чудесный

807

division —
подразделение

808

throw —
выбрасывать

809

officer —
служащий

810

procedure —
процедура

811

fill —
вставлять

812

king —
король

813

assume —
допускать

814

image —
образ

815

oil —
нефть, масло

816

obviously —
очевидно

817

unless —
до тех пор пока не

818

appropriate —
подходящий

819

military —
военный

820

proposal —
предложение

821

mention —
упоминать

822

client —
клиент

823

sector —
сектор

824

direction —
направление

825

admit —
допускать

826

basic —
основной

827

instance —
пример

828

sign —
знак; подписывать

829

original —
оригинальный

830

successful —
успешный

831

reflect —
отражать

832

aware —
осознавать

833

pardon —
извините

834

measure —
мера, измерять

835

attitude —
отношение

836

yourself —
(тебя) самого

837

exactly —
точно

838

commission —
комиссия

839

beyond —
за пределами

840

seat —
сидение

841

president —
президент

842

encourage —
воодушевлять

843

addition —
дополнение

844

goal —
цель

845

miss —
скучать

846

popular —
популярный

847

affair —
дело

848

technique —
техника

849

respect —
уважение; уважать

850

drop —
капля, капать

851

professional —
профессиональный; профессионал

852

fly —
летать; муха

853

version —
версия

854

maybe —
может быть

855

ability —
способность

856

operate —
действовать

857

goods —
товар

858

campaign —
кампания

859

heavy —
тяжелый

860

advice —
совет

861

institution —
институт

862

discover —
открывать

863

surface —
поверхность

864

library —
библиотека

865

pupil —
ученик

866

refuse —
отказывать

867

prevent —
предотвращать

868

tasty —
вкусный

869

dark —
темный

870

teach —
учить (кого-либо)

871

memory —
память

872

culture —
культура

873

blood —
кровь

874

majority —
большинство

875

insane —
сумасшедший

876

variety —
разнообразие

877

depend —
зависеть

878

bill —
банкнота

879

competition —
соревнование

880

ready —
готовый

881

access —
доступ

882

hit —
ударить, толчок; нагревать

883

stone —
камень

884

useful —
полезный

885

extent —
расширение

886

employment —
занятость

887

regard —
внимание; принимать во внимание

888

apart —
отдельно

889

besides —
кроме того

890

shit —
дерьмо

891

text —
текст

892

parliament —
парламент

893

recent —
недавний

894

article —
статья

895

object —
предмет, объект

896

context —
контекст

897

notice —
извещение, заметить

898

complete —
полный; заполнить

899

direct —
прямой, управлять

900

immediately —
немедленно

901

collection —
коллекция

902

card —
карточка

903

interesting —
интересный

904

considerable —
значительный

905

television —
телевидение

906

agency —
агентство

907

except —
кроме

908

physical —
физический

909

check —
проверять, проверка

910

sun —
солнце

911

possibility —
возможность

912

species —
вид

913

speaker —
спикер, выступающий

914

second —
секунда

915

laugh —
смеяться

916

weight —
вес; авторитет

917

responsible —
ответственный

918

document —
документ

919

solution —
решение

920

medical —
медицинский

921

hot —
горячий, жаркий

922

budget —
бюджет

923

river —
река

924

fit —
подходящий

925

push —
толкать

926

tomorrow —
завтра

927

requirement —
требование

928

cold —
холодный; простуда

929

opposition —
оппозиция

930

opinion —
мнение

931

drug —
наркотик

932

quarter —
четверть, квартал

933

option —
опция, вариант

934

worth —
стоящий

935

define —
определять

936

influence —
влияние, влиять

937

occasion —
случай

938

software —
программное обеспечение

939

highly —
высоко

940

exchange —
обмен

941

lack —
отсутствие, недостаток; испытывать недостаток

942

concept —
понятие, концепция

943

blue —
синий

944

star —
звезда; играть главную роль

945

radio —
радио

946

arrangement —
приведение в порядок

947

examine —
проверять

948

bird —
птица

949

busy —
занятый, многолюдный

950

chair —
кресло

951

green —
зеленый

952

band —
(музыкальная) группа

953

sex —
пол

954

finger —
палец

955

independent —
независимый

956

equipment —
оборудование

957

north —
север

958

message —
послание

959

afternoon —
время после полудня

960

fear —
страх, бояться

961

drink —
пить; спиртной напиток

962

fully —
полностью

963

race —
раса; гонка

964

strategy —
стратегия

965

extra —
дополнительный

966

scene —
сцена

967

slightly —
слегка

968

kitchen —
кухня

969

arise —
подниматься

970

speech —
речь

971

network —
сеть

972

tea —
чай

973

peace —
мир

974

failure —
провал

975

employee —
работник

976

ahead —
вперед

977

scale —
шкала

978

attend —
посещать

979

hardly —
едва

980

shoulder —
плечо

981

otherwise —
по-другому

982

railway —
железная дорога

983

supply —
запас; снабжать

984

owner —
собственник

985

associate —
общаться

986

corner —
угол

987

past —
прошлый

988

match —
матч; спичка; соответствовать

989

sport —
спорт

990

beautiful —
красивый

991

hang —
висеть

992

marriage —
свадьба

993

civil —
гражданский

994

sentence —
предложение

995

crime —
преступление

996

ball —
мяч

997

marry —
жениться

998

wind —
ветер

999

truth —
правда

1000

protect —
защищать

Частотный словарь (1001 — 2000) 
·  Частотный
словарь (2001 — 3000)  ·
 Словари

Библиографическое описание:

Ржеуцкая, С. Ю. Программное обеспечение для формирования частотных словарей в процессе обучения английскому языку в техническом вузе / С. Ю. Ржеуцкая, Т. В. Мальцева. — Текст : непосредственный // Современные тенденции технических наук : материалы II Междунар. науч. конф. (г. Уфа, май 2013 г.). — Т. 0. — Уфа : Лето, 2013. — С. 14-16. — URL: https://moluch.ru/conf/tech/archive/74/3835/ (дата обращения: 24.05.2023).

Изучение иностранных языков — труд нелегкий, независимо от того, самостоятельно ли учится человек или под руководством преподавателя. Последний вариант, безусловно, представляется более предпочтительным, поскольку преподаватель, даже не являясь носителем языка, является носителем культуры изучения языков (или какого-либо конкретного иностранного языка), отражающей громадный опыт предыдущих поколений, тщательно выбиравших наиболее оптимальный путь для достижения поставленной цели. Тем не менее, современные информационные технологии способны внести определенные новшества, оптимизирующие процессы запоминания иностранных слов, чтения оригинальных текстов в определенной предметной области.

Интересным и сравнительно новым средством обучения, которое может помочь в освоении англоязычной профессионально-ориентированной лексики, являются частотные словари. Частотные словари отражают относительную частоту использования слов в каком-либо тексте, коллекции текстов определенной тематики или в разговорной практике.

Чем же может помочь частотный словарь преподавателю, студенту технического вуза? Прежде всего, частотный словарь, полученный путем анализа достаточно большого текстового фрагмента на английском языке (например, подборка англоязычных материалов из Интернета по теме «Databases»), демонстрирует богатство используемых англоязычных технических терминов. Также преподаватель, используя частотный словарь, может определить необходимый словарный запас своих студентов для успешного чтения того или иного текста. При этом, если текст достаточно большой, студенту в первую очередь необходимо изучить слова и сочетания слов, наиболее часто встречающиеся в нем (например, более двух-трех раз). Выделить такие слова и сочетания можно автоматически, сформировав частотный словарь на основе изучаемого текста или коллекции текстов по определенной теме. Таким образом, частотные словари позволяют оптимизировать процесс освоения англоязычной лексики, соответствующей будущей профессии студентов.

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

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

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

В процессе выполнения данного проекта была подобрана коллекция профессионально-ориентированных аутентичных текстов на английском языке по теме «Информационные технологии». Следует учитывать, что чем больше коллекция, тем более предметно-ориентированным получается частотный словарь.

При реализации проекта была выработана следующая стратегия обработки текстов:

1.                  Не учитываются слова, длина которых меньше трех букв.

2.                  Проводится процедура исключения словоформ (ведется поиск форм слов таких как: множественное/единственное число существительного, настоящее/прошедшее время глаголов)

3.                  Обрабатываются окончания –ing

4.                  Пропускаются слова из списка исключаемых слов (артикли, предлоги, союзы, а также слова, которые изучаются еще в школе).

5.                  Для словаря также исключаются слова, которые выбрал преподаватель, например, слова, которые студенты уже изучили.

При выборе методики решения были рассмотрены два способа представления данных: двоичные деревья и хэш-таблица. Приведем некоторые результаты сравнения:

1.         Сортировка результата. Если результат должен быть отсортирован, хеш-таблицы представляются не вполне подходящими, поскольку их элементы заносятся в таблицу в порядке, определяемом только их хеш-значениями. При проходе дерева в обратном порядке получаем отсортированный список.

2.         Память. Минимизация памяти, которая уходит на «накладные расходы», особенно важна, когда нужно хранить много маленьких узлов. Для хеш-таблиц требуется только один указатель на узел. Кроме того, требуется память под саму таблицу. Для двоичных деревьев необходимо хранить значения ключа, указатели на левое и правое поддерево.

3.         Время. Алгоритм должен быть эффективным. Это особенно важно, когда ожидаются большие объемы данных. Хеш-таблица работает быстрее.

По результатам сравнения для реализации был выбран метод на основе построения хеш-таблицы как наиболее оптимальный для решения данной задачи. С учетом вышеизложенного было разработано программное обеспечение для формирования частотных словарей в среде Visual C++ (Microsoft Visual Studio).

Перечислим основные результаты выполненного проекта:

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

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

3.                  Подобрана коллекция профессионально-ориентированных аутентичных текстов по теме «Информационные технологии».

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

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

Литература:

1.                  Алексеев П. М. Частотные словари: Учебное пособие. — СПб.: Изд-во С.-Петерб. Ун-та, 2001–156 с.

2.                  Ахо, А. Структуры данных и алгоритмы/ А.Ахо, Д. Хопкрофт, Д. Ульман; пер. с англ. — М.: Вильямс, 2000. — 384 с.

Основные термины (генерируются автоматически): частотный словарь, английский язык, слово, коллекция текстов, программное обеспечение, словарь, текст, результат сравнения, сочетание слов, частотный анализ.

0 / 0 / 0

Регистрация: 02.04.2013

Сообщений: 7

1

Вывести частотный словарь введенного текста

14.10.2013, 18:53. Показов 8983. Ответов 1


Студворк — интернет-сервис помощи студентам

Помогите,Плиз.
срочно нужно

Пользователь вводит n предложений на латинице. Вывести частотный словарь введенного текста. Регистр символов учитывать. Использовать Dictionary для подсчета слов. Ключ – слово, значение – количество повторений. Критерий: введенная информация содержит только символы латиницы



0



Courage

145 / 45 / 16

Регистрация: 10.10.2013

Сообщений: 110

14.10.2013, 19:51

2

Лучший ответ Сообщение было отмечено romanch как решение

Решение

держи

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   static void Main(string[] args)
        {
 
            string sentence = "";
            List<string> sentences = new List<string>();
            while (true)
            {
                Console.WriteLine("Ввведите  прердложение на латинеце ,   exit -  для выхода n");
 
                sentence = Console.ReadLine();
                if (sentence == "exit") break;
                sentences.Add(sentence);
            }
            Dictionary<string, int> vacabulary = new Dictionary<string, int>();
            foreach (string str in sentences)
            {
                foreach (string word in str.Split(new char[] { ' ', ',', '.' }
                    , StringSplitOptions.RemoveEmptyEntries))
                {
                    if (vacabulary.ContainsKey(word))
                    {
                        vacabulary[word]++;
                    }
                    else
                    {
                        vacabulary.Add(word, 1);
                    }
 
                }
            }
            foreach (KeyValuePair<string, int> pair in vacabulary)
            {
                Console.WriteLine(" word = {0} ; count =  {1} ", pair.Key, pair.Value);
            }
 
 
 
            Console.ReadLine();
        }



2



Понравилась статья? Поделить с друзьями:
  • Как найти файл в telnet
  • Как найти сертификаты на компьютере windows 10
  • Как составить проект публичного выступления
  • Как найти где лежат балки
  • Как найти перемещение точки физика