我是熊猫和蟒蛇的新手。我想为我的数据集找到常用词。例如,我有公司列表[“Microsoft.com”,“微软”,“微软com”,“苹果”...]等我有大约1M的这类公司列表,我想计算它们之间的相关性,以找到与Microsoft.com,Microsoft,Microsoft等词语的相关性有共同的话语。
这就是我所做的,但速度很慢:
import hashlib
companies = pd.read_csv('/tmp/companies.csv', error_bad_lines=False)
unique_companies = companies.groupby(['company'])['company'].unique()
df = DataFrame()
for company in unique_companies:
df[hashlib.md5(company).hexdigest()] = [{'name': company[0], 'code': [ord(c) for c in company[0]]}]
rows = df.unstack()
for company in rows:
series1 = Series(company['code'])
for word in rows:
series2 = Series(word['code'])
if series1.corr(series2) > 0.8:
company['match'] = [word['name']]
有人可以指导我如何找到单词的矩阵相关性吗?
答案 0 :(得分:1)
我认为没有一个可以用于字符串的corr函数 - 只有数字。
如果你能以某种方式将你的单词压缩成有意义的数字值,保留" closeness"一个对另一个,你可能然后能够" corr"他们,但其他选项可用。
汉明距离是一种(基本)方法,但计算Levenshtein差异稍微好一些:http://en.wikipedia.org/wiki/Levenshtein_distance
这很棘手,但尝试这种方法的一种方法是构建一个m×n个单元格的矩阵。其中m是第一个wordlist中唯一字的数量,n是secornd wordlist中唯一字的数量 - 然后计算行/列标识符之间的Hamming或Levenshtein距离。
有python模块为你打包远程算法 - 例如https://pypi.python.org/pypi/python-Levenshtein/ 或者你可以写自己的,我认为打包的可能会更快,因为他们是C' ified。
因此,假设Levenshtein模块(我不知道,因为没有使用它)提供了一个生成数字分数的函数getLev (word1, word2)
,您应该能够从两个中提取内容来自来源1和2的单词表。如果您确保您的输入已经过滤了唯一性,并且可能按字母顺序排序,那也会有所帮助。
将它们输入矩阵生成函数。
在这里,我已经将numpy导入为np并使用该模块进行速度
def genLevenshteinMatrix(wordlist1, wordlist2):
x = len(wordlist1)
y = len(wordlist1)
l_matrix = np.zeros(( x, y))
for i in range( 0 , x ):
x_word = wordlist1[i]
for j in range ( 0 , y ):
y_word = wordlist[j]
l_matrix[i][j] = getLev ( x_word, y_word )
这样的东西应该允许你生成一个矩阵,用于存储哪些词最像其他词的度量。
创建完成后,您可以使用以下函数查询它:
def interrogate_Levenshtein_matrix (ndarray_x, wordlist1, wordlist2, float_threshold):
l = []
x = len(ndarray_x)
y = len(ndarray_x[0])
for i in range(0 , x ):
for j in range(0 , y ):
if ndarray_x[i][j] >= float_threshold:
l.append ([(wordlist1[i],wordlist2[j]),ndarray_x[i][j]])
return l
这将输出一个"关闭" (即具有较低的距离),如之前使用的Levenshtein函数所测量的,作为列表,包含两个相似单词的列表。
你可能需要以某种方式减少它,因为我认为你会两次得到所有相似的组合,即[' word',' work']作为一个回报价值,[' work',#39; word']。
在开发代码时,您可以交换不同的相关函数并尝试不同的阈值。