1

私は、世界中で起こっている特定の危機や悲劇に関連するニュース記事を見つけるために、継続的に学習することに重点を置いた Web クローラーに取り組んでいます。私は現在、クロールが継続するにつれてデータモデルが一定に成長することを考慮して、データモデルをできるだけ無駄のない効率的なものにすることに取り組んでいます.

データモデルをリストに保存しています(クロールされているページとの TFIDF 比較を行うため) 。リストのサイズを小さくしたいのですが、リスト内の各アイテムの相対カウントを失わないようにしたいと考えています

これは、クロールされた 2 つの Web ページのサンプル モデルです。

[[u'remark', u'special', u'agent', u'richard', u'deslauri', u'press', u'investig', u'crime', u'terror', u'crime', u'inform', u'servic', u'inform', u'laboratori', u'servic', u'want', u'want', u'want', u'terror', u'crime', u'want', u'news', u'news', u'press', u'news', u'servic', u'crime', u'inform', u'servic', u'laboratori', u'servic', u'servic', u'crime', u'crime', u'crime', u'terror', u'boston', u'press', u'remark', u'special', u'agent', u'richard', u'deslauri', u'press', u'investig', u'remark', u'special', u'agent', u'richard', u'deslauri', u'press', u'investig', u'boston', u'special', u'agent', u'remark', u'richard', u'deslauri', u'boston', u'investig', u'time', u'time', u'investig', u'boston', u'terror', u'law', u'enforc', u'boston', u'polic', u'polic', u'alreadi', u'alreadi', u'law', u'enforc', u'around', u'evid', u'boston', u'polic', u'evid', u'laboratori', u'evid', u'laboratori', u'may', u'alreadi', u'laboratori', u'investig', u'boston', u'polic', u'law', u'enforc', u'investig', u'around', u'alreadi', u'around', u'investig', u'law', u'enforc', u'evid', u'may', u'time', u'may', u'may', u'investig', u'may', u'around', u'time', u'investig', u'investig', u'boston', u'boston', u'news', u'press', u'boston', u'want', u'boston', u'want', u'news', u'servic', u'inform'], [u'2011', u'request', u'inform', u'tamerlan', u'tsarnaev', u'foreign', u'govern', u'crime', u'crime', u'inform', u'servic', u'inform', u'servic', u'nation', u'want', u'ten', u'want', u'want', u'crime', u'want', u'news', u'news', u'press', u'releas', u'news', u'stori', u'servic', u'crime', u'inform', u'servic', u'servic', u'servic', u'crime', u'crime', u'crime', u'news', u'press', u'press', u'releas', u'2011', u'request', u'inform', u'tamerlan', u'tsarnaev', u'foreign', u'govern', u'2011', u'request', u'inform', u'tamerlan', u'tsarnaev', u'foreign', u'govern', u'2013', u'nation', u'press', u'tamerlan', u'tsarnaev', u'dzhokhar', u'tsarnaev', u'tamerlan', u'tsarnaev', u'dzhokhar', u'tsarnaev', u'dzhokhar', u'tsarnaev', u'tamerlan', u'tsarnaev', u'dzhokhar', u'tsarnaev', u'2011', u'foreign', u'govern', u'inform', u'tamerlan', u'tsarnaev', u'inform', u'2011', u'govern', u'inform', u'tamerlan', u'tsarnaev', u'foreign', u'foreign', u'govern', u'2011', u'inform', u'foreign', u'govern', u'nation', u'press', u'releas', u'crime', u'releas', u'ten', u'news', u'stori', u'2013', u'ten', u'news', u'stori', u'2013', u'ten', u'news', u'stori', u'2013', u'2011', u'request', u'inform', u'tamerlan', u'tsarnaev', u'foreign', u'govern', u'nation', u'press', u'releas', u'want', u'news', u'servic', u'inform', u'govern']]

単語のリストを維持し、カウントをリスト自体に埋め込まないようにしたい。私はリストから行きたいと思います:

[ボストン、ボストン、ボストン、爆撃、爆撃、ツァルナエフ、ツァルナエフ、時間] から [ボストン、ボストン、爆撃、ツァルナエフ]

基本的に、リスト [a,a,a,b,b,c] がある場合、[a,a,b] に減らしたいと思います。

編集:明確でなくて申し訳ありませんが、もう一度試します。セットいらない。重み付けされたリストであるため、出現回数は非常に重要です。そのため、「Boston」は「time」または他の同様の用語よりも多く表示される必要があります。私が達成しようとしているのは、モデルから重要でない用語を削除しながら、データ モデルを最小限に抑えることです。したがって、上記の例では、モデルに多くの「脂肪」を追加するため、意図的に C を省略しました。A は B より 1 回多く、C より 2 回多く出現するという相対性を維持したいのですが、C は元のモデルでは 1 回しか出現しないため、リーンモデルから削除されています。

4

4 に答える 4

3
from collections import defaultdict
d = defaultdict(int)
for w in words[0]:
    d[w] += 1
mmin = min(d[p] for p in d)

次に、各単語からこの mmin を差し引いて、新しいリストを作成できます。しかし、おそらくdictは十分にコンパクトです。順序を維持するには、辞書からの情報を使用して、最初の単語リストをフィルタリングするスマートな方法を考案できます。

たとえば、単語 list[a,a,a,b,b,c]の場合、辞書には と が含まれ{a:3, b:2, c:1}ますmmin=1。この情報を使用して、取得するすべての項目から 1 を減算することにより、よりスリムな辞書を作成できます。これは削除されるため{a:2, b:1}ですc0

完全なコード:

from collections import defaultdict
d = defaultdict(int)
words = ['a','a','a','b','b','c']
for w in words:
    d[w] += 1
mmin = min(d[p] for p in d)
slim=[]
for w in words:
    if d[w] > mmin:
        slim.append(w)
        d[w] -= 1
print slim
于 2013-05-14T21:54:18.697 に答える
2

サンプル モデルが変数topicsに割り当てられている場合、 を使用しcollections.Counterて、すべてのトピックとそのカウントの辞書のようなオブジェクトを維持できます。

from collections import Counter
topic_count = [Counter(topic) for topic in topics]
# [Counter({u'boston': 11, u'investig': 11, u'crime': 7, u'servic': 7, u'want': 6, u'press': 6, u'laboratori': 5, u'may': 5, u'news': 5, u'agent': 4, u'alreadi': 4, u'deslauri': 4, u'special': 4, u'richard': 4, u'polic': 4, u'terror': 4, u'around': 4, u'evid': 4, u'law': 4, u'remark': 4, u'inform': 4, u'enforc': 4, u'time': 4}),
#  Counter({u'tsarnaev': 13, u'inform': 12, u'govern': 9, u'tamerlan': 9, u'foreign': 8, u'news': 8, u'crime': 8, u'2011': 7, u'servic': 7, u'press': 6, u'releas': 5, u'want': 5, u'ten': 4, u'request': 4, u'stori': 4, u'nation': 4, u'2013': 4, u'dzhokhar': 4})]
于 2013-05-14T21:54:49.753 に答える
1

これは、(「削減」ではなく)「正規化」作業のように思えますが、それが正確な用語であるかどうかはわかりません。

collections.Counter本当にここで使いたいと思います。項目数の変更と結果の取得を非常に簡単にする便利なメソッドがいくつかあります。

リストから直接インスタンスを作成し、各項目の出現回数を数えることができます。Counter.most_common()頻度の高いものから低いものへとソートされたキー/カウントのペアのリストを与える. 次に、最小カウントは、そのリストの最後のタプルの 2 番目のフィールドです。

Counter.subtract()が要点です: 既存のインスタンスと同じキー要素を持つリストを渡すとCounter、新しいリストに表示される回数だけ各キーの数が減ります。このリストを作成するには、リスト内包表記を使用して、最も頻度の低いキーのカウントに等しい回数だけ各キーを取得します (そのカウントが特定のしきい値を超えている場合、最終結果にそのキーが 1 回出現する必要があるという要件に合わせて調整します)。鍵)。ネストされたリスト内包表記は、リストを平坦化する私のお気に入りの方法です。キーの繰り返しは、最初は独自のリストとして作成されます。

最後に、最初Counter.elements()のリストと同様のリストが表示されます。各キーは、そのカウントに等しい回数表示されます。

from collections import Counter

def normalize_list(L, threshold):
    cntr = Counter(L)
    least_count = cntr.most_common()[-1][1]
    if least_count > threshold:
        least_count -= 1
    cntr.subtract([item for k in cntr.keys() for item in [k] * least_count])
    return list(cntr.elements())

>>> a, b, c, d, e = 'abcde'
>>> normalize_list([a, a, a, a, a, b, b, b, b, c, c, c, d, d], 10)
['a', 'a', 'a', 'c', 'b', 'b']

>>> normalize_list(your_list, 6)
[u'laboratori', u'releas', u'want', u'want', u'want', u'want', u'want', u'want', u'want', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'crime', u'boston', u'boston', u'boston', u'boston', u'boston', u'boston', u'boston', u'2011', u'2011', u'2011', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'tsarnaev', u'investig', u'investig', u'investig', u'investig', u'investig', u'investig', u'investig', u'may', u'govern', u'govern', u'govern', u'govern', u'govern', u'press', u'press', u'press', u'press', u'press', u'press', u'press', u'press', u'news', u'news', u'news', u'news', u'news', u'news', u'news', u'news', u'news', u'tamerlan', u'tamerlan', u'tamerlan', u'tamerlan', u'tamerlan', u'servic', u'servic', u'servic', u'servic', u'servic', u'servic', u'servic', u'servic', u'servic', u'servic', u'foreign', u'foreign', u'foreign', u'foreign', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform', u'inform']

もちろん、これは元のリストの順序を保持しません。

于 2013-05-15T03:43:54.057 に答える