Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:difflib.get_close_匹配比较修改的文本但返回原始文本_Python_Nlp_Data Analysis_Data Cleaning_Difflib - Fatal编程技术网

Python:difflib.get_close_匹配比较修改的文本但返回原始文本

Python:difflib.get_close_匹配比较修改的文本但返回原始文本,python,nlp,data-analysis,data-cleaning,difflib,Python,Nlp,Data Analysis,Data Cleaning,Difflib,我从文本中提取了一个单词列表,但在文本预处理过程中,为了便于比较,我将所有单词都小写 我的问题是如何使列表中提取的单词与原始文本中完全相同 我尝试先标记原始文本,然后在这个标记化列表中找到与我从文本中提取的单词列表最接近的匹配项。我使用以下各项查找最接近的匹配项: nltk.edit_距离 difflib.get\u close\u匹配 但他们都没有按我的要求工作。他们以某种方式提取相似的单词,但与原文中出现的不完全相同。我认为问题在于这些方法对待小写和大写单词的方式不同 提取的单词可以是单格,

我从文本中提取了一个单词列表,但在文本预处理过程中,为了便于比较,我将所有单词都小写

我的问题是如何使列表中提取的单词与原始文本中完全相同

我尝试先标记原始文本,然后在这个标记化列表中找到与我从文本中提取的单词列表最接近的匹配项。我使用以下各项查找最接近的匹配项:

  • nltk.edit_距离
  • difflib.get\u close\u匹配
  • 但他们都没有按我的要求工作。他们以某种方式提取相似的单词,但与原文中出现的不完全相同。我认为问题在于这些方法对待小写和大写单词的方式不同

    提取的单词可以是单格,双格,最多5克

    例如:

    我从文本[rfid alert]中提取了以下二元图,但在原始文本中,它看起来是这样的[rfid alert]

    使用后

    difflib.get\u close\u matches('rfid警报',原始文本\u unigram\u令牌\u列表)

    它的输出是[profile Caller],而不是[RFID警报]。这是因为python区分大小写。我认为它发现
    原始文本unigram令牌列表中的bigram与[rfid alert]的不同字符数最少,是[profile Caller],因此它返回了[profile Caller]

    因此,我的问题是:是否有任何现成的方法或任何解决办法,我可以做返回原始形式的ngram,因为它出现在文本中准确?例如,我想获得[RFID alert]而不是上面示例中的[profile Caller],以此类推

    谢谢你的帮助。提前感谢。

    类似于,您可以获取和修改的源代码,并根据需要进行调整

    我所作的修改:

    • cutoff
      默认值提高到0.99(理论上它甚至可以是1.0,但为了确保数值误差不会影响结果,我传递了一个较小的数字)

    • s.set_seq1(x.lower())
      -以便在小写字符串之间进行比较(但返回原始
      x

    修改函数的完整代码:

    from difflib import SequenceMatcher, _nlargest  # necessary imports of functions used by modified get_close_matches
    
    def get_close_matches_lower(word, possibilities, n=3, cutoff=0.99):
        if not n >  0:
            raise ValueError("n must be > 0: %r" % (n,))
        if not 0.0 <= cutoff <= 1.0:
            raise ValueError("cutoff must be in [0.0, 1.0]: %r" % (cutoff,))
        result = []
        s = SequenceMatcher()
        s.set_seq2(word)
        for x in possibilities:
            s.set_seq1(x.lower())  # lower-case for comparison
            if s.real_quick_ratio() >= cutoff and \
               s.quick_ratio() >= cutoff and \
               s.ratio() >= cutoff:
                result.append((s.ratio(), x))
    
        # Move the best scorers to head of list
        result = _nlargest(n, result)
        # Strip scores for the best n matches
        return [x for score, x in result]
    
    印刷:

    ['RFID alert']
    

    你能提供一些例子(数据)吗?很抱歉没有给出一个例子。我更新了我的问题,加入了一个明确的例子。如果上面的例子不够清楚,你可以告诉我提供更多的例子。多谢各位@sophrosI非常感谢您对函数进行了如此大的修改。当我测试这个函数时,它确实非常适合我。但是我认为由于我的文本中存在一些文本清理问题,有时我需要将截止值改为0.6而不是0.99,以避免函数返回空列表的情况,而且它做得非常好,并且获得了匹配。再次感谢你@sophros@Bahgat-很高兴听到,也很乐意帮忙。请您在我的答案旁边单击灰色的勾号,将问题标记为已回答,好吗?非常感谢。谢谢你提醒我。当然,我现在做了。再次非常感谢你的大力帮助@索弗罗斯
    ['RFID alert']