我想从文本文件中读取行并根据单词之间的 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)
这将创建一个单词集
,其中一组字符是由集合[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模块,它会为您处理诸如引用之类的繁琐事情。
这就是你所追求的东西吗?
关于python - 如何使用 python 具有相同的列标题和行标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14413735/