可是伸缩的textview

by admin on 2018年12月16日

本文介绍
Stanford《From Languages to Information》课程中说话到的 单词拼写错误
纠正。背后的数学原理首假若贝叶斯公式。单词拼写错误纠正紧要干到一定量个模型:一个是Nosiy
Channel模型,它是贝叶斯公式中之似然函数;另一个模子是Language
Model,它是贝叶斯公式中之先验概率。

于Android原生的TextView的底子及,可减弱/扩张的TextView:PhilExpandableTextView。
心想事成原理:主题是控制TextView的max
lines。在TextView的先河化阶段只是从未绘制出View的时刻,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常展现得出示的总集团多次,但特让TextView设置极端可怜运行的行数(小于总行多次),从而造成TextView的减少摘要效果,当用户通过按钮或另艺术扩充时候,把TextView的极端大行数设置也常规显示了的行数+1(+1凡是维持余量,避免不足)。

 

public class MainActivity extends Activity {
    private String str = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (int i = 0; i < 200; i++) {
            str = str + i + "  ";
        }
        final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
        etv.setText(str);

        Button btn = (Button) findViewById(R.id.btn);

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                boolean b = etv.getExpandablestatus();

                b = !b;
                etv.setExpandable(b);

            }
        });

    }

}

一致,问题讲述

PhilExpandableTextView.java:

在这句话被“.
. . was called a “stellar and versatile acress whose combination of sass and
glamour has defined her. . .”,有一个破绽百出的光词:acress 

package com.ganchuanpu.ExpandableTextView;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableTextView extends TextView {

    // 最大行,默认显示3行
    private final int MAX = 3;
    // 完全展开需要的行数
    private int lines;

    private ExpandableTextView mExpandableTextView;

    private boolean expandablestatus = false;

    // 构造方法用两个参数的
    public ExpandableTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mExpandableTextView = this;
        init();

    }

    private void init() {
        // 在view绘制之前的时候执行,在onDraw之前
        ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
        mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {

            @Override
            public boolean onPreDraw() {
                // 避免重复监听
                mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
                // 获得内容行数
                lines = getLineCount();

                return true;
            }
        });
        setExpandable(false);

    }
    // 是否展开或者收缩,
    // true,展开;
    // false,不展开

    public void setExpandable(boolean isExpand) {
        if (isExpand) {
            setMaxLines(lines + 1);
        } else
            setMaxLines(MAX);

        expandablestatus = isExpand;
    }

    public boolean getExpandablestatus() {
        return expandablestatus;
    }

}

此似是而非单词
acress 对应之 正确单词是何人吧?是 actress? 仍旧cress?仍然caress?……

哲学原理 1

 

 

仲,出现单词拼写错误的景色

平等种是
Non-word spelling errors,它是依靠:错误的只是词 不在
于词典中。也即便说,你键盘输入了一个单词,而以此单词向没被英文词典收录,在字典中查看无顶。比如你拿
正确的独词graffe,多起了一个字符 i ,变成了 giraffe,而
英文字典中常有没有 giraffe这一个单词。

此外一样栽是
real-word errors,比如:想输入 there
are,结果输入成了 three
are。而不当就词 three 是有叫字典中的,关键问题是:怎么亮将
three 改化 there 呢?

 

老三,单词拼写错误的正步骤

①首先检测出
是孰单词暴发了拼写错误。

就得经查字典来落实,比如依次扫描每个单词,若该单词不以词典中(未为词典收录),则当它们是一个拼写错误的单词。显明,词典越老,词典收录的仅仅词越多,大家便越来越能够是检测出荒谬的单词。

②帮助,是如起同组候选的
正确单词遭,选取一个“最可靠”的单词,而此“最确切”的单词,就是使摸的结果(错误单词
对应之 正确单词)。 

此地有个问题就是是:怎么样寻找有同样组候选的没错单词也?这尽管用依据实际情状开展辨析了。以点提到的不当单词
acress 为条例:

哲学原理,自然想输入“across”,可是一不小心将
‘o’,输入成了’e’,结果成了 “acress”, 这是substition 操作:将 ‘o’
替换成了 ‘e’

自然想输入
“actress”,可是打字太抢,漏打了
‘t’,结果变成了”acress”,这是deletion操作:删除了 ‘t’

…..

或说:键盘上字符’m’
和 ‘n’ 很贴近,打字时,很易用 ‘m’替换成了’n’;又或说:’m’ 和
‘n’发音相似,也导致平日以 ‘m’ 替换成 ‘n’ 

一旦寻相同组候选单词,就能够经过“编辑距离算法”来兑现。关于编制距离,可参考“Damerau-Levenshtein
Edit
Distance”或者:最好缺编辑距离算法实现

 

季,贝叶斯估摸纠正 单词拼写错误

①Noisy
Channel Model

Noisy
Channel Model的示意图如下:

哲学原理 2

本来的一个不易的只有词:经过
noisy channel ,结果成了一个 noisy word。而此noisy
channel,其实尽管是前边说的“两独词发音相近,容易拼错它们”,或者”五个字符在键盘上附近,输入时即使会师错地用一个词
输入成了(type) 另一个歌词。(其实niosy
channel就是本着具体世界是的题目标一个建模)

只要若想得出错误单词(noisy
word) 对应的 正确单词,就待由此到贝叶斯揣测。具体原理如下:

既是
noisy word (或者说错误单词,记否 x
)已经面世了,那么大家在词典中搜索一个单词w,在 x 已经冒出的基准下,最有或是由于 哪个单词w 造成的?

We see an observation x (a misspelled
word) and our job is to find the word w that generated this misspelled
word
Out of all possible words in the
vocabulary V we want to find the
word w such that P(w|x) is highest. We use
the hat notation ˆ to mean “our estimate
of the correct word”.

 

所以公式(1)表示如下:

哲学原理 3(公式1)

V是词典(Vocabulary),p(w|x)表示:从V中选出一个w,总结概率
P(w|x),概率最丰裕之不胜 w,就是 错误单词x
对应的不利单词,将拖欠是单词记否: wˆ

 根据贝叶斯公式法则(公式2):

哲学原理 4

用公式(1)变成如下模式:

哲学原理 5(公式3)

 

由公式3
可以看到:就是对于 词典V 中之每个单词w,总计 [p(x|w)*p(w)]/p(x),找出
计结果最酷(概率最酷) 的深 w,该 w 就是最为优解 wˆ 

倘于那多少个匡过程中,可以无欲总括分母p(x),因为当时不影响我们找有 概率最丰裕之慌 w 。因而拿 p(x)
视为一个常量值。(这里关于贝叶斯的明,可参考前面给来底参考文献)

乃我们的公式就变成了:

哲学原理 6(公式4)

可看看,公式4
由简单有组成,一部分凡是 p(x|w),我们叫 channel model 或者 称为 error
model,它就是似然函数

别一样部分是
p(w) 大家誉为先验概率(prior)。

另外,值得一提的凡此Vocabulary
V,由于Vocabulary中就词个数是累累底,只有在发出某种”条件“的景下,一个单词才会让无意识拼写成了另外一个单词。换句话说,Vocabulary中之少数词与错就词
x 之间是”八竿子打不正“的涉及,由此我们只有以某些Candidate words 中 寻找
[p(x|w)*p(w)] 的那个 w

一经这多少个Candidate words
就是出于前提到的”编辑距离算法“生成。由此,公式可连续成为(注意 argmax
的下标的变通。V变成了C,而C就是 Candidate words的会晤)

哲学原理 7

故而,现在之题目化了:如何告来channel
model 和 prior呢?

第一介绍下先验概率p(w)的求解(Prior)

我们应用
unigram language model 来当 p(w)。这里解释一下 unigram language
model:

挑一个语料库(词库),这一个语料库中一共有
404253213单单词,然后”编辑距离“算法 依据 错误的单词 acress
生成了千篇一律层层之候选词(Candidate
words),每一个候选词在语料库中出现的次数count(candidate word)
除以 404253213 就是每个Candidate
word的先验概率。如下图所示,第一列是张冠李戴单词acress的
候选词,第二排列是这么些候选词在语料库中冒出的次数,第三列是这么些候选词在语料库中出现的概率(频率)

哲学原理 8

For this example let’s start in the following table by assuming a unigram language model. We computed the language model from the
404,253,213 words in the Corpus of Contemporary English (COCA).

 

属下是求解
channel model

私家了解就是是:求解channel
model需要使用经常生活中因故到之知更,或者行业利用被累积下来的数码(经验)。

打公式:p(x|w)领会上来拘禁,给得一个科学的候选单词
w 的尺度下,导致错误单词x 的概率有差不多相当?

使我们收集了足多的多寡,比如观了累累用户一起输入了(打字)1万软
w,其中有10浅 输入成了x(打字打成了 x),那么 p(x|w)=0.0001

我们考虑四种植出错意况:

哲学原理 9

del[x,y]
表示,输入 xy 时,少打了字符 ‘y’,结果变成了
x,那么最后拿到的单词是一个谬误的单词,记录下这种情景下错的总次数
count(xy typed as x)

trans[x,y]意味着,输入
xy 时,输入反了,变成了
yx,那么最后得到的单词是一个荒唐的单词,记录下这种情景下错的终究次数
count(xy typed as yx)

拿那多少个多少总结起来,放在一个表里面,这些表称为:confusion
matrix

比如斯网站(Corpora
of misspellings for
download)
虽来一样多重之”错误就词的总括数据“。

哲学原理 10(”错误单词”
示意图)

 

这根据confusion matrix,就会总结 似然函数的概率了(也就会求解 channel model
了)

哲学原理 11

解释一下
if transposition意况:

count[wi
wi+1]表示:含有 wi wi+1
字符的持有单词w 的个数;trans[wi ,wi+1 ]
表示,将 wi 与 wi+1
交流的次数。(将wi 与 wi+1 
互换后,就成为了一个左的仅仅词了)

另一样种植总结confusion matrix 的主意是 EM算法,这么些自家呢不曾学,不领会,就隐瞒了。

对于错误的单词
acress,依据上面的7只候选单词总结出来的似然概率如下图:

哲学原理 12

落得图被,第一执行代表,其中一个毋庸置疑的候选单词是
actress,正确的单词是 t,由于某种原因(键盘输入太快了,漏打了t,本来是输入ct
的,结果输入成了c ),总括到之这种情况出现的几率是0.000117
这种由,其实就是是一个deleteion操作而招致的谬误。

今算起了
似然概率,也算算出了先验概率,二者相乘:p(x|w)*p(w),就查获了天经地义的候选单词
actress 由于deletion 操作造成 拿到错误单词 acress
的几率是 0.000117

同理,总结另外的候选单词
cress、caress、access……的
p(x|w)*p(w)概率,相比较一下,哪个概率最特别,从达图中观望:across
对应之几率最要命,也尽管是说:应该用 acress 纠正吧:across 

 

但,事实上,从句子”“的意来拘禁,acress
应该纠正吧 actress 更为客观。那上假如之channel model
为啥没有被有是的正结果吧?

重在原因是:先验概率是由于 unigram language model
得起之,假诺下 bigram language
model,那么即便可知科学地查找来”actress“,从而以acress纠正吧actress

下是应用Contemporary American
English语料库练习取得的第二第一位Language Model。对于只有词w:actress 和
across,它给闹的先验概率p(w)如下:

哲学原理 13

哲学原理 14

 

actress对应之先验概率:p(actress)=p(“versatile
actress whose”)=0.000021*0.0010

across对应之先验概率:p(across)=1*10-10

然,再将先验概率和似然概率相乘,就可知得到不错的单词应该是”actress“,而非是”across“了。

 

参照著作:

Natural
Language Corpus Data: Beautiful Data

Corpora of misspellings for
download

 

亮贝叶斯公式的平雨后春笋作品或者 推荐《A first course in machine learning 》这仍开

机器上着之贝叶斯方法—先验概率、似然函数、后验概率的晓以及怎么着采用贝叶斯进行模型预测(1)

机器上中的贝叶斯方法—先验概率、似然函数、后验概率的知情与怎样以贝叶斯举办模型预测(2)

使最老似然法来求解线性模型(2)-为何是最大化似然函数?

拔取最特别似然法来求解线性模型(3)-求解似然函数

利用最可怜似然法来求解线性模型(4)-最大化似然函数背后的数学原理

 

 NLP里面的一些基本概念

 

原文:http://www.cnblogs.com/hapjin/p/8012069.html

发表评论

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

网站地图xml地图