精华内容
下载资源
问答
  • 使用PHPWordWord文件做模板替换

    千次阅读 2016-12-19 05:52:35
    因工作需要,使用了版本比较旧的PHPWord项目官方已不见维护更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM如果PHP版本>=5.3.3,强烈推荐使用PHPOffice/PHPWord这个开源项目本篇针对的为旧版本的PHPWord 基本...
        

    因工作需要,使用了版本比较旧的PHPWord项目
    官方已不见维护更新,上次版本更新是在Fri Jul 8, 2011 at 8:00 AM
    如果PHP版本>=5.3.3,强烈推荐使用PHPOffice/PHPWord这个开源项目
    本篇针对的为旧版本的PHPWord

    基本安装

    见官网

    问题总结

    Autoloader自动加载部分情况下失败

    在使用Yii 1配置自动加载时无法正常加载类库,需对其PHPWord/Autoloader.php做部分调整,这儿借鉴了PHPExcelAutoloader:

    /**
     * PHPWord_Autoloader
     */
    class PHPWord_Autoloader
    {
        /**
         * Register the Autoloader with SPL
         *
         */
        public static function Register() {
            $functions = spl_autoload_functions();  
            foreach ( $functions as  $function)  
                spl_autoload_unregister($function);  
            $functions = array_merge(array(array('PHPWord_Autoloader','Load')),$functions);  
            foreach ( $functions as $function)  
                $x = spl_autoload_register($function);  
            return $x; 
    
        }   //    function Register()
    
    
        /**
         * Autoload a class identified by name
         *
         * @param    string    $pClassName        Name of the object to load
         */
        public static function Load($pClassName){
            if ((class_exists($pClassName,FALSE)) || (strpos($pClassName, 'PHPWord') !== 0)) {
                //    Either already loaded, or not a PHPWord class request
                return FALSE;
            }
    
            $pClassFilePath = PHPWORD_BASE_PATH .
                              str_replace('_',DIRECTORY_SEPARATOR,$pClassName) .
                              '.php';
    
            if ((file_exists($pClassFilePath) === FALSE) || (is_readable($pClassFilePath) === FALSE)) {
                //    Can't load
                return FALSE;
            }
    
            require($pClassFilePath);
        }   //    function Load()
    
    }

    模板替换时无法识别模板标签

    表现

    1. 使用/复制官方样例的模板文件替换正常

    2. 自己手动敲出模板标签替换异常

    原因

    1. PHPWord的替换规则是将Word文件解析成XML进行替换处理,当Word解析成XML时字符分离了,导致匹配不上模板标签;

    2. 具体分析可参考一下资料:

    解决办法

    参考http://stackoverflow.com/a/21750677/5270710

    改进Template类:
    可参考Github: Arisse/PHPWord_CloneRowTemplate类进行改造。
    因为下面仍需要修改Template类,这儿暂时就不贴代码了,下面一并贴出改造后的代码。

    中文乱码

    参考CSDN: PHPWord利用模板替换字符串生成精确的word文档

    编辑PHPWord/Template.php,找到代码$replace = utf8_encode($replace);,删除或者注释掉这行代码,添加$replace = iconv( 'gbk','utf-8', $replace);,比如代码改为如下:

    /**
     * Set a Template value
     * 
     * @param mixed $search
     * @param mixed $replace
     */
    public function setValue($search, $replace) {
        if(substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
            $search = '${'.$search.'}';
        }
     
        if(!is_array($replace)) {
            //$replace = utf8_encode($replace);
            $replace =iconv('gbk', 'utf-8', $replace); // 注释掉上面行后添加这行
        }
     
        $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
    }

    空格输出

    参考CSDN: PhpWord 如何输出换行符到 word?

    在想要输出换行的地方用<w:br />代替即可.

    标记符号输出

    参考百度经验: 如何在word中选择打钩的方框
    仅以输出为例,其它符号与之类似。
    注:PHP文件需要使用UTF-8编码

    1. Word文件中按照参考文件方式插入

    2. 复制符号到PHP文件;

    3. 正常的输出替换。
      具体代码见如下的项目代码

    Template类代码

    // code
    /**
    * Set a Template value
    *
    * @param mixed $search
    * @param mixed $replace
    */
    public function setValue($search, $replace, $limit=-1) {
        if(substr($search, 0, 1) !== '{' && substr($search, -1) !== '}') {
            $search = '{'.$search.'}';
        }
        
        if(!is_array($replace)) {
            // $replace = utf8_encode($replace);
            // $replace = iconv( 'gbk','utf-8', $replace);
            $replace = str_replace("\n","<w:br />",$replace);
        }
    
        preg_match_all('/\{[^}]+\}/', $this->_documentXML, $matches);
        foreach ($matches[0] as $k => $match) {
            $no_tag = strip_tags($match);
            if ($no_tag == $search) {
                $match = '{'.$match.'}';
                $this->_documentXML = preg_replace($match, $replace, $this->_documentXML, $limit);    
                if ($limit == 1) {
                    break;
                }            
            }
        }
    }
    // code

    项目代码

    // @author Heier xheier@outlook.com
    public function actionExportPersonTable() {
        // 获取数据部分代码
        // ...
    
        $PHPWord = new PHPWord();
        
        // Word模板目录
        $personBasePath = Yii::app()->basePath.'/person/';
        
        // 删除目录下临时文件-十分钟以前
        $this->delfile( $personBasePath, 10 );
        
        // 模板文件名
        $tempName = $personBasePath . '/moban.docx';
        
        $word = $PHPWord->loadTemplate( $tempName );
        
        // 项目使用的是GBK编码,需要做转换
        $username = iconv('gbk', 'utf-8', getUserNameById($personData[0]['user_id']) );
        $personal_type = $personData[0]['personal_type'];
        
        // 模板替换开始
        // 可以输出打勾的方框
        $deptA=$deptBP=$deptB=$deptC=$deptD = '□';
        if( $DirectorLevel == 'A' ) {
            $deptA = '☑';
        } elseif( $DirectorLevel == 'B+' ) {
            $deptBP = '☑';
        } elseif( $DirectorLevel == 'B' ) {
            $deptB = '☑';
        } elseif( $DirectorLevel == 'C' ) {
            $deptC = '☑';
        } elseif( $DirectorLevel == 'D' ) {
            $deptD = '☑';
        }
    
        $word->setValue('deptA', $deptA);
        $word->setValue('deptBP', $deptBP);
        $word->setValue('deptB', $deptB);
        $word->setValue('deptC', $deptC);
        $word->setValue('deptD', $deptD);
    
        // 设置其它替换
        // ...
        
        // 生成临时文件以供下载
        $tmpFileName = md5( time().'Heier' );
        
        $word->save($personBasePath . '/' . $tmpFileName .'.docx');
        $file = $personBasePath . '/' . $tmpFileName .'.docx';
        
        // 下载Word文件
        ob_start(); //打开缓冲区
        $fp = fopen($file,"r");
        $file_size = filesize($file);
        $downFileName = 'XXX.docx';
        
        header("Cache-Control: public");
        header("Content-type: application/octet-stream");
        header("Accept-Ranges: bytes");
        header("Content-Disposition: attachment; filename={$downFileName}");
        header("Pragma:no-cache");
        header("Expires:0");
        $buffer = 1024;
        $file_count = 0;
        //向浏览输出回数据
        while(!feof($fp) && $file_count < $file_size){
            $file_con = fread($fp,$buffer);
            $file_count += $buffer;
            echo $file_con;
        }
        ob_end_flush();//输出全部内容到浏览器
    }

    参考文档汇总

    1. CodePlex: PHPWord;

    2. Github: PHPOffice/PHPWord;

    3. phpword: setValue() not working;

    4. stackoverflow: PhpWord doesn't replace text;

    5. Github: Arisse/PHPWord_CloneRow;

    6. CSDN: PHPWord利用模板替换字符串生成精确的word文档;

    7. CSDN: PhpWord 如何输出换行符到 word?

    关于我

    文章转载自我的博客:
    Heier Blog: 使用PHPWord对Word文件做模板替换

    展开全文
  • vim全局,局部查找 替换字符串

    千次阅读 2017-08-15 09:40:35
    查找 在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车。 Vim会跳转到第一个匹配。...注意查找回车应当用\n,而替换为回车应当用\r(相当于)。 大小写敏感查找 在查找模式

    查找

    在normal模式下按下/即可进入查找模式,输入要查找的字符串并按下回车。 Vim会跳转到第一个匹配。按下n查找下一个,按下N查找上一个。

    Vim查找支持正则表达式,例如/vim$匹配行尾的"vim"。 需要查找特殊字符需要转义,例如/vim\$匹配"vim$"

    注意查找回车应当用\n,而替换为回车应当用\r(相当于<CR>)。

    大小写敏感查找

    在查找模式中加入\c表示大小写不敏感查找,\C表示大小写敏感查找。例如:

    /foo\c
    

    将会查找所有的"foo","FOO","Foo"等字符串。

    大小写敏感配置

    Vim 默认采用大小写敏感的查找,为了方便我们常常将其配置为大小写不敏感:

    " 设置默认进行大小写不敏感查找
    set ignorecase
    " 如果有一个大写字母,则切换到大小写敏感查找
    set smartcase 
    

    将上述设置粘贴到你的~/.vimrc,重新打开Vim即可生效。

    查找当前单词

    在normal模式下按下*即可查找光标所在单词(word), 要求每次出现的前后为空白字符或标点符号。例如当前为foo, 可以匹配foo bar中的foo,但不可匹配foobar中的foo。 这在查找函数名、变量名时非常有用。

    按下g*即可查找光标所在单词的字符序列,每次出现前后字符无要求。 即foo barfoobar中的foo均可被匹配到。

    查找与替换

    :s(substitute)命令用来查找和替换字符串。语法如下:

    :{作用范围}s/{目标}/{替换}/{替换标志}
    

    例如:%s/foo/bar/g会在全局范围(%)查找foo并替换为bar,所有出现都会被替换(g)。

    作用范围

    作用范围分为当前行、全文、选区等等。

    当前行:

    :s/foo/bar/g
    

    全文:

    :%s/foo/bar/g
    

    选区,在Visual模式下选择区域后输入:,Vim即可自动补全为 :'<,'>

    :'<,'>s/foo/bar/g
    

    2-11行:

    :5,12s/foo/bar/g
    

    当前行.与接下来两行+2

    :.,+2s/foo/bar/g
    

    替换标志

    上文中命令结尾的g即是替换标志之一,表示全局global替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:

    空替换标志表示只替换从光标位置开始,目标的第一次出现:

    :%s/foo/bar
    

    i表示大小写不敏感查找,I表示大小写敏感:

    :%s/foo/bar/i
    # 等效于模式中的\c(不敏感)或\C(敏感)
    :%s/foo\c/bar
    

    c表示需要确认,例如全局查找"foo"替换为"bar"并且需要确认:

    :%s/foo/bar/gc
    

    回车后Vim会将光标移动到每一次"foo"出现的位置,并提示

    replace with bar (y/n/a/q/l/^E/^Y)?
    

    按下y表示替换,n表示不替换,a表示替换所有,q表示退出查找模式, l表示替换当前位置并退出。^E^Y是光标移动快捷键,参考: Vim中如何快速进行光标移动

    高亮设置

    高亮颜色设置

    如果你像我一样觉得高亮的颜色不太舒服,可以在 ~/.vimrc 中进行设置:

    highlight Search ctermbg=yellow ctermfg=black 
    highlight IncSearch ctermbg=black ctermfg=yellow 
    highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE
    

    上述配置指定 Search 结果的前景色(foreground)为黑色,背景色(background)为灰色; 渐进搜索的前景色为黑色,背景色为黄色;光标处的字符加下划线。

    更多的CTERM颜色可以查阅:http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim

    禁用/启用高亮

    有木有觉得每次查找替换后 Vim 仍然高亮着搜索结果? 可以手动让它停止高亮,在normal模式下输入:

    :nohighlight
    " 等效于
    :nohl
    

    其实上述命令禁用了所有高亮,只禁用搜索高亮的命令是:set nohlsearch。 下次搜索时需要:set hlsearch再次启动搜索高亮。

    延时禁用

    怎么能够让Vim查找/替换后一段时间自动取消高亮,发生查找时自动开启呢?

    " 当光标一段时间保持不动了,就禁用高亮
    autocmd cursorhold * set nohlsearch
    " 当输入查找命令时,再启用高亮
    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    noremap * *:set hlsearch<cr>
    

    将上述配置粘贴到~/.vimrc,重新打开vim即可生效。

    一键禁用

    如果延时禁用搜索高亮仍然不够舒服,可以设置快捷键来一键禁用/开启搜索高亮:

    noremap n :set hlsearch<cr>n
    noremap N :set hlsearch<cr>N
    noremap / :set hlsearch<cr>/
    noremap ? :set hlsearch<cr>?
    noremap * *:set hlsearch<cr>
    
    nnoremap <c-h> :call DisableHighlight()<cr>
    function! DisableHighlight()
        set nohlsearch
    endfunc
    

    希望关闭高亮时只需要按下 Ctrl+H,当发生下次搜索时又会自动启用。


    展开全文
  • 替换命令s/ /g 正则表达式 0.第2到5行,把 abc 替换成 your_word:2,5 s/abc/your_word/g 1.文件内全部替换:% s#abc#123#g...2.文件内局部替换::20,30s#abc#123/g(如文件内有#,可用/替换,:%s/abc/123/g) --注:把20...
    • 替换命令  s/  /g

    正则表达式

    0. 第2到5行,把 abc 替换成 your_word  :2,5 s/abc/your_word/g

    1.文件内全部替换  :% s#abc#123#g (如文件内有#,可用/替换, :%s/abc/123/g ) --注:把abc替换成123 (或者: %s/str1/str2/g 用str2替换文件中所有的str1...

    2.文件内局部替换: :20,30 s#abc#123/g (如文件内有#,可用/替换, :%s/abc/123/g ) --注:把20行到30行内abc替换成123

    3. 对指定行的行首添加注释,即把行首用//来代替  :16,17 s/^/\/\//g

    4. 用 ^表示行首,用$表示行尾,行首插入,    :%s/^/your_word/    行尾插入  :%s/$/your_word/

    5. 替换字符串中的 / 需用转义符 \ 转义,即用"\/"表示。所以添加或删除注释符号 //  时用 \/\/ 来表示。比如:

     第2到5行首添加注释用  :2,5 s/^/ \/\/ /g     第2到5行首删除注释用  :2,5 s/ ^\/\/ /  /g 

    当然如果此行只有一个注释符 //,无须再特别指定其位置是在行首了,直接找到替换就行  :2,5 s/ \/\/ /  /g

    按键操作:ctrl+v 进入列编辑模式,向下或向上移动光标,把需要注释的行的开头标记起来,然后按大写的I,再插入注释符,比如”#”,再按Esc,就会全部注释了。

    删除:先按v,进入visual模式,横向选中列的个数(如”#”注释符号,需要选中两列),再按Esc,再按ctrl+v 进入列编辑模式,向下或向上移动光标,选中注释部分,然后按d, 就会删除注释符号。

    使用替换命令:

    在全部内容的行首添加//号注释    :% s/^/\/\//:g

    在2~50行首添加//号注释     :2,50 s/^/\/\//g

    在2~50行首删除//号    :2,50 s/^\/\///g

    展开全文
  • word2vector使用

    千次阅读 2015-07-31 21:58:36
    Google的Word2Vector官网:https://code.google.com/p/word2vec/ 下载下来的Demo源码文件共有如下几个: word2vec – Revision 41: /trunk … LICENSE //Apache LICENSE README.txt //工具使用说明 compute-...

    Google的Word2Vector官网:https://code.google.com/p/word2vec/

    下载下来的Demo源码文件共有如下几个:
    word2vec – Revision 41: /trunk

    LICENSE //Apache LICENSE
    README.txt //工具使用说明
    compute-accuracy.c
    demo-analogy.sh  //
    demo-classes.sh  //词聚类的示例脚本
    demo-phrase-accuracy.sh
    demo-phrases.sh  //
    demo-train-big-model-v1.sh
    demo-word-accuracy.sh
    demo-word.sh
    distance.c
    makefile
    questions-phrases.txt
    questions-words.txt
    word-analogy.c
    word2phrase.c
    word2vec.c

    【快速入门】:1. 从http://word2vec.googlecode.com/svn/trunk/ 下载所有相关代码(所有的文件如上);
    2. 运行make编译word2vec工具:Makefile的编译代码在makefile.txt文件中,先改名makefile.txt 为Makefile,然后在当前目录下执行make进行编译,生成可执行文件(编译过程中报出很出Warning,暂且不管);
    3. 运行示例脚本:./demo-word.sh 和 ./demo-phrases.sh:看一下./demo-word.sh的内容,大致执行了3步操作
    a). 从http://mattmahoney.net/dc/text8.zip 下载了一个文件text8 ( 一个解压后不到100M的txt文件,可自己下载并解压放到同级目录下),
    b). 执行word2vec生成词向量到 vectors.bin文件中,(速度比较快,几分钟的事情)
    [root@localhost /home/jacoxu/word2vec]$./demo-word.sh
    make: Nothing to be done for `all’.
    Starting training using file text8
    Vocab size: 71291
    Words in train file: 16718843
    Alpha: 0.000560 Progress: 98.88% Words/thread/sec: -117.11k
    c). 执行./distance vectors.bin可以进入一个计算word相似度的demo中去,如下:
    Enter word or sentence (EXIT to break): china

    Word: china Position in vocabulary: 486

    Word Cosine distance (找到了很多和china共现度很高的词汇,可以得到认可)
    ————————————————————————
    taiwan 0.656181
    japan 0.633499
    tibet 0.607813
    manchuria 0.581230
    hainan 0.561931
    xiamen 0.555860
    chongqing 0.550099
    jiang 0.549195
    chinese 0.548320
    liao 0.548220

    Enter word or sentence (EXIT to break): hongkong

    Word: hongkong Position in vocabulary: 24623

    Word Cosine distance(感觉效果很糟糕,有些不知所云,认可度很低,主要还是因为语料太少,覆盖面窄)
    ————————————————————————
    jardines 0.708792
    matheson 0.659444
    jardine 0.611295
    shareholding 0.489012
    company 0.431918
    kowloon 0.417640
    firm 0.415780
    venture 0.415077
    plc 0.409350
    shanghai 0.404716

    然后看一下./demo-phrases.sh的内容,也大致执行了3步操作:
    a). 从http://www.statmt.org/wmt14/training-monolingual-news-crawl/news.2012.en.shuffled.gz 下载了一个文件news.2012.en.shuffled.gz ( 一个解压到1.7G的txt文件,可自己下载并解压放到同级目录下);
    b). 将文件中的内容拆分成 phrases,然后执行./word2vec生成短语向量到 vectors-phrase.bin文件中(数据量大,速度慢,将近半个小时),如下:
    [root@localhost /home/jacoxu/word2vec]$ bash demo-phrases.sh (总耗时75分钟)
    make: Nothing to be done for `all’.
    Starting training using file news.2012.en.shuffled-norm0
    Words processed: 296900K Vocab size: 33198K
    Vocab size (unigrams + bigrams): 18838711
    Words in train file: 296901342
    Words written: 296900K
    real 11m1.465s
    user 10m47.888s
    sys 0m8.317s
    Starting training using file news.2012.en.shuffled-norm0-phrase0
    Words processed: 280500K Vocab size: 38761K
    Vocab size (unigrams + bigrams): 21728781
    Words in train file: 280513979
    Words written: 280500K
    real 10m43.277s
    user 10m29.983s
    sys 0m8.137s
    Starting training using file news.2012.en.shuffled-norm1-phrase1
    Vocab size: 681320
    Words in train file: 283545447
    Alpha: 0.000005 Progress: 100.00% Words/thread/sec: 83.67k
    real 49m3.925s
    user 847m21.369s
    sys 1m11.140s

    c). 执行./distance vectors-phrase.bin 可以进入一个计算word相似度的demo中去,如下:
    Enter word or sentence (EXIT to break): great_wall

    Word: great_wall Position in vocabulary: 36052

    Word Cosine distance (确实找到一些极为相关的词汇)
    ————————————————————————
    mutianyu 0.588232
    terra_cotta_warriors 0.541900
    forbidden_city 0.527797
    changsha 0.520975
    based_koryo_tours 0.510810
    three_gorges 0.509765
    world’s_tallest 0.501899
    dajie 0.500128
    ming_dynasty 0.496112
    qin_shihuang 0.486954

    Enter word or sentence (EXIT to break): hong_kong

    Word: hong_kong Position in vocabulary: 2322

    Word Cosine distance (并没有任何体现Hong Kong本土的词汇,仍是语料的问题)
    ————————————————————————
    singapore 0.755051
    mainland_china 0.739481
    shanghai 0.732764
    hong_kong’s 0.727834
    mainland_chinese 0.652696
    singapore’s 0.636082
    keith_bradsher_contributed_reporting 0.626221
    hang_seng_index_fell 0.621854
    chinese 0.617985
    taipei 0.609921

    【其他】:Java版本Word2Vector

    词向量的训练最经典的有 3 个工作,C&W 2008、M&H 2008、Mikolov 2010,看看其他几个版本的Word Embedding:
    (以下大部分内容摘自Zhao老板的学生licstar)
    1. 【C&W 的 SENNA – 2008】
    ■ 训练语料及规模:English Wikipedia + Reuters RCV1 共 631M + 221M 词;
    ■ 词向量:130000 词,50 维;
    ■ 特点:不区分大小写,经过有监督修正,训练了7周;
    ■ 资源:测试代码、词向量 [链接]

    Ronan Collobert 和 Jason Weston 在 2008 年的 ICML 上发表的《A Unified Architecture for Natural Language Processing: Deep Neural Networks with Multitask Learning》里面首次介绍了他们提出的词向量的计算方法,他们还把论文所写的系统开源了,叫做 SENNA,3500 多行纯 C 代码也是写得非常清晰。C&W 这篇论文主要目的并不是在于生成一份好的词向量,甚至不想训练语言模型,而是要用这份词向量去完成 NLP 里面的各种任务,比如词性标注、命名实体识别、短语识别、语义角色标注等等。

    2. 【M&H 的 HLBL – 2007】
    Andriy Mnih 和 Geoffrey Hinton 在 2007 年和 2008 年各发表了一篇关于训练语言模型和词向量的文章。2007 年发表在 ICML 上的《Three new graphical models for statistical language modelling》表明了 Hinton 将 Deep Learning 战场扩展到 NLP 领域的决心。2008 年发表在 NIPS 上的《A scalable hierarchical distributed language model》则提出了一种层级的思想替换了 Bengio 2003 方法中最后隐藏层到输出层最花时间的矩阵乘法,在保证效果的基础上,同时也提升了速度。2008 年 NIPS 的这篇论文,介绍的是“hierarchical log-bilinear”模型,很多论文中都把它称作简称“HLBL”。

    3. 【Mikolov 的 RNNLM – 2010】
    ■ 训练语料及规模:Broadcast news;
    ■ 词向量:82390 词,80、640、1600 维;
    ■ 特点:不区分大小写;训练了若干天;
    ■ 资源:训练、测试代码、词向量 [链接]

    Bengio 2003 在论文里提到一句,可以使用一些方法降低参数个数,比如用循环神经网络。Mikolov 就抓住了这个坑,从此与循环神经网络结下了不解之缘。他最早用循环神经网络做语言模型是在 INTERSPEECH 2010 上发表的《Recurrent neural network based language model》里。Recurrent neural network 是循环神经网络,简称 RNN,还有个 Recursive neural networks 是递归神经网络(Richard Socher 借此发了一大堆论文),也简称 RNN。看到的时候需要注意区分一下。不过到目前为止,RNNLM 只表示循环神经网络做的语言模型,还没有歧义。
    在之后的几年中,Mikolov 在一直在RNNLM 上做各种改进,有速度上的,也有准确率上的。现在想了解 RNNLM,看他的博士论文《Statistical Language Models based on Neural Networks》肯定是最好的选择。

    4. 【Huang 的语义强化 – 2012】
    ■ 训练语料及规模:English Wikipedia;
    ■ 词向量:100232 词,50 维;
    ■ 特点:不区分大小写,最高频的6000词,每词有10种表示;
    ■ 资源:训练、测试代码、词向量 [链接]

    与前几位大牛的工作不同,Eric H. Huang 的工作是在 C&W 的基础上改进而成的,并非自成一派从头做起。他这篇发表在 ACL 2012 上的《Improving Word Representations via Global Context and Multiple Word Prototypes》试图通过对模型的改进,使得词向量富含更丰富的语义信息。他在文中提出了两个主要创新来完成这一目标:(其实从论文标题就能看出来)第一个创新是使用全文信息辅助已有的局部信息,第二个创新是使用多个词向量来表示多义词。
    Huang 认为 C&W 的工作只利用了“局部上下文(Local Context)”。C&W 在训练词向量的时候,只使用了上下文各 5 个词,算上自己总共有 11 个词的信息,这些局部的信息还不能充分挖掘出中间词的语义信息。Huang 直接使用 C&W 的网络结构计算出一个得分,作为“局部得分”。
    然后 Huang 提出了一个“全局信息”,这有点类似传统的词袋子模型。词袋子模型是把文章中所有词的 One-hot Representation 加起来,形成一个向量(就像把词全都扔进一个袋子里),用来表示文章。Huang 的全局模型是将文章中所有词的词向量求个加权平均(权重是词的 idf),作为文章的语义。他把文章的语义向量和当前词的词向量拼接起来,形成一个两倍长度的向量作为输入,之后还是用 C&W 的网络结构算出一个打分。
    有了 C&W 方法的得到的“局部得分”,再加上在 C&W 方法基础上改造得到的“全局得分”,Huang 直接把两个得分相加,作为最终得分。最终得分使用 C&W 提出的 pair-wise 目标函数来优化。
    加了这个全局信息有什么用处呢?Huang 在实验中发现,他的模型能更好地捕捉词的语义信息。比如 C&W 的模型中,与 markets 最相近的词为 firms、industries;而 Huang 的模型得到的结果是 market、firms。很明显,C&W 的方法由于只考虑了临近词的信息,最后的结果是词法特征最相近的词排在了前面(都是复数形式)。不过我觉得这个可能是英语才有的现象,中文没有词形变化,如果在中文中做同样的实验还不知道会有什么效果。
    Huang 论文的第二个贡献是将多义词用多个词向量来表示。Bengio 2003 在最后提过这是一个重要的问题,不过当时他还在想办法解决,现在 Huang 给出了一种思路。
    将每个词的上下文各 5 个词拿出来,对这 10 个词的词向量做加权平均(同样使用 idf 作为权重)。对所有得到的上下文向量做 k-means 聚类,根据聚类结果给每个词打上标签(不同类中的同一个词,当作不同的词处理),最后重新训练词向量。
    当然这个实验的效果也是很不错的,最后 star 的某一个表示最接近的词是 movie、film;另一个表示最接近的词是 galaxy、planet。

    5. 【Turian 对比试验 – 2010】
    优化C&W代码并重跑试验
    ■ 训练语料及规模:Reuters RCV1 63M 词;
    ■ 词向量:268810 词 25、50、100、200 维;
    ■ 特点:区分大小写,训练了若干周;
    ■ 资源:训练代码、词向量 [链接]

    由M帮忙重跑M&H
    ■ 训练语料及规模:Reuters RCV1;
    ■ 词向量:246122 词 50、100 维;
    ■ 特点:区分大小写,用GPU训练了7天;
    ■ 资源:训练代码、词向量 [链接]

    问题?主页上提供了 两份 词向量,一份是 scaled,一份是unscaled,scaled的作用是什么?这个Scale貌似是全局的,而非单个向量的。
    README.text中是这么解释的:
    embeddings-scaled.*.txt.gz
    Embeddings scaled by 0.1/stddev(embeddings), as described in the ACL 2010 paper.
    These are the embeddings you should use by default, if you just want word features.
    The first column is the word, the rest of the columns are the dimensions of the embedding.
    也就是说通过stddev进行了一个全局的样本标准偏差进行缩放;

    Turian 的工作前面只是提了一下,他在做 C&W 向量与 H&M 向量的对比实验时,自己按照论文重新实现了一遍他们的方法,并公布了词向量。后来 C&W 在主页上强调了一下:尽管很多论文把 Turian 实现的结果叫做 C&W 向量,但是与我发布的词向量是不同的,我这个在更大的语料上训练,还花了两个月时间呢!
    Turian 公布的 M&H 向量是直接请 Andriy Mnih 在 Turian 做好的语料上运行了一下 HLBL,所以没有代码公布。同时 Turian 自己实现了一份 LBL模型,但是没有公布训练出来的词向量。(这是根据他主页上描述推测的结果,从 Turian 的论文中看,他应该是实现了 HLBL 算法并且算出词向量的。)
    RCV1 的词数两篇文章中所写的数据差距较大,还不知道是什么原因。

    Turian 发表在 ACL 2010 上的实验对比了 C&W 向量与 M&H 向量用作辅助特征时的效果。在短语识别和命名实体识别两个任务中,C&W 向量的效果都有略微的优势。同时他也发现,如果将这两种向量融合起来,会有更好的效果。除了这两种词向量,Turian 还使用 Brown Cluster 作为辅助特征做了对比,效果最好的其实是 Brown Cluster,不过这个已经超出本文的范围了。

    【值得一读】:
    1. What are the continuous bag of words and skip-gram architectures
    2. Hierarchical Softmax & Negative Sampling
    3. word2vec 中的数学原理详解
    4. Deep Learning in NLP (一)词向量和语言模型:http://licstar.net/archives/328

    原文地址:http://ju.outofmemory.cn/entry/93431


    展开全文
  • word应用

    千次阅读 2014-02-21 14:28:05
    word骨灰级水平,赶紧留一份来源:武大之星的日志 1.问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉。文件――页面设置――版式――页眉和页脚―...
  • Word Embedding 简述

    千次阅读 2018-07-29 13:25:51
    ,global vectors 弥补了全局和局部(窗口类方法)的割裂性,本质仍然是统计模型分解,也是 简单模型计算词向量的典型算法 ,14年由Pennington提出,是一个统计强化版的skip-gram。  如何得到的GloVec的思路有点...
  • word精髓

    2012-05-18 21:42:57
    word骨灰级水平,赶紧留一份来源:武大之星的日志 1.问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉。文件――页面设置――版式――页眉和页脚――...
  • LSA和word2vec作为两大类方法的代表,一个是利用了全局特征的矩阵分解方法,一个是利用局部上下文的方法。GloVe 模型就是将这两中特征合并到一起的,即使用了语料库的全局统计(overall statistics)特征,也使用了...
  • word2vec使用说明

    千次阅读 2016-04-18 16:43:42
    Google的word2vec官网:https://code.google.com/p/word2vec/下载下来的Demo...word2vec – Revision 41: /trunk … LICENSE //Apache LICENSE README.txt //工具使用说明 compute-accuracy.c demo-analogy.sh //
  • shell中的替换

    2015-07-06 13:37:00
    shell中如果存在一些特殊的字符,就需要进行替换,可进行命令替换、变量替换、转义替换 1、转义字符的替换 shell中包含以下的转移字符 \a 响铃警报\\ 反斜杠 \b 退格(删除键) \f 换页(FF),将当前位置移到下页...
  • 推荐 Word、EXCEL必备工具箱

    千次阅读 2019-09-20 09:41:36
    2、批量工具→批量→批量文档查找替换,在勾选“强制替换”选项的情况下,如果目标单元格是合并单元格,对原来的处理方式进行了改进,增加了提示:“【是】强制取消合并单元格,并对该单元格进行替换;【否】对该...
  • word 技巧

    2008-11-17 22:39:00
    问:WORD里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。文件——页面设置——版式——页眉和页脚——首页不同问:请问word中怎样让每一章用不同的页眉?怎么我...
  • word2vec

    千次阅读 2018-06-25 14:21:51
    特别是自己对于word2vec的理解一直不到位,因为总是介绍含糊不清,刚没说两句呢,就转到它的两个常用模型了。前段时间搜索的相关信息并不能减少word2vec给我的神秘感。不过一直好奇会催使你不断搜索新的信息,从而...
  • 目前,词向量(又叫词嵌入word embedding)已经成为NLP领域各种任务的必备一步,而且随着bert elmo,gpt等预训练模型的发展,词向量演变为知识表示方法,但其本质思想不变。学习各种词向量训练原理可以很好地掌握NLP...
  • VIM 查找与替换

    2013-01-14 20:39:17
    /word 后回车,即可以查找word单词;n-向下查找下一个单词,N-向上查找下一个单词; ?word 是反向操作,n-向上查找下一个单词,N-向下查找下一个单词;   (3)使用 %可以从开始括号跳到对应的关闭括号。或者....
  • Word技巧_听雨轩

    千次阅读 2008-04-19 09:29:00
    Word技巧2008-04-15 12:08236491328 Word技巧 把文字替换成图片: 首先把图片复制到 剪贴板中,然后打开替换对话框,在“查找内容”框中输入将被替换的文字,接着在 “替换为”框中输入“^c”(注意:输入的一定...
  • word宏的使用——Selection对象

    万次阅读 2016-06-24 11:34:42
    Selection 对象'代表窗口或窗格中的当前所选内容。所选内容代表文档中选定(或突出显示)的区域,如果文档中... BoldRun'在当前局部添加粗体字符格式或删除该格式。  Calculate'计算选定内容中的数学表达式。返回的
  • vue中的过滤器 定义:对内容或数据进行过滤(二次处理)的一...种类:局部过滤器和全局过滤器 1、全局过滤器 (1)定义无参全局过滤器 <div id="app"> <p>{{ message | replaceStr}}</p> </di...
  • Linux-Shell 参数替换

    2013-12-13 16:26:09
    参数替换 处理和(或)扩展变量 ${parameter} 与$parameter相同, 也就是变量parameter的值. 在某些上下文中, ${parameter}很少会产生混淆. 可以把变量和字符串组合起来使用. 1 your_id=${USER}-on-...
  • 宏定义与宏替换

    千次阅读 2019-08-04 16:38:21
    替换就发生在预处理(也叫预编译)阶段,也就是说在编译之前(生成二进制文件之前)就已经完成了文本的替换工作。  关于预处理主要完成的工作是:  1.文件包含,将#include包含的文件找到,并在#include处进行...
  • 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Leskoveccourses学习笔记之 Locality-Sensitive Hashing(LSH) 局部敏感哈希 LSH第一部分。第二部分参考[海量数据挖掘MMDS week7: 局部敏感哈希...
  • 前言上一篇的专栏介绍了Word2Vec中的Skip-Gram模型的结构和训练,如果看过的小伙伴可以直接开始动手用TensorFlow实现自己的Word2Vec模型,本篇文章将利用TensorFlow来完成Skip-Gram模型。还不是很了解Skip-Gram思想...
  • JS利用正则配合replace替换指定字符

    万次阅读 2016-06-08 14:33:57
    replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。  语法  stringObject.replace(regexp,replacement)  参数 描述  regexp 必需。规定了要替换的模式的 ...
  • 【计算机基础】03-Word知识

    万次阅读 2020-05-09 13:41:13
    第3章 文字处理软件 Word 2010 3.1 初始Office 2010 Office 2010组件包括Word(文字处理软件)、Excel(电子表格软件)、PowerPoint(幻灯片制作软件)、Outlook(个人信息管理软件)、Access(关联式数据库管理...
  • Word Embeddings 学习笔记

    2019-08-13 09:52:53
    因为他们只保持局部的文本信息,无论是在左边还是右边,他们都必须像语言模型一样学习,试图根据上下文预测下一个标签。fwd和bwd辅助任务只朝着一个方向。未来和过去的任务分别在向前和向后的方向上向前迈进了一步。...
  • Word2vec简单整理

    万次阅读 2017-03-28 00:37:50
    参考:https://zhuanlan.zhihu.com/p/22477976 http://yobobobo001.github.io/2016/05/26/%E6%88%91%E6%89%80%E7%90%86%E8%A7%A3%E7%9A%84word2vec/ http://x-algo.cn/index.php/2016/03/12/281/#i https://www.zh
  • 超长文, 建议收藏之后慢慢观看~ 1Efficient Estimation of Word Representations ...由于成文较早, 本文使用的一些术语有一些不同于现在的叫法, 我都替换为了现在的叫法. CBOW 的架构如下所示. 与作者提到的 feedfo...
  • 1、问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?  答:分节,每节可以设置不同的页眉。文件——页面设置——版式——页眉和页脚——首页不同   2、问:请问Word中怎样让每一章用不同...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,532
精华内容 10,612
热门标签
关键字:

word局部替换