Python 计算两个列表之间编辑距离的最有效方法?

Python 计算两个列表之间编辑距离的最有效方法?,python,pandas,nltk,Python,Pandas,Nltk,我有两个文件,一个是CSV,另一个是文本文件。它们都包含Unicode单词。我的任务是比较这两个文件中的单词以纠正拼写错误。(CSV文件包含拼写错误的单词,文本文件包含正确的单词)CSV文件包含大约1000个单词,文本文件包含5000个单词。 我为这个任务实现了以下代码,因为我是python新手,所以效率非常低。有什么建议可以提高效率 import pandas as pd import nltk df = pd.read_csv('C:/mis_spel.csv',encoding='ut

我有两个文件,一个是CSV,另一个是文本文件。它们都包含Unicode单词。我的任务是比较这两个文件中的单词以纠正拼写错误。(CSV文件包含拼写错误的单词,文本文件包含正确的单词)CSV文件包含大约1000个单词,文本文件包含5000个单词。 我为这个任务实现了以下代码,因为我是python新手,所以效率非常低。有什么建议可以提高效率

import pandas as pd
import nltk
 
df = pd.read_csv('C:/mis_spel.csv',encoding='utf8')
list_check_words = df['words'].tolist()

df2 = pd.read_csv('C:/words.txt',encoding='utf8',delimiter='\t')
list_words = df2['word'].tolist()
 
for word in list_check_words:
    for dix in list_words:
        ed = nltk.edit_distance(word, dix)
        if (ed<2):
            print(word, dix, ed)
将熊猫作为pd导入
导入nltk
df=pd.read\u csv('C:/mis\u spel.csv',encoding='utf8')
列表检查单词=df['words'].tolist()
df2=pd.read\u csv('C:/words.txt',encoding='utf8',delimiter='\t')
list_words=df2['word'].tolist()
对于列表中的单词\u检查\u单词:
对于列表中的dix_单词:
编辑距离(单词,dix)

if(ed对于您的用例来说,这可能是一种过度的杀伤力,但无论如何,我还是把它放在这里。好吧,现在拼写自动更正的行业标准涉及到从单词嵌入的角度来看待这个问题。在过去,使用了基于n-gram的概率方法,但现在不再使用了

您想做的事情可能如下所示:

  • 训练模型生成字符级单词嵌入
  • 将整个字典投影到向量空间,并建立索引以进行高效搜索
  • 对于每个拼错的单词,将其与其最近的邻居配对
  • 我在下面添加了两篇不同文章的参考,这两篇文章更详细地解释了这一点。不过,有一个建议,请尝试从gensim探索索引,它对于“近似近邻”搜索速度非常快。从个人经验来看

    • 第1条:
    • 第2条:

    对于您的用例来说,这可能有点过头了,但无论如何,我还是把它放在这里。好吧,现在拼写自动更正的行业标准涉及到从单词嵌入的角度来看待问题。在过去,使用了基于n-gram的概率方法,但现在不再使用了

    您想做的事情可能如下所示:

  • 训练模型生成字符级单词嵌入
  • 将整个字典投影到向量空间,并建立索引以进行高效搜索
  • 对于每个拼错的单词,将其与其最近的邻居配对
  • 我在下面添加了两篇不同文章的参考,这两篇文章更详细地解释了这一点。不过,有一个建议,请尝试从gensim探索索引,它对于“近似近邻”搜索速度非常快。从个人经验来看

    • 第1条:
    • 第2条:

    您可以在
    df
    df2
    中添加一些作品作为示例,我们可以运行它来测试想法。我不知道是否会更快(但需要更多内存)但是您可以使用两个数据帧中单词的笛卡尔积创建数据帧,然后您可以使用一个数据帧而不是两个列表,并且您可以使用
    df.apply(nltk.edit_distance)
    。因为
    dataframe
    使用C/C++代码,所以它可以更快地工作。您可以在
    df
    df2
    中添加一些工作作为示例,我们可以运行它来测试想法。我不知道是否会更快(但它需要更多内存)但是您可以使用两个数据帧中单词的笛卡尔积创建数据帧,然后您可以使用一个数据帧而不是两个列表,并且您可以使用
    df.apply(nltk.edit_distance)
    。因为
    dataframe
    使用C/C++代码可以更快地工作。这是一个更大问题的一小部分,因此单词嵌入和深度学习似乎太复杂。我将研究索引。谢谢。这是一个更大问题的一小部分,因此单词嵌入和深度学习似乎太复杂。我将研究索引。谢谢。