05. n-gram
リストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.
###Go
package main
import (
"fmt"
"strings"
)
// 文字単位の bi-gram
func ch_bi_gram(src string) []string {
var res []string
// 文字数ループ(1文字少なく)
for i:=0 ; i<(len(src)-1);i++ {
// 添字の文字と次の文字を連結
res = append(res, string(src[i]) + string(src[i+1]))
}
return res
}
// 単語単位の bi-gram
func wd_bi_gram(src string) []string {
var res []string
// 単語単位で文字列を分割
words := strings.Split(src, " ")
// 単語数ループ(1配列少なく)
for i:=0 ; i<(len(words)-1);i++ {
// 空白で単語を区切ったため、空白を追加し単語を連結
res = append(res, words[i] + " " + words[i+1])
}
return res
}
func main() {
src := "I am an NLPer"
// 文字単位の bi-gram
res1 := ch_bi_gram(src)
fmt.Printf("%q\n",res1)
// 単語単位の bi-gram
res2 := wd_bi_gram(src)
fmt.Printf("%q\n",res2)
}
###python
# -*- coding: utf-8 -*-
# 文字単位の bi-gram
def ch_bi_gram(src):
res = list(range(0))
# 文字数ループ(1文字少なく)
for i in range(len(src)-1):
# 添字の文字と次の文字を連結
res.append(src[i] + src[i+1])
return res
# 単語単位の bi-gram
def wd_bi_gram(src):
res = list(range(0))
# 単語単位で文字列を分割
words = src.split(" ")
# 単語数ループ(1配列少なく)
for i in range(len(words)-1):
# 空白で単語を区切ったため、空白を追加し単語を連結
res.append(words[i] + " " + words[i+1])
return res
src = "I am an NLPer"
# 文字単位の bi-gram
res = ch_bi_gram(src)
print res
# 単語単位の bi-gram
res = wd_bi_gram(src)
print res
###Javascript
// 文字単位の bi-gram
function ch_bi_gram(src) {
var res = [];
// 文字数ループ(1文字少なく)
for (var i = 0; i < (src.length-1); i++) {
// 添字の文字と次の文字を連結
res.push(src[i] + src[i+1]);
}
return res;
}
// 単語単位の bi-gram
function wd_bi_gram(src) {
var res = [];
// 単語単位で文字列を分割
var words = src.split(' ');
// 単語数ループ(1配列少なく)
for (var i=0;i<(words.length-1);i++) {
// 空白で単語を区切ったため、空白を追加し単語を連結
res.push(words[i] + " " + words[i+1]);
}
return res;
}
var src = "I am an NLPer"
// 文字単位の bi-gram
var chr = ch_bi_gram(src);
console.log(chr);
// 単語単位の bi-gram
var wd = wd_bi_gram(src);
console.log(wd);
まとめ
次の「05. n-gram」 は他の方の解説を読むが難しい。
[n番煎じ] 言語処理100本ノック 2015 第1章 with Python に結果が載ってた。
文字列(入力): I am an NLPer
文字バイグラム: ['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
単語バイグラム: ['I am', 'am an', 'an NLPer']
解りやすい。文章解読能力が無いことを痛感。
気になってる点。文章を空白で分割したがその空白を後で結合している部分。
これでいいのかなぁ。なんかカッコよくない気がする。