我有数百个文档,其中一个单词拼写可能以疯狂的方式拼写。所以,想通过正则表达式搜索和重新修改 - 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
答案 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)