如何使用python具有相同的列和行标题?

时间:2013-01-19 11:12:53

标签: python matrix semantics

我想从文本文件中读取行,并根据单词之间的Wu-Palmer距离构建距离矩阵。例如:

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

我想知道我是否可以在python中使用任何现有函数从文本文件中读取行并将行输出为距离矩阵的行和列?

1 个答案:

答案 0 :(得分:1)

如果您的输入只是以空格分隔的单词,那么您可以像这样轻松地遍历它们:

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

set的使用确保每个单词只被记录一次 - 听起来就像你所追求的那样。

如果您的输入正在运行英文文本,那么事情会变得有点困难,因为您想要捕捉“我”这样的内容 - 您还应该决定是否将带连字符的单词(例如“兼职”)分类为单个单词 - 我的例子在这里,但它很容易改变。就像我不是他们的粉丝一样,这是正则表达式实际上非常有用的地方:

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个单词,其中一组字符是由[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())))

如果yuo想要更接近漂亮格式的输出矩阵(即每列根据其内容自动调整大小),那么它本身仍然不是 hard ,但它有点繁琐且需要更多的代码。

顺便说一句,如果您想以CSV格式读取或写入文件,那么请查看Python csv模块,它会处理繁琐的事情,例如为您报价。

那是你想要的那种东西吗?