LoginSignup
1
1

More than 3 years have passed since last update.

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']

解りやすい。文章解読能力が無いことを痛感。

気になってる点。文章を空白で分割したがその空白を後で結合している部分。
これでいいのかなぁ。なんかカッコよくない気がする。

トップ

1
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1