保持给定向量中存在的单词并删除其他单词

时间:2016-02-17 12:10:26

标签: python for-loop corpus term-document-matrix

我有一个说清单,10,000个字符串(A)。我也有一个单词矢量(V)。

我想要做的是修改A的每个字符串,只保留字符串中存在于V中的那些单词并删除其他单词。

例如,假设A的第一个元素是"one two three check test"。 V是向量["one", "test", "nine"]。因此,A的第一个元素的修改版本应该看起来像"one test"。对于每一串A,需要重复整个过程。对于每次比较,V将保持相同。

我正在做类似跟随的事情(这可能有一些错误,但我只是想知道我是如何处理这个问题的。)

for i in range(len(A)):

    a = []

    text = nltk.word_tokenize(A[i])

    for i in range(len(text)):
        if text[i] in V:
            a.append(text[i])

    a = " ".join(a)

    A['modified_string'][i] = a

以上方式非常缓慢且效率低下。我怎样才能快速有效地实现它?

4 个答案:

答案 0 :(得分:0)

单个A [0]项目

$ awk -F"[: ]+" '{for(i=1;i<NF;i+=2){$i+=20000; printf "%s:%s ",$i,$(i+1)} print ""}' cs.txt

20002:1 20003:1 20004:2 20005:1 20007:2 20034:1 20037:3 
20004:2 20006:1 20008:1 20023:1 20025:2 20030:1 

答案 1 :(得分:0)

这是我的尝试:

>>> A = ["aba reer sdasd bab", "adb bab ergekj aba erger"]
>>> V = ["aba","bab"]
>>> map((lambda z: ' '.join(z)), map((lambda x: filter(lambda y: y in V, x.split())), A))
['aba bab', 'bab aba']

复杂性非常糟糕,但要改进它你必须给我们更多的细节,比如V与A的元素相比有多长,你想要在选择之后将这些单词按原始顺序等等。它可以使用集合可以更快地完成,但单词将不是原始顺序。

答案 2 :(得分:0)

了解

A = ["one two three check test", "one nine six seven", "one two six seven"]  
A_modified = list()  
V = ["one", "test", "nine"] 
V_set = set(V)  
for line in A:  
    text = set(line.split()) # or use NLTK, here I just wanted something that runs on all installs  
    A_modified.append(list(text.intersection(V_set))) 

请注意line = list(text.intersection(V_set))因不变性而无效

修改

范围蔓延:-)您的原始问题不够具体,但如果您想保留订单以及非唯一元素,我会使用 list comprehension 执行此操作:

for line in A:  
    A_modified += [[word for word in line.split() if word in V]]

答案 3 :(得分:0)

集合似乎是适当的数据结构:

A = ["aba reer sdasd bab", "adb bab ergekj aba erger", "aba", "bab" ]
V = ["aba","bab"]

vset = set(V)
for i in A:
    print tuple(set(i.split()).intersection(vset))