-1

コンコーダンスを使用して、テキスト内の単語またはフレーズのインスタンスを検索し、見つかった単語/フレーズを辞書で探して、対応する値を返したいと考えています。ここに私がこれまでに持っているコードがあります。

from __future__ import division
import nltk, re, pprint
OutFileName = "shark_uri.txt"
OutFile = open(OutFileName, 'w')
book1 = open('shark_test.txt', 'rU').read() 
token1 = nltk.word_tokenize(book1)
text1 = nltk.Text(token1)
LineNumber = 0
for k, v in bio_dict.iteritems(): 
        text1.concordance(k)
    #if k is found then print v, else go on to next k
    if k #is found:
        OutFile.write(v)
        OutFile.write('\n')
        LineNumber += 1
    else
        LineNumber += 1
OutFile.close()

このコードは、shark_test.txt ファイル内のサメに関する段落を読み取る必要があります。bio_dict には、このようなキーと値のペアが含まれています

'ovoviviparous':'http://dbpedia.org/resource/Ovoviviparity', 
'predator':'http://dbpedia.org/resource/Predation',

キーは、プログラムが探している単語またはフレーズを表します。値は、単語/フレーズに対応する DBpedia URI です。「捕食者」のような単語がテキストで見つかった場合、プログラムは Predation の DBpedia URI を返すという考え方です。私は多くの奇妙な結果を得てきました.kがvを返すことがわかった場合、次のkに行くことをプログラムに伝える必要があるからだと思います。このためのプレースホルダーを上記のコード ブロックに入れました。Pythonでこれを表現する方法がよくわかりません。k == True の場合のようなものでしょうか? この条件がないと、キーが見つかったかどうかに関係なく、すべての値を出力する辞書を調べているように見えます。何かアドバイス?前もって感謝します。

4

2 に答える 2

1

bio_dictコードが現在機能している方法は、ディクショナリ内のすべてのキーと値のペアを反復処理してから、存在する場所concordanceの行を印刷するために使用することです。ここで重要なのは、を使用しても何も返されないということです。むしろ、単に印刷されます。したがって、戻り値(実際にはコードに含まれていません)を使用しようとしても、使用できません。を書くとき、これは常に-キーが空でない文字列であると仮定します(どのキーも評価されません)。text1kconcordance if k:TrueFalse

私があなたの問題を正しく理解しているなら、あなたは本当に全く使うべきではありませんconcordance。むしろ、次のようなことをしてください。

for word in token1:                        # Go through every word in your text
    if word in bio_dict:                   # Check if the word is in the dict
        OutFile.write(bio_dict[word]+'\n') # Output the value to your file

さらに、LineNumber入力ファイルを一度に読み取り、ですべてをトークン化するため、カウンターは実際には必要なものをカウントしませんtoken1。ただし、実際にはを使用しないためLineNumber、その変数を削除しても、目的の出力を得ることができます。

于 2013-03-13T21:27:24.140 に答える
-1

このコードで必要なものを何とか手に入れることができました。

from __future__ import division
import urllib
import re, pprint, time
in_file_name = "shark_id.txt"
in_file = open(in_file_name, 'r')
out_file_name = "shark_uri.txt"
out_file = open(out_file_name, 'w')

for line in in_file:                                                    
line = line.strip()                                             
address = 'http://eol.org/api/data_objects/1.0/' + line + '.xml'    
web_content = urllib.urlopen(address)                           
results = web_content.read().lower()                                        
temp_file_name = "Temp_file.xml"                                    
temp_file = open(temp_file_name, 'w')                               
temp_file.write(results)    
temp_file.close()                                           
print line
print len(results)              
temp_file = open('Temp_file.xml')
data = temp_file.read()
temp_file.close()
for k, v in bio_dict.iteritems():                           
    if k in data:                       
        out_file.write(line + ',')                                  
        out_file.write(k + ',')                                 
        out_file.write(v)                                       
        out_file.write('\n')                                        
time.sleep(.5)
in_file.close()                                                     
out_file.close()
于 2013-03-20T01:23:33.860 に答える