在自然語言處理中,我們經常需要用到n元語法模型。
其中,有關中文分詞的一些概念是我們需要掌握的,譬如:
unigram 一元分詞,把句子分成乙個乙個的漢字
bigram 二元分詞,把句子從頭到尾每兩個字組成乙個詞語
trigram 三元分詞,把句子從頭到尾每三個字組成乙個詞語.
我們來簡單的做個練習:
輸入的是斷好詞的文字,每個句子一行。
統計詞unigram和bigram的頻次,並將它們分別輸出到`data.uni`和`data.bi`兩個檔案中。
[python]view plain
copy
#!/usr/bin/env python
class
ngram(object):
def__init__(
self
, n):
# n is the order of n-gram language model
self
.n = n
self
.unigram = {}
self
.bigram = {}
# scan a sentence, extract the ngram and update their
# frequence.
## @param sentence list
# @return none
defscan(
self
, sentence):
# file your code here
forline
insentence:
self
.ngram(line.split())
#unigram
ifself
.n ==
1:
try:
fip = open("data.uni"
,"w"
) except
>> sys.stderr ,
"failed to open data.uni"
fori
inself
.unigram:
fip.write("%s %d\n"
% (i,
self
.unigram[i]))
ifself
.n ==
2:
try:
fip = open("data.bi"
,"w"
) except
>> sys.stderr ,
"failed to open data.bi"
fori
inself
.bigram:
fip.write("%s %d\n"
% (i,
self
.bigram[i]))
# caluclate the ngram of the words
## @param words list
# @return none
defngram(
self
, words):
# unigram
ifself
.n ==
1:
forword
inwords:
ifword
notin
self
.unigram:
self
.unigram[word] =
1else
: self
.unigram[word] =
self
.unigram[word] +
1# bigram
ifself
.n ==
2:
num = 0
stri = ''
fori
inwords:
num = num + 1
ifnum ==
2:
stri = stri + " "
stri = stri + i
ifnum ==
2:
ifstri
notin
self
.bigram:
self
.bigram[stri] =
1else
: self
.bigram[stri] =
self
.bigram[stri] +
1num = 0
stri = ''
if__name__==
"__main__"
: import
sys
try:
fip = open(sys.argv[1
],"r"
) except
>> sys.stderr,
"failed to open input file"
sentence =
forline
infip:
iflen(line.strip())!=
0:
uni = ngram(1
) bi = ngram(2
) uni.scan(sentence)
bi.scan(sentence)
關鍵詞和相關詞如何布局使用
布局常見的版塊和作用 降低頁面的重複度,為其他頁面吸引蜘蛛促收錄 為特定頁面提高權重,提高或穩定該頁面的排名 除了提高當前頁面相關性,也有更新機制的作用 文字塊優化要怎麼做 嵌入相關詞,越多越好,不要堆砌,尤其是首頁,提高頁面相關性,也是變相的提公升主詞密度 文字塊是企業站中很重要的一部分,通常首頁...
迷魂術和哭窮計
下棋,有時候不能過分的暴露實力,要不然棋全明了就不好下了。正確的作法是適當的時候露適當的棋。這個尺度看起來好像很能掌握。要做到這一點的基礎是有相當的判斷水平。只有判斷準確才能做到這一點判斷越準就做的越好。如面對是排長等小棋 方法一 用個小棋吃,這樣就可以使自己的小棋變大棋。要點 要走得快,裝作很有自...
IP TCP UDP ICMP校驗和的區別和計算
ip資料報的校驗和只檢驗ip資料報的首部。當傳送ip包時,需要計算ip報頭的校驗和 把校驗和字段置為0 對ip頭部中的每16bit進行二進位制求和 如果和的高16bit不為0,則將和的高16bit和低16bit反覆相加,直到和的高16bit為0,從而獲得乙個16bit的值 將該16bit的值取反,存...