1

テキスト ファイルから行を読み取り、単語間の Wu-Palmer 距離に基づいて距離行列を作成したいと考えています。例えば:

           House    Grass   Boat   Cat
House       x        y       ..    ..
Grass       x1       y1      ..    ..
Boat        x2       y2      ..    ..
Cat         x3       y3      ..    ..

テキストファイルから行を読み取り、行を距離マトリックスの行と列として出力するためにPythonで使用できる既存の関数があるかどうかを知りたいですか?

4

1 に答える 1

1

入力が単に空白で区切られた単語である場合、次のように簡単に繰り返すことができます。

words = set()
with open("input.txt", "r") as fd:
    for line in fd:
        words.update(line.split())

a を使用すると、set各単語が 1 回だけ記録されるようになります。

入力が英語のテキストを実行している場合、「I'd」などをキャッチする必要があるため、少し難しくなります。ハイフンでつながれた単語 (「パートタイム」など) を 1 つの単語として分類するかどうかも決定する必要があります。ここではそうしますが、簡単に変更できます。私はそれらのファンではありませんが、これは正規表現が実際に非常に役立つ場所です。

import re
import string

non_word_re = re.compile(r"[^-\w']+")
words = set()
with open("input.txt", "r") as fd:
    for line in fd:
        words.update(i for i in non_word_re.split(line) if i[0] in string.letters)

これsetにより、文字のグループがセットの 1 つ以上で構成され[a-zA-Z0-9_-']、最初の文字が文字である単語の が作成されます。

この後、単語の各ペア間の距離を簡単に計算できます。

all_distances = {}
for word in words:
    all_distances[word] = dict((i, calculate_distance(word, i)) for i in words)

ここには、ネストされた辞書よりもきれいなデータ構造があるかもしれませんが、それで十分だと思うほど単純です。

最後に、次のようなタブ区切りのマトリックスを出力できます。

with open("output.txt", "w") as fd:
    fd.write("\t" + "\t".join(sorted(all_distances.keys())) + "\n")
    for word1, distances in sorted(all_distances.iteritems()):
        fd.write(word1 + "\t" + "\t".join(i[1] for i in sorted(distances.iteritems())))

きれいにフォーマットされた出力行列 (つまり、各列がその内容に応じて自動的にサイズ変更される) に近いものが必要な場合、それ自体はまだ難しいことではありませんが、少し面倒で、かなり多くのコードが必要です。

余談ですが、CSV 形式のファイルを読み書きしたい場合は、Python csvモジュールを見てください。引用などの面倒なことを処理してくれます。

それはあなたが求めていたようなものでしたか?

于 2013-01-19T13:33:13.043 に答える