Ищем словарные слова в текстовом файле, используя словарь в python
Я прочитал, как проверить словарные слова, и у меня появилась идея проверить мой текстовый файл, используя словари. Я прочитал инструкцию по использованию penchant и подумал, что если я буду использовать get_tokenizer
вернуть мне все слова из словаря в текстовом файле.
Итак, вот где я застрял: я хочу, чтобы моя программа выдавала мне все группы словарных слов в виде абзаца. Как только он встречает какие-либо ненужные символы, считает, что абзац разрывается, и игнорирует все оттуда, пока не найдет Х число последовательных слов.
Я хочу, чтобы он прочитал текстовый файл в последовательности filename_nnn.txt
разбери и напиши parsed_filname_nnn.txt
, Я не удосужился сделать какие-либо манипуляции с файлами.
Что у меня так далеко:
import enchant
from enchant.tokenize import get_tokenizer, HTMLChunker
dictSentCheck = get_tokenizer("en_US")
sentCheck = raw_input("Check Sentense: ")
def check_dictionary():
outcome = dictCheck.check(wordCheck)
test = [w[0] for w in dictSentCheck(sentCheck)]
------ Пример текста -----
Английский крикет разрывает связи с Зимбабве в среду, 25 июня 2008 г. text & lt; void(0); & gt; & lt; void(0); & gt; & lt; void(0); & gt; email & lt; void(0); & gt; напечатайте EMAIL ЭТУ СТАТЬЮ ваше имя: ваш адрес электронной почты: имя получателя: адрес электронной почты получателя: & lt;; & gt; добавьте другого получателя свой комментарий: Отправить почту & lt; недействительным (0); & GT; закройте эту форму & lt; http://ad.au.doubleclick.net/jump/sbs.com.au/worldnews;sz=300x250;tile=2;ord=123456789?>;; Совет по крикету Англии и Уэльса (ЕЦБ) объявил о приостановке всех связей с Зимбабве и отмене тура Зимбабве по Англии в следующем году.
Скрипт должен вернуть:
Английский крикет разрывает связи с Зимбабве в среду
Совет по крикету Англии и Уэльса (ЕЦБ) объявил о приостановке всех связей с Зимбабве и отмене тура Зимбабве по Англии в следующем году.
Я принял ответ Абарнерта. Ниже мой последний сценарий. Обратите внимание, что это ОЧЕНЬ неэффективно, и некоторые должны быть убраны. Кроме того, отказ от ответственности я не кодировал с тех пор, как колледж долгое время назад.
import enchant
from enchant.tokenize import get_tokenizer
import os
def clean_files():
os.chdir("TARGET_DIRECTORY")
for files in os.listdir("."):
#get the numbers out file names
file_number = files[files.rfind("_")+1:files.rfind(".")]
#Print status to screen
print "Working on file: ", files
#Read and process original file
original_file = open("name_"+file_number+".txt", "r+")
read_original_file = original_file.read();
#Start the parsing of the files
token_words = tokenize_words(read_original_file)
parse_result = ('\n'.join(split_on_angle_brackets(token_words,file_number)))
original_file.close()
#Commit changes to parsed file
parsed_file = open("name_"+file_number+"_parse.txt", "wb")
parsed_file.write(parse_result);
parsed_file.close()
def tokenize_words(file_words):
tokenized_sentences = get_tokenizer("en_US")
word_tokens = tokenized_sentences(file_words)
token_result = [w[0] for w in word_tokens]
return token_result
def check_dictionary(dict_word):
check_word = enchant.Dict("en_US")
validated_word = check_word.check(dict_word)
return validated_word
def split_on_angle_brackets(token_words, file_number):
para = []
bracket_stack = 0
ignored_words_per_file = open("name_"+file_number+"_ignored_words.txt", "wb")
for word in token_words:
if bracket_stack:
if word == 'gt':
bracket_stack -= 1
elif word == 'lt':
bracket_stack += 1
else:
if word == 'lt':
if len(para) >= 7:
yield ' '.join(para)
para = []
bracket_stack = 1
elif word != 'amp':
if check_dictionary(word) == True:
para.append(word)
#print "append ", word
else:
print "Ignored word: ", word
ignored_words_per_file.write(word + " \n")
if para:
yield ' '.join(para)
#Close opened files
ignored_words_per_file.close()
clean_files()
1 ответ
Я до сих пор не уверен, в чем именно заключается ваша проблема или что должен делать ваш код.
Но эта строка кажется ключевой:
test = [w[0] for w in dictSentCheck(sentCheck)]
Это дает вам список всех слов. Это включает в себя такие вещи, как lt
а также gt
как слова И вы хотите раздеть что-нибудь внутри lt
а также gt
пара.
И, как вы говорите в своих комментариях, "я могу установить необходимое количество последовательных слов на 7".
Итак, как то так:
def split_on_angle_brackets(words):
para = []
bracket_stack = 0
for word in words:
if bracket_stack:
if word == 'gt':
bracket_stack -= 1
elif word == 'lt':
bracket_stack += 1
else:
if word == 'lt':
if len(para) >= 7:
yield ' '.join(para)
para = []
bracket_stack = 1
else:
para.append(word)
if para:
yield ' '.join(para)
Если вы используете его со своими образцами данных:
print('\n'.join(split_on_angle_brackets(test)))
Вы получаете это:
English cricket cuts ties with Zimbabwe Wednesday June text
print EMAIL THIS ARTICLE your name your email address recipient's name recipient's email address
add another recipient your comment Send Mail
The England and Wales Cricket Board ECB announced it was suspending all ties with Zimbabwe and was cancelling Zimbabwe's tour of England next year
Это не соответствует вашему примеру вывода, но я не могу придумать ни одного правила, которое обеспечивало бы ваш пример вывода, поэтому вместо этого я пытаюсь реализовать правило, которое вы описали.