小记:为开端源项目多一个初成效的开进程

本篇文章未是为了记开发流水账,而是想管开进程的撞的问题和解决思路与大家进行交流以及上学。我是千篇一律称普通的
PHP
工程师,希望对初级开发同学有助。具体的心得体会见文末的总结

本月初,我以 GitHub
上开始源了一个自己之多少项目:chinese-typesetting。这是一个正中文文案排版的
Composer 包。

chinese-typesetting
包含以下功能:

  • 于华语和英文字母/用于数学、科学和工程的希腊字母/数字中添加空格;
  • 发出度的全角转半角(英文、数字、空格以及有特殊字符等用半竞赛字符);
  • 修补错误的标点;
  • 脱 HTML 标签的体;
  • 清除空的 HTML 标签;
  • 除掉段首缩进;

本周,公司支出业务不多,无加班,于是从头考虑新力量正英语专有名词大小写的实现。

英语专有名词的数量来源

首先,面临的第一只问题是:

英语专有名词的数码由哪来?

自我长想到的是 Python 有一个自然语言处理的包
NLTK,这个保险来只名为也 pos_tag
的函数,可以为此来辨别并标注每个单词的词性,其中深受标明为 NNP 或 NNPS
的单词就是专有名词(Proper Noun)。我猜,NLTK
数据包里应该生出一个遥相呼应之专有名词数据集,但是,苦于能力简单,我一直无找到。

上述的路线走不接后,我又经过 Google
搜索,发现经过网字典来获取数据是同一长中之方案。通过就无异法,终于在
Wiktionary
找到了英语专有名词列表。于是,利用 Python
写了一个爬虫小本子,爬取了相应的多少。

说到底,就是针对性爬取到之数据开展了片规整和筛。

罗方案如下:

  • 使用 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:这个 PR 是社区大神 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;
}

付出总结

  • 学会对上网;
  • 擅长 Google、Github 同
    StackOverflow,这三种“神器”会支援你解决掉开发进程中遇的多方(或者说所有)问题;
  • 学会一些 Google
    搜索小技巧。例如将搜关键字翻译成英语单词,这样的搜寻结果会使得而更惬意;
  • 英语真的挺要紧。最起码你应当当 Chrome 浏览器上设置一个 Google
    翻译
    的插件;
  • PHPUnit 真的非常有因此,特别是在频繁增改功能还是用代码重构的类别中。
  • 绝不吃投机才限于一个编程语言,学习另外一帮派要多帮派语言作为帮助,有益于拓展思路以及开辟眼界。
  • 大抵逛逛 Laravel China 这样的高格调社区;

末的言辞

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

相关文章