- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有足够长的字符串(5000+ 个字符),我需要检查它是否是英文的。
经过简短的网络搜索,我找到了几种解决方案:
所以函数如下:
function is_english($str){
// Most used English chars frequencies
$chars = array(
array('e',12.702),
array('t', 9.056),
array('a', 8.167),
array('o', 7.507),
array('i', 6.966),
array('n', 6.749),
array('s', 6.327),
array('h', 6.094),
array('r', 5.987),
);
$str = strtolower($str);
$sum = 0;
foreach($chars as $key=>$char){
$i = substr_count($str,$char[0]);
$i = 100*$i/strlen($str); // Normalization
$i = $i/$char[1];
$sum += $i;
}
$avg = $sum/count($chars);
// Calculation of mean square value
$value = 0;
foreach($chars as $char)
$value += pow($char[2]-$avg,2);
// Average value
$value = $value / count($chars);
return $value;
}
通常此函数会估计字符频率并将其与给定模式进行比较。随着频率更接近模式,结果应该更接近 0。
不幸的是,它的效果不太好:大多数情况下,我可以认为结果 0.05 及更低是英语,而更高则不是。但是有许多英语字符串具有高值,而许多外国字符串(在我的例子中主要是德语)- 低。
我还不能实现第三解决方案,因为我找不到任何综合字符集 - 外语标记。
forth 看起来很吸引人,但我不知道用哪个标记最好。
有什么想法吗?
PS 经过一些讨论,Zod 提出这个问题与问题 Regular expression to match non-English characters? 重复。 , 仅部分回答。所以我想保持这个问题的独立性。
最佳答案
我认为第四种解决方案可能是您的最佳选择,但我会扩展它以包含更广泛的词典。
您可以在以下位置找到一些综合列表:https://en.wikipedia.org/wiki/Most_common_words_in_English
在您当前的实现中,您会遇到一些挫折,因为许多语言都使用标准的拉丁字母表。即使是超出标准拉丁字母表的语言通常也主要使用“符合英语的字符”,可以这么说。例如,句子“Ich bin lustig”是德语,但只使用拉丁字母字符。同样,“Jeg er glad”是丹麦语,但只使用拉丁字母字符。当然,在超过 5000 个字符的字符串中,您可能会看到一些非拉丁字符,但这并不能保证。此外,如果仅关注字符频率,您可能会发现使用拉丁字母表的外语通常具有相似的字符出现频率,从而使您现有的解决方案无效。
通过使用英语词典查找英语单词的出现次数,您可以查看一个字符串并准确确定有多少单词是英语,然后从那里计算英语单词数量的频率. (较高的百分比表示该句子可能是英语。)
以下是一个可能的解决方案:
<?php
$testString = "Some long string of text that you would like to test.";
// Words from: https://en.wikipedia.org/wiki/Most_common_words_in_English
$common_english_words = array('time', 'person', 'year', 'way', 'day', 'thing', 'man', 'world', 'life', 'hand', 'part', 'child', 'eye', 'woman', 'place', 'work', 'week', 'case', 'point', 'government', 'company', 'number', 'group', 'problem', 'fact', 'be', 'have', 'do', 'say', 'get', 'make', 'go', 'know', 'take', 'see', 'come', 'think', 'look', 'want', 'give', 'use', 'find', 'tell', 'ask', 'seem', 'feel', 'try', 'leave', 'call', 'good', 'new', 'first', 'last', 'long', 'great', 'little', 'own', 'other', 'old', 'right', 'big', 'high', 'different', 'small', 'large', 'next', 'early', 'young', 'important', 'few', 'public', 'bad', 'same', 'able', 'to', 'of', 'in', 'for', 'on', 'with', 'at', 'by', 'from', 'up', 'about', 'into', 'over', 'after', 'beneath', 'under', 'above', 'the', 'and', 'a', 'that', 'i', 'it', 'not', 'he', 'as', 'you', 'this', 'but', 'his', 'they', 'her', 'she', 'or', 'an', 'will', 'my', 'one', 'all', 'would', 'there', 'their', 'I', 'we', 'what', 'so', 'out', 'if', 'who', 'which', 'me', 'when', 'can', 'like', 'no', 'just', 'him', 'people', 'your', 'some', 'could', 'them', 'than', 'then', 'now', 'only', 'its', 'also', 'back', 'two', 'how', 'our', 'well', 'even', 'because', 'any', 'these', 'most', 'us');
/* you might also consider replacing "'s" with ' ', because 's is common in English
as a contraction and simply removing the single quote could throw off the frequency. */
$transformedTest = preg_replace('@\s+@', ' ', preg_replace("@[^a-zA-Z'\s]@", ' ', strtolower($testString)));
$splitTest = explode(' ', $transformedTest);
$matchCount = 0;
for($i=0;$i<count($splitTest);$i++){
if(in_array($splitTest[$i], $common_english_words))
$matchCount++;
}
echo "raw count: $matchCount\n<br>\nPercent: " . ($matchCount/count($common_english_words))*100 . "%\n<br>\n";
if(($matchCount/count($common_english_words)) > 0.5){
echo "More than half of the test string is English. Text is likely English.";
}else{
echo "Text is likely a foreign language.";
}
?>
您可以在此处查看一个示例,其中包含两个要测试的示例字符串(一个是德语,一个是英语):https://ideone.com/lfYcs2
在IDEOne代码中,在英文字符串上运行时,你会看到结果与常见的英文单词匹配率大约为69.3%。在德语上运行时,与常用英文单词的匹配率仅为4.57%。
关于php - 判断字符串是否为英文 : best and easiest practices?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751808/
在我的项目中,我使用了某种由外部团队编写的 SDK 库。这些图书馆正在使用 Prism。由于某些原因,我们不得不回滚到他们的 SDK 的以前版本,现在构建失败,试图找到对 Microsoft.Prac
我是基于 MVVM 的单元测试应用程序,它使用 prism 并使用模拟来测试 View 模型。我可以通过传递区域管理器和资源管理器的模拟对象来调用我的 viewmodel 类的构造函数,但是当控制进入
我需要将名为“practice”的列插入到表“cred_insurances”中,该表是一个 FK 引用表“practices” PK “id” 最佳答案 您需要通过在 mysql 提示符下运行以下命
我创建了一个项目来练习将 Git 与 Xcode 和 GitHub 结合使用。经过大量工作,我已经在本地和远程创建了存储库。我刚刚尝试提交并收到此错误: 这是我要 promise 的: 在出现此错误之
我正在考虑使用 DTO 而不是传递我的域对象。我在这里和其他地方都读过几篇文章,我知道有几种方法可以完成这项工作。 如果我总共只有大约 10 个域类,并且考虑到我想在我的 View (WPF 前端)中
我想知道 Django Rest Framework 的最佳实践。我一直通过每个用户使用不同的序列化程序(员工、帐户所有者、其他人)和 HTTP 方法来限制更改帐户上某些属性的访问权限,但我觉得这太不
场景:应用程序具有可以启用某些优化的算法。默认情况下,有些是打开的,有些是关闭的。在 Java 中是否有一种方便的方法来实现某种全局属性系统? 要求: 必须很容易两次使用不同的设置运行程序的多个实例
我的代码如下: public static final Condition.ActionCondition ACTION_CONDITION_ACTIVATE = new Condit
我从事嵌入式工作,我有一些管理硬件的软件模块。这个模块有状态,状态转换很复杂:根据事件,模块可以从状态 A 到状态 B 或者可能到 C .但是,当它退出某个状态时,它应该对硬件执行一些操作,以使其也保
考虑 an^2 + bn + c。我知道对于大的 n,bn 和 c 变得微不足道。 我还了解到,对于较大的 n,2n^2 和 n^2 之间的差异非常微不足道 n^2 和 n*log(n) 之间的区别。
我正在设计一个数据库并且我达到了(据我所知)Third Normal Form (3NF) 我的一些同事告诉我一个 Sixth Normal Form !!我想知道如何知道数据库的规范化水平是否足够。
我有一个.net 3.5网站,该网站使用Microsoft.Practices.EnterpriseLibrary调用数千个不同的存储过程。 我们已经遇到了很多超时,并且在播放和测试表末尾的(nolo
我使用 nuget 包管理器添加了最近的企业库,但在部署时(而不是在构建时)仍然低于错误。 包管理器:Install-Package EnterpriseLibrary.Data 谁能帮我 命名空间“
我一直在阅读关于版本控制主题的所有问题,但我认为我没有找到一个看起来像我自己的场景。 场景是: 我们有一个中型/大型 Web 应用程序,它有(至少应该有)一个部署到所有客户端的核心。当我们向客户演示应
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 8年前关闭
代码 (Java) 片段 ..... ..... if ( response.check() == checkNumber ) { String message = "You ar
我刚刚开始在我的(Delphi)应用程序中使用异常记录器(EurekaLog)。现在,我的应用程序每天都会通过电子邮件向我发送大量错误消息。这是我迄今为止发现的内容 大量重复错误 来自同一台电脑的多封
我想收集有关我的代码的特定例程的指标,以了解可以最好地优化的地方。让我们举一个简单的例子,假设我有一个包含多个“学生”的“类(class)”数据库。假设当前的代码为每个学生调用数据库,而不是一次性批量
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 2 年前。 Improv
我正在尝试加快查询速度。其中很多都非常复杂,目前我主要通过创建多个查询并通过联接链接它们来实现这一点。 这是最佳实践吗?还是我应该在 SELECT 中使用 SELECT 并尝试在一个查询中实现相同的目
我是一名优秀的程序员,十分优秀!