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



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

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

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

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

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

使用set确保每个单词只记录一次-听起来像这是你想要的。

如果你输入的是英文文本,那么事情就会变得有点困难,因为你想抓住像"I’d"这样的东西——你还应该决定是否对连字符进行分类(例如:"part-time")作为一个单独的单词——我这里的例子就是这样,但是很容易改变。虽然我不是正则表达式的粉丝,但这是正则表达式实际上非常有用的地方:

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

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

作为题外话,如果你想读或写CSV格式的文件,那么看看Python的CSV模块,它会为你处理一些繁琐的事情,比如引用。

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

最新更新