正则表达式帮助纠正错字

时间:2016-06-30 03:04:06

标签: php regex

我有数百个文档,其中一个单词拼写可能以疯狂的方式拼写。所以,想通过正则表达式搜索和重新修改 - php。

这是真实样本(不完整):

J U D G M E T
J U D E M E N T
JUDGEMENT
J U D G M F N T
J U D G NE N T
J U D G N E N T  
J U D G M E N FT
J U D G M E T
J U N C M E N T
J U D G M E F T
J U G M E N T
J U D G E M E N T
J U D E M E N T
J U D G R E N T
J U D G E N T
J U E G M E N T
J U D G M E M T
J u d g m e n t
JUDGMEAT
JUGMENT

正确的词是判断 以上列表不完整,可能存在各种拼写错误,无法检查所有文件。实际文件中两个字母之间可能有空格或没有空格,除第一个字母J外,字母可以是低位或大写混合。

基本上,JU很常见,休息时拼写错误。 什么应该是正则表达式模式匹配,以便每个位(或其中大部分,如果不是全部)可以修复。

对于8个字母的拼写错误,以下内容是否正常?我们对7个字母和9个字母进行同样的操作?

'/J\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?[a-zA-Z]{1}\s?/'

我们每个文档只会更换一次。

TIA

3 个答案:

答案 0 :(得分:2)

我会使用正则表达式和名为PHP的{​​{1}}函数的组合。

首先,regex selects a "word"以“J”开头,以“T”结尾),然后使用preg_replace_callback()挂钩替换。
如果levenshtein()距离低于5(或您设置的任何距离),则视为相似。

代码

levenshtein()

除了<?php $string = "J U D G M E T J U D E M E N T JUDGEMENT J U D G M F N T J U D G NE N T J U D G N E N T J U D G M E N FT J U D G M E T J U N C M E N T J U D G M E F T J U G M E N T J U D G E M E N T J U D E M E N T J U D G R E N T J U D G E N T J U E G M E N T J U D G M E M T J u d g m e n T JUDGMEAT JUGMENT JUT"; $regex = '~\bJ\h?(?:[a-z]\h?)+T\b~i'; $word = "JUDGEMENT"; $string = preg_replace_callback( $regex, function($match) use ($word) { $word2 = strtoupper(str_replace(' ', '', $match[0])); if (levenshtein($word, $word2) <= 2) return $word; else return $match[0]; // leave it }, $string); echo $string; ?> J U N C M E N T(考虑得太远)之外,它取代了上述所有内容。

演示

有关整个代码,请参阅a demo on ideone.com 感谢@Alan提供JUT提示。

答案 1 :(得分:1)

使用PHP并假设 - 如果我理解的话 - 您有多个文件,每行只有一个单词尝试。

我确信有很多解决方案,但这是我提出的2个。

第一个解决方案 - 如果您想完全猜测没有正确的单词列表:

1 - 我会首先删除所有\s+给予

JUDGMET
JUDEMENT
JUDGEMENT
JUDGMFNT
JUDGNENT
JUDGNENT
JUDGMENFT
JUDGMET
JUNCMENT
JUDGMEFT
JUGMENT
JUDGEMENT
JUDEMENT
JUDGRENT
JUDGENT
JUEGMENT
JUDGMEMT
Judgment
JUDGMEAT
JUGMENT

2 - strtoupper()一切,给予:

JUDGMET
JUDEMENT
JUDGEMENT
JUDGMFNT
JUDGNENT
JUDGNENT
JUDGMENFT
JUDGMET
JUNCMENT
JUDGMEFT
JUGMENT
JUDGEMENT
JUDEMENT
JUDGRENT
JUDGENT
JUEGMENT
JUDGMEMT
JUDGMENT
JUDGMEAT
JUGMENT

3 - foreach字母,找到最常用的并将其保存在数组中。然后,您将按正确的顺序创建包含字母的数组。 它将尽可能接近正确的拼写,但仍然需要人工检查。

4 - 然后用你的单词替换文件内容。

如果您假设有一个要检查的单词列表,则为第二个解决方案:

1 - 执行上一个解决方案的前两个步骤,

2 - 将新线词与正确词汇列表进行比较,

3 - 在循环中,如果匹配,则打破循环并保持正确的单词

4 - 用正确的单词替换文件内容

希望这就是你所需要的! :)

[编辑]评论后重新提出问题:

所以我误导了,但是我想分享我的解决方案代码,因为我认为它在数据挖掘方面非常有趣并且非常有用! :) 所以我在这里假设我们想要第一个解决方案。

<?php
$string =
"JUDGMET
JUDEMENT
JUDGEMENT
JUDGMFNT
JUDGNENT
JUDGNENT
JUDGMENFT
JUDGMET
JUNCMENT
JUDGMEFT
JUGMENT
JUDGEMENT
JUDEMENT
JUDGRENT
JUDGENT
JUEGMENT
JUDGMEMT
JUDGMENT
JUDGMEAT
JUGMENT";

$words = explode("\n", $string);
$letters = [];
$longestWord = '';

foreach ($words as $word) if (strlen($word) >= strlen($longestWord)) $longestWord = $word;

for ($i = 0; $i <= strlen($longestWord); $i++)
{
    foreach ($words as $wordCheck)
    {
        $letter = !isset($wordCheck{$i}) ? '' : $wordCheck{$i};
        if (!isset($lettersAtPosition[$i][$letter])) $lettersAtPosition[$i][$letter] = 0;
        $lettersAtPosition[$i][$letter]++;

        if ($lettersAtPosition[$i] == '') break;
        $flippedArray = array_flip($lettersAtPosition[$i]);
        krsort($flippedArray);
        $letters[$i] = array_shift($flippedArray);
    }
}

echo implode('', $letters);
?>

将输出JUDGMENT

答案 2 :(得分:0)

regex demo

[Jj] ?[Uu](?: ?\w)+

可以试试这个正则表达式