中文词性标注学习笔记(一)---词性标注概念

词性标注(一)

前言

词性标注也被称为语法标注或词类消疑,是语料库语言学中将语料库内单词的词性按其含义和上下文内容进行标记的文本数据处理技术。
词性标注可以由人工或特定算法完成,使用机器学习方法实现词性标注是自然语言处理的研究内容。常见的词性标注算法包括隐马尔可夫模型、条件随机场等。
词性标注主要被应用于文本挖掘和NLP领域,是各类基于文本的机器学习任务,例如语义分析和指代消解的预处理步骤。

隐马尔可夫模型

隐马尔可夫模型(Hidden Markov Model,HMM)作为一种统计分析模型,创立于20世纪70年代。80年代得到了传播和发展,成为信号处理的一个重要方向,现已成功地用于语音识别,行为识别,文字识别以及故障诊断等领域。

隐马尔可夫模型
通俗的理解隐马尔可夫模型(摘抄自知乎)
还是用最经典的例子,掷骰子。假设我手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

隐马尔可夫模型
设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4这串数字叫做可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8一般来说,HMM中说到的马尔可夫链其实是指隐含状态链,因为隐含状态(骰子)之间存在转换概率(transition probability)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

隐马尔可夫模型示意图

隐含状态转换示意图
训练方法
马尔可夫模型的隐状态是词性,显状态是单词。

相关学习连接

https://www.bilibili.com/video/av27557638/?p=25
http://www.hankcs.com/nlp/part-of-speech-tagging.html
https://www.zhihu.com/question/20962240
https://baike.baidu.com/item/词性标注

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现中文分词和词性标注可以使用jieba和pynlpir这两个库,而TF-IDF的实现可以使用sklearn库。以下是Python代码实现: ```python import jieba import jieba.posseg as pseg import pynlpir from sklearn.feature_extraction.text import TfidfVectorizer # 分词和词性标注 def segment(text): # 使用jieba分词 words = jieba.cut(text) # 使用pseg标注词性 words_with_pos = pseg.cut(text) return [(word, flag) for word, flag in words_with_pos] # 初始化pynlpir pynlpir.open() # 分词和词性标注 def segment(text): # 使用pynlpir分词 words = pynlpir.segment(text) # 使用pynlpir标注词性 words_with_pos = pynlpir.postag(words) return [(word, flag) for word, flag in words_with_pos] # 计算TF-IDF def tfidf(texts): # 初始化TfidfVectorizer vectorizer = TfidfVectorizer() # 计算TF-IDF矩阵 tfidf_matrix = vectorizer.fit_transform(texts) # 获取关键词列表 feature_names = vectorizer.get_feature_names() # 遍历每个文本 for i in range(len(texts)): # 获取该文本的TF-IDF矩阵 tfidf_vector = tfidf_matrix[i] # 将该文本的关键词按照TF-IDF值从大到小排序 sorted_indices = tfidf_vector.toarray()[0].argsort()[::-1] # 获取该文本的前10个关键词 top_10 = [feature_names[j] for j in sorted_indices[:10]] print("Top 10 keywords in text ", i+1, ": ", top_10) # 测试代码 text1 = "这是一段测试文本,用于测试分词和词性标注。" text2 = "这是另外一段测试文本,用于测试TF-IDF关键词提取。" texts = [text1, text2] for text in texts: print(segment(text)) tfidf(texts) ``` 注意,使用pynlpir需要先安装pynlpir库,并且需要下载pynlpir所需的数据包。可以使用以下代码进行安装和下载: ```python import pynlpir # 安装pynlpir pynlpir.open() # 下载所需的数据包 pynlpir.nlpir.update() ``` 另外,TF-IDF的计算需要将文本转换为向量表示,因此需要使用TfidfVectorizer类。在调用fit_transform方法计算TF-IDF矩阵之前,需要先使用get_feature_names方法获取所有的关键词。最后,可以使用argsort方法对TF-IDF值进行排序,并获取前10个关键词。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值