0

2 つのドキュメントがあります。最初のドキュメントは、次のように作成された辞書である .txt ドキュメントです。

Box OB
Table OB
Tiger AN
Lion AN

2 番目のドキュメントは、長いテキストが入った .txt ファイルです。このようなものです。

箱入りです。その箱の中にライオンとトラがいます。

辞書にある単語がテキストに何回出現するかをリストしたいと思います。

このような種類:

Box: 2 
Lion: 1 
Tiger: 1

これは私がしたことです:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import codecs


file = codecs.open("MYtext.txt",'r','utf-8')
text = file.readlines()
line_list = []

for line in text:
    line.rstrip('\n')
    line_list.append(line)

d = {}
import nltk 
with open("MYdict.txt",) as mydict:
    for line in mydict:
        (key, val) = line.split()
        dictionary = dict(line.strip().split(None, 1) for line in mydict)

line_counter = 0
for line in line_list:
    line_counter = line_counter + 1

for word in line.split():
    if word in line_list in dictionary.keys():
        line_list = dictionary[word]
        line_list.append(line_counter)
        dictionary[word] = line_list
    else:
        line_list = []
        line_list.append(line_counter)
        dictionary[word] = line_list
for key in sorted(dictionary.keys()):
    print key, len(dictionary[key])

このエラーが発生しています

    $ /var/folders/3h/w3_12zfs7hs6zcrlnpk8gdg40000gn/T/Cleanup\ At\ Startup/test\ 44-405955317.432.py.command ; exit;
Traceback (most recent call last):
  File "/private/var/folders/3h/w3_12zfs7hs6zcrlnpk8gdg40000gn/T/Cleanup At Startup/test 44-405955317.367.py", line 33, in <module>
    for key in sorted(dictionary.keys()):
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
logout

[Process completed]

助けてください。私はこれが初めてです。私は言語学者であり、プログラマーではありません。

4

2 に答える 2

0

コードには、最初は発生しているエラーとは関係のない問題がいくつかあります。

importをファイルの先頭にグループ化する必要があります。行はコードのimport nltk途中にあってはなりません

最初に辞書を処理する必要があります。それについては、外側のループ ( for line in mydict) があり、その内側に別のループ (実際にはリスト内包表記) があります。良くない。以下を簡単に使用できます。

with open("MYdict.txt",) as mydict:
    dictionary = dict(line.strip().split(None, 1) for line in mydict)

ただし、文字列を小文字で保存することをお勧めします。

with open("MYdict.txt",) as mydict:
    dictionary = {x[0].lower(): x[1] for x in [line.strip().split(None, 1) for line in mydict]}

テキストから行を読み取り、削除して保存するには、次のsplitlinesように文字列のメソッドを使用できます。

with codecs.open("MYtext.txt",'r','utf-8') as mytext:
    line_list = mytext.read().splitlines()

ただし、すべての行を保存するのではなく、ファイルを 1 行ずつ処理することをお勧めします。

for行を数えるためにループを使用する必要はありません。を使用するだけlen(line_list)です。

コードの最後の部分で何をしたかよくわかりません。以前の変数 (line前のループなど) をいじり、line_list変数を上書きしているようです。

これはそれを行う1つの方法です:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import codecs

with open("MYdict.txt",) as mydict:
    dictionary = {x[0].lower(): x[1] for x in [line.strip().split(None, 1) for line in mydict]}

word_count = {}

with codecs.open("MYtext.txt",'r','utf-8') as mytext:
    for line in mytext:
        for word in line.strip().split():
            word = word.rstrip('.,')
            if word in dictionary.keys():
                word_count[word] = word_count.get(word, 0) + 1

for key in sorted(word_count, key=word_count.get, reverse=True):
    print "%s : %i" % (key, word_count[key])

もちろん、2 つの for ループを 1 つにマージすることもできます。for word in (line.strip().split() for line in mytext)

于 2013-11-12T13:21:18.717 に答える