Python 连接文本中的单个字符

Python 连接文本中的单个字符,python,scikit-learn,string-concatenation,Python,Scikit Learn,String Concatenation,我有一份公司名称的清单,其中有些有缩写。例: compNames = ['Costa Limited', 'D B M LTD'] 我需要使用以下方法将文本的名称转换为令牌计数矩阵。但这不会在dbm有限公司中为bdm输出列 count_vect = CountVectorizer(analyzer='word') count_vect.fit_transform(compNames).toarray() 连接文本中单个字符的最佳方式是什么 ex: 'D B M LTD' to 'DBM LT

我有一份公司名称的清单,其中有些有缩写。例:

compNames = ['Costa Limited', 'D B M LTD']
我需要使用以下方法将文本的名称转换为令牌计数矩阵。但这不会在
dbm有限公司中为
bdm
输出列

count_vect = CountVectorizer(analyzer='word')
count_vect.fit_transform(compNames).toarray()
连接文本中单个字符的最佳方式是什么

ex: 'D B M LTD' to 'DBM LTD'

很尴尬,但应该有用。它在LTD前面引入了一个额外的空格,然后用“D”替换“D”,用“B”替换“B”,依此类推。

这里有一个简短的函数,它将空白字符上的字符串拆分为一个列表,迭代列表,如果元素长度为1,则构建一个临时字符串,当遇到长度大于1的元素时,将临时字符串追加到新列表

import re

a = 'D B M LTD'

def single_concat(s):
    out = []
    tmp = ''
    for x in re.split(r'\s+', s):
        if len(x) == 1:
            tmp += x
        else:
            if tmp:
                out.append(tmp)
            out.append(x)
            tmp = ''
    return ' '.join(out)

single_concat(a)
# returns:
'DBM LTD'
打印DBM有限公司

import re
string = 'D B M LTD'
print re.sub(r"\+", r"", re.sub(r"\+(\w\B)", r" \1", re.sub(r"(\b\w) ", r"\1+", string)))

我使用+字符作为临时字符,假设字符串中没有+字符。如果有,请使用其他没有出现的方法。

看,没有
re

def mingle(s):
    """ SO: 49692941 """
    l = s.split()
    r = []
    t = []
    for e in l:
        if len(e) == 1:
            t.append(e)
        else:
            j = "".join(t)
            r.append( j )
            r.append( e )
            t = []

    return " ".join(r)

print( mingle('D B M LTD') )
印刷品

DBM LTD

我不明白决定是否连接的标准是什么。您如何决定将
D
B
M
连接到
DBM
,但
LTD
应保持分离。我的意思是,在这个具体的例子中,它可能在语义上很明显,但为了提出一个算法,需要有一个通用的标准,它将以所需的方式对所有输入工作…算法应该只连接单个字符(
bdm
),而不是单词(
LTD
)。对不起,我不知道你说的另一个节点是什么意思。我在这个列表中有数百万个公司名称,我需要将列表中每个公司名称中的单个字符连接在一起。这是我需要的一个通用标准。我认为任何单个字符(不在非空白旁边)都是有意义的。好吧,现在我明白了。你为什么说它“笨拙”?这似乎很有效。有缺点吗?一个bug:
re.sub(([^]),r“\1”,re.sub(([^]{2,})”,r“\1”,“ffdjk g”)
->
“ffdjkg”
@Shana因为它使用sub-twiceI,我认为你真的不需要
re
来进行
拆分()。。我只是在写完之后才注意到这一点:-)
def mingle(s):
    """ SO: 49692941 """
    l = s.split()
    r = []
    t = []
    for e in l:
        if len(e) == 1:
            t.append(e)
        else:
            j = "".join(t)
            r.append( j )
            r.append( e )
            t = []

    return " ".join(r)

print( mingle('D B M LTD') )
DBM LTD