0

辞書の単語を確認する方法を読み、辞書 を使用してテキスト ファイルを確認するというアイデアを思いつきました。私はpyenchantの指示を読みましたが、使用すればget_tokenizerテキスト ファイル内のすべての辞書の単語を返すことができると思いました。

ここで私は立ち往生しています: 私は自分のプログラムに、辞書の単語のすべてのグループを段落の形で提供してもらいたいのです。ジャンク文字に遭遇するとすぐに、段落の区切りと見なし、そこから X 個の連続する単語が見つかるまですべてを無視します。

の順序でテキスト ファイルを読み取り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)]

- - - サンプルテキスト - - -

2008 年 6 月 25 日水曜日、イングリッシュ クリケットはジンバブエとの関係を断ち切る text<void(0);><void(0);> <void(0);>電子メール <void(0);>この記事を電子メールで送信 あなたの名前: あなたの電子メール アドレス: 受信者の名前: 受信者の電子メール アドレス: <;>別の受信者を追加 あなたのコメント: メールを送信< ;ボイド(0);> このフォームを閉じる < http://ad.au.doubleclick.net/jump/sbs.com.au/worldnews;sz=300x250;tile=2;ord=123456789?> ; イングランドおよびウェールズ クリケット委員会 (ECB) は、ジンバブエとの関係をすべて停止し、来年のジンバブエのイングランド ツアーをキャンセルすると発表しました。

スクリプトは次を返す必要があります。

英国のクリケットは水曜日にジンバブエとの関係を断ち切る

イングランドおよびウェールズ クリケット委員会 (ECB) は、ジンバブエとの関係をすべて停止し、来年のジンバブエのイングランド ツアーをキャンセルすると発表しました。

abarnert の応答を受け入れました。以下は私の最終的なスクリプトです。これは非常に非効率的であり、一部をクリーンアップする必要があることに注意してください。また、私はずっと前に大学以来コーディングしていないという免責事項。

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()
4

1 に答える 1

0

あなたの問題が正確に何であるか、またはコードが何をすべきかはまだわかりません。

しかし、この行が鍵のようです:

test = [w[0] for w in dictSentCheck(sentCheck)]

これにより、すべての単語のリストが表示されます。言葉としてltや などを含みます。そして、 andペアgt内のすべてを取り除きたいとします。ltgt

そして、あなたのコメントにあるように、「必要な連続単語数を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

それはあなたのサンプル出力と一致しませんが、あなたのサンプル出力を提供するルールが思いつかないので、代わりにあなたが説明したルールを実装しようとしています.

于 2013-02-13T19:04:07.313 に答える