0

我有一个列表,比如 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

4 回答 4

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 的元素相比有多长,你是否希望单词在选择后保持原始顺序等。可以更快地完成使用集合,但单词不会按原始顺序排列。

于 2016-02-17T12:26:52.120 回答
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))由于不可变性,这将不起作用

编辑

范围蔓延:-)您最初的问题不够具体,但是如果您想保持顺序以及非唯一元素,我会使用列表理解来做到这一点:

for line in A:  
    A_modified += [[word for word in line.split() if word in V]]
于 2016-02-17T12:33:30.440 回答
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))
于 2016-02-18T17:08:38.310 回答
0

对于单个 A[0] 项目

' '.join(set(A[0].split(' ')).intersection(V))
于 2016-02-17T12:17:27.780 回答