小记:为开源项目高居不下1个新效用的开支进程

本篇小说不是为了记开发流水账,而是想把付出进程的相遇的标题以及缓解思路和大家进行调换和上学。笔者是一名普通的
PHP
工程师,希望对初级开发同学有所扶助。具体的心体面会面文末的总结

开源项目学习进程

1、SqlBuilder项目 

2、ehcache

3、hibernate基本接纳

本月中,笔者在 GitHub
上开源了一个祥和的小项目:chinese-typesetting。那是一个改正中文文案排版的
Composer 包。

chinese-typesetting
包涵以下功效:

  • 在华语与英文字母/用于数学、科学和工程的希腊共和国(Ελληνική Δημοκρατία)字母/数字之间添加空格;
  • 有限度的全角转半角(英文、数字、空格以及部分特殊字符等选拔半角字符);
  • 修补错误的标点;
  • 打消 HTML 标签的样式;
  • 清除空的 HTML 标签;
  • 铲除段首缩进;

本周,公司开发工作不多,无加班,于是开端盘算新职能纠正罗马尼亚语专著名词大小写的实现。

印度语印尼语专闻名词的数码来源于

先是,面临的率先个难题是:

土耳其共和国(Türkiye Cumhuriyeti)语专有名词的数量从哪来?

自己初次想到的是 Python 有多少个自然语言处理的包
NLTK,那个包有个名为 pos_tag
的函数,能够用来甄别并标明每一个单词的词性,个中被标明为 NNP 或 NNPS
的单词正是专有名词(Proper Noun)。小编推断,NLTK
数据包里应该有贰个相应的专出名词数据集,可是,苦于能力简单,我平素未曾找到。

上述的不二法门走不通后,作者又经过 谷歌搜索,发现经过互连网字典来获取数据是一条有效的方案。通过这一方法,终于在
Wiktionary
找到了西班牙语专盛名词列表。于是,利用 Python
写了3个爬虫小本子,爬取了对应的多寡。

末尾,正是对爬取到的数目进行了一些整理和筛选。

筛选方案如下:

  • 使用 is_numeric() 方法,剔除诸如 007 等词汇;
  • 使用 '/\W/' 正则,剔除诸如 ǃXóõ 等词汇;
  • 剔除 strlen 方法,剔除 A 等单字节词汇;
  • 删去跟 HTML、CSS、JavaScript 保留字争辨的词汇;

什么让使用者定制专盛名词数据

中期的代码如下:

/**
 * 专有名词使用正确的大小写
 * Correct English proper nouns.
 *
 * @param $text
 *
 * @return null|string|string[]
 */
public function properNoun($text)
{
    $dict = include __DIR__ . '/../data/dict.php';
    foreach ($dict as $noun) {
        $text = preg_replace("/\b{$noun}\b/i", $noun, $text);
    }
    return $text;
}

然后想到,假诺使用那一个法子的开发者想增加或许忽视有个别专有名词,那该怎么做呢?
于是,我又将 properNoun() 方法改造如下:

/**
 * 专有名词使用正确的大小写
 * Correct English proper nouns.
 *
 * @param $text
 * @param array $extend
 * @param array $ignore
 *
 * @return null|string|string[]
 */
public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }

    foreach ($dict as $noun) {
        $text = preg_replace("/\b{$noun}\b/i", $noun, $text);
    }
    return $text;
}

什么样革新和优化代码逻辑

自家在写这几个效用的时候,也在研商和参考一些共处开源项指标实现逻辑。在察看开源项目
auto-correct 的一个
commit
上后(PS:那几个 P讴歌MDX 是社区大神 overtrue
提交的。),我又将 properNoun() 方法改造如下:

public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }
    foreach ($dict as $noun) {
        $text = preg_replace("/(?<!\.|[a-z]){$noun}(?!\.|[a-z])/i", $noun, $text);
    }
    return $text;
}

如何防止超负荷替换

在自家觉得就要大功告成的时候,笔者用事先写好的 PHPUnit
单元测试代码实行了测试,结果报出了错误,在上述办法中,即使传入的参数是含有
HTML 标签的富文本,那么 HTML 的要素、成分属性以及值都有或然会被沟通。

什么防止过度替换这么些题材呢?也正是说:

只替换文本,而忽视 HTML 标签及标签内部的始末?

小编尝试写了一些套匹配方案,都未果了。末了依旧请出了 谷歌(Google)大神来扶持。那里,搜索的关键字很重庆大学,最好想把你要寻找的要害词翻译成对应的英文单词,那样搜索出的结果会令你更中意。结果笔者找到了化解方案:Matching
A Word / Characters Outside Of Html
Tags

经过地点那部小说的提醒,作者又将 properNoun() 方法改造如下:

public function properNoun($text, array $extend = [], array $ignore = [])
{
    $dict = include __DIR__ . '/../data/dict.php';
    if ($extend) {
        $dict = array_merge($dict, $extend);
    }
    if ($ignore) {
        $dict = array_diff($dict, $ignore);
    }
    foreach ($dict as $noun) {
        // Matching proper nouns Outside Of Html Tags
        $text = preg_replace("/(?<!\.|[a-z]){$noun}(?!\.|[a-z])(?!([^<]+)?>)/i", $noun, $text);
    }
    return $text;
}

支出总括

  • 学会科学上网;
  • 善用 谷歌、Github 和
    StackOverflow,那三样“神器”会帮您化解掉开发进度中相遇的多方(可能说所有)问题;
  • 学会一些 谷歌(Google)搜索小技巧。例如将寻找关键字翻译成丹麦语单词,那样的摸索结果会令你更中意;
  • 斯洛伐克(Slovak)语真的很首要。最起码你应该在 Chrome 浏览器上设置二个 Google
    翻译

    的插件;
  • PHPUnit 真的很有用,尤其是在频仍增改功用如故须要代码重构的品类中。
  • 决不让投机仅限于2个编制程序语言,学习其余一门或多门语言作为帮助,有益于拓展思路和开发眼界。
  • 多逛逛 Laravel China 那样的高格调社区;

最后的话

如若还有如何要求说的话,那正是求 Star
啦,哈哈哈哈哈。项目地址:https://github.com/jxlwqq/chinese-typesetting

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图