31

私は文のリストを持っています:

text = ['cant railway station','citadel hotel',' police stn']. 

バイグラムのペアを形成し、それらを変数に格納する必要があります。問題は、これを行うと、単語ではなく文のペアが得られることです。これが私がしたことです:

text2 = [[word for word in line.split()] for line in text]
bigrams = nltk.bigrams(text2)
print(bigrams)

利回り

[(['cant', 'railway', 'station'], ['citadel', 'hotel']), (['citadel', 'hotel'], ['police', 'stn'])

鉄道駅とシタデル ホテルが 1 つのバイグラムを形成することはできません。私が欲しいのは

[([cant],[railway]),([railway],[station]),([citadel,hotel]), and so on...

最初の文の最後の単語は、2 番目の文の最初の単語と結合してはなりません。機能させるにはどうすればよいですか?

4

10 に答える 10

52

リスト内包表記zipを使用する:

>>> text = ["this is a sentence", "so is this one"]
>>> bigrams = [b for l in text for b in zip(l.split(" ")[:-1], l.split(" ")[1:])]
>>> print(bigrams)
[('this', 'is'), ('is', 'a'), ('a', 'sentence'), ('so', 'is'), ('is', 'this'), ('this',     
'one')]
于 2014-02-18T05:04:29.833 に答える
8

テキストを文字列のリストに変換するのではなく、各文を文字列として個別に開始します。句読点とストップワードも削除しました。関係ない場合は、これらの部分を削除してください。

import nltk
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
from nltk.tokenize import WordPunctTokenizer
from nltk.collocations import BigramCollocationFinder
from nltk.metrics import BigramAssocMeasures

def get_bigrams(myString):
    tokenizer = WordPunctTokenizer()
    tokens = tokenizer.tokenize(myString)
    stemmer = PorterStemmer()
    bigram_finder = BigramCollocationFinder.from_words(tokens)
    bigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 500)

    for bigram_tuple in bigrams:
        x = "%s %s" % bigram_tuple
        tokens.append(x)

    result = [' '.join([stemmer.stem(w).lower() for w in x.split()]) for x in tokens if x.lower() not in stopwords.words('english') and len(x) > 8]
    return result

それを使用するには、次のようにします。

for line in sentence:
    features = get_bigrams(line)
    # train set here

これはもう少し進んで、実際にバイグラムを統計的にスコア付けすることに注意してください (これは、モデルのトレーニングに役立ちます)。

于 2014-02-18T04:55:32.890 に答える
3
>>> text = ['cant railway station','citadel hotel',' police stn']
>>> bigrams = [(ele, tex.split()[i+1]) for tex in text  for i,ele in enumerate(tex.split()) if i < len(tex.split())-1]
>>> bigrams
[('cant', 'railway'), ('railway', 'station'), ('citadel', 'hotel'), ('police', 'stn')]

列挙関数と分割関数を使用します。

于 2014-02-18T06:21:45.410 に答える
1

ダンのコードを修正するだけです:

def get_bigrams(myString):
    tokenizer = WordPunctTokenizer()
    tokens = tokenizer.tokenize(myString)
    stemmer = PorterStemmer()
    bigram_finder = BigramCollocationFinder.from_words(tokens)
    bigrams = bigram_finder.nbest(BigramAssocMeasures.chi_sq, 500)

    for bigram_tuple in bigrams:
        x = "%s %s" % bigram_tuple
        tokens.append(x)

    result = [' '.join([stemmer.stem(w).lower() for w in x.split()]) for x in tokens if x.lower() not in stopwords.words('english') and len(x) > 8]
    return result
于 2016-10-02T20:34:01.187 に答える