菜单

开源项目学习进度

2019年3月9日 - Php

本篇小说不是为着记开发流水账,而是想把支付进程的相遇的题材以及缓解思路和大家实行沟通和读书。笔者是一名一般的
PHP
工程师,希望对初级开发同学有所补助。具体的心得体相会文末的总结

开源项目学习进度

1、SqlBuilder项目 

2、ehcache

3、hibernate基本选拔

本月中,笔者在 GitHub
上开源了三个融洽的小品种:chinese-typesetting。那是一个改进汉语文案排版的
Composer 包。

chinese-typesetting
包含以下功用:

本周,公司支出业务不多,无加班,于是从头思考新职能修正韩文专盛名词大小写的实现。

德语专有名词的数额出自

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

德语专盛名词的数目从哪来?

本人初次想到的是 Python 有2个自然语言处理的包
NLTK,那个包有个名为 pos_tag
的函数,能够用来辨别并标注每一个单词的词性,在那之中被标明为 NNP 或 NNPS
的单词就是专盛名词(Proper Noun)。小编估摸,NLTK
数据包里应该有二个对应的专盛名词数据集,不过,苦于能力有限,作者一贯尚未找到。

上述的途径走不通后,小编又通过 谷歌(Google)搜索,发现经过互联网字典来获取数据是一条有效的方案。通过这一措施,终于在
Wiktionary
找到了土耳其语专出名词列表。于是,利用 Python
写了3个爬虫小本子,爬取了对应的多寡。

末尾,就是对爬取到的数目进行了一些收拾和筛选。

筛选方案如下:

怎么让使用者定制专有名词数据

初期的代码如下:

/**
 * 专有名词使用正确的大小写
 * 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:这么些 PPAJERO 是社区大神 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 标签及标签内部的始末?

本人尝试写了一些套匹配方案,都未果了。最后依旧请出了 谷歌大神来增派。那里,搜索的关键字很重点,最好想把你要物色的机要词翻译成对应的英文单词,那样搜索出的结果会令你更惬意。结果自身找到了化解方案: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;
}

开发计算

末尾的话

万一还有哪些须要说的话,那便是求 Star
啦,哈哈哈哈哈。项目地址:https://github.com/jxlwqq/chinese-typesetting

相关文章

发表评论

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

网站地图xml地图