我读了很长的单词列表,并为列表中的每个单词创建了一个节点。每个节点都有一个属性' word'他们在名单中的位置。
我正在尝试将节点连接到下一个节点,如果下一个节点是上一个节点,只添加一个字母
我还按字母顺序为每个字符排序每个单词,以便CAT - > ACT
我想从每个唯一的起始词到所有可能的链绘制一条边,所以我可以在列表中看到所有可能的链。
例如
A - > AN - > TAN - > RANT
然而A - x-> Ť
这是我的尝试
for i in range(0, G.number_of_nodes()-1):
if ( ( (len(G.node[i]['word'])+1) == len(G.node[i+1]['word']) ) and (G.node[i]['word'] in G.node[i+1]['word'])):
print G.node[i]['word'], G.node[i+1]['word']
给我这个,
DGO DGOS DGOS DGOSS I IN ELLMS ELLMSS AEPRS AEPRSS INW DINW DINW DINWY
What the word list and the alphabetical list looks like
为什么我看不到IN INW?
此外,AGNRT AGNRST应该在那里,但我不明白为什么,以及很多其他对
你认为我哪里出错?
答案 0 :(得分:1)
问题在于,您只是比较列表中彼此相邻的单词,即单词i
和i+1
,例如I
和IN
彼此相邻,WIN
和WIND
也是如此,但IN
和WIND
相距甚远。您似乎想要比较所有可能的单词,这需要更复杂的算法。这是一个想法:
{"ACT": ["CAT", "ACT", "TAC], ...}
。 collections.defaultdict(list)
对此有用。list.sort(key=len)
。n-1
的每个子集。像for i in range(len(word)): process(word[:i] + word[i+1:])
这样的东西。您可能需要在此处注意重复。答案 1 :(得分:0)
您似乎只是将每个节点与另一个节点进行比较,所以
" IN"直接跟随"我"在你的单词列表中,但是" INW"不是直接在" IN"
之后答案 2 :(得分:0)
看起来像正式的语言问题。你如何处理循环节点?
IN INW在您提供的列表中。
AGNRT AGNRST不在列表中,因为你从一个字母开始,该字母必须在下一个单词中,例如I - > IN,但IN不在AGNRT或AGNRST
答案 3 :(得分:0)
您可以使用第三方python库python-levenshtein
来计算Levenshtein Distance这是字符串编辑距离。在您的情况下,唯一允许的“编辑”是列表中下一个字符串/单词上的字符“插入”,因此您还需要验证下一个单词的长度是否加上前一个单词。< / p>
以下是实现我们目标的示例代码:
import Levenshtein as lvst
if len(word2) - len(word1) == 1 and lvst.distance(word1, word2) == 1:
print(word1, word2)
您可以python-levenshtein
(全系统)或apt-get
安装pip
:
sudo apt-get install python-levenshtein
或
sudo apt-get install python3-levenshtein
或
pip install python-levenshtein